#前言 今天遇到配置反向代理的问题,作文以记之。 #反向代理简介 反向代理(reverse proxy)是一个WEB服务器,它终结了客户端连接,并生成一个新的连接。新的连接代表客户端向上游服务器生成连接。上游服务器(upstream server)被定义为一个Nginx产生连接“打通”了客户端请求的服务器。Nginx在处理这个工程中,为了更好地响应客户端请求,该请求可以根据它的URI、客户机参数或者一些其他的逻辑进行拆分。通过代理服务器,请求的原始URL中的任何部分都能够以这种方式进行转换。
代理到上游服务器配置中,最重要的是proxy_pass指令。该指令有一个参数URL,请求将会被转换,带有URI部分的proxy_pass指令会使用该URI替代request_uri部分。例如:
location /uri {
proxy_pass http://localhost:8080/newuri;
}
## uri在请求传递到上游服务器时将会被替代为/newuri
**注意:**1、如果location定义了一个正则表达式,name在URI部分没有转换发生。2、如果在location内有rewrite改变了URI,那么Nginx使用这个URI处理请求,不再发生转换。
## URI /local将被直接传递到上游服务器,而不会转换为/foreign。
location ~^/local {
proxy_pass http://localhost:8080/foreign;
}
## URI传递到上游服务器将会是/index.php?page=<match>,这个match会是来自括号中捕获的参数,而不是/index
location / {
rewrite /(.*)$ /index.php?page=$1 break;
proxy_pass http://location:8080/index;
}
代理模块
指令 | 说明 |
---|---|
proxy_connect_timeout | Nginx从接受请求到连接至上游服务器的最长等待时间 |
proxy_cookie_domain | 替代从上游服务器来的Set-Cookie头的域domain;domain被替换为一个字符串、一个正则表达式或者引用的变量 |
proxy_cookie_path | 替代从上游服务器来的Set-Cookie头中的path;path被替换成一个字符串、一个正则表达式或者引用的变量 |
proxy_pass | 指定请求被传递到的上游服务器,格式为URL |
proxy_pass_header | 覆盖掉proxy_hide_header指令中设置的头信息 |
upstream模块
与proxy模块紧密搭配的是upstream模块。upstream指令将会启用一个新的配置区段,在该区段定义了一组上游服务器。这些服务器可以设置不同的权重(权重越高的服务器将会被Nginx传递越多的连接)。
指令 | 说明 |
---|---|
ip_hash | 通过IP地址的哈希值确保客户端均匀地连接所有服务器,键值基于C类地址 |
keepalive | 每一个worker进程缓存的到上游服务器的连接数。在使用Http连接时,proxy_http_version应该设置为1.1,且将proxy_set_header设置为Connection "" |
least_conn | 激活负载均衡算法,将请求发送到活跃连接数最少的那台服务器 |
server | 为upstream定义了一个服务器地址。有很多属性,例如:weight:权重,down:表示不再接受任何请求 |
示例如下:
##我们明确指定了Nginx要同上游的运行在本机8080端口的Apache保持32个连接。
upstream apache {
server 127.0.0.7:8080;
keepalive 32;
}
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://apache;
}
如果是一组服务器,则设定如下:
upstream memcaches {
least_conn; ## 负载均衡算法
server 10.86.42.234:10000;
server 10.86.42.234:10001;
keepalive 64;
}
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://memcaches;
}
反向代理高级话题
- 安全隔离
- 提供对隔离引用程序组件的可扩展
- 反向代理服务器的性能调优
(有时间再搞)