反向代理
upstream
upstream模块用于定义上游服务的相关信息。
# 上下文 http
# 语法
upstream name {...}
# 示例
upstream tomcat {
......
}
指令
指令 | 含义 |
---|---|
upstream | 段名,以{开始,}结束,中间定义上游服务的URL |
server | 定义上游服务地址 |
zone | 定义共享内存,用于夸worker子进程 |
keepalive | 对上游服务启动长连接 |
keepalive_requests | 一个长连接最多请求个数 |
keepalive_timeout | 空闲情形下,一个长连接的超时时长 |
hash | 哈希负载均衡算法 |
ip_hash | 依据IP进行哈希计算的负载均衡算法 |
least_conn | 最少连接数负载均衡算法 |
least_time | 最短响应时间负载均衡算法 |
random | 随机负载均衡算法 |
upstream
# 上下文 http
# 语法
upstream name {...}
# 示例
upstream tomcat {
......
}
server
# 上下文 upstream
# 语法
server address [parameters];
parameters
可选参数 | 含义 |
---|---|
weight=number | 权重值,默认为1 |
max_conns=number | 上游服务器的最大并发连接数 |
fail_timeout=time | 服务器不可用的判定时间 |
max_fails=number | 服务器不可用的检查次数 |
backup | 备份服务器,仅当其它服务器都不可用时启用 |
down | 标记服务器长期不可用,离线维护 |
keepalive
限制每个worker子进程与上游服务器空闲长连接的最大数量。
# 上下文 upstream
# 语法
keepalive connnections;
#示例
keepalive 16;
keepalive_requests
单个长连接可以处理的最多HTTP请求个数。
# 上下文 upstream
# 语法
keepalive_requests number;
# 默认值
keepalive_requests 100;
keepalive_timeout
空闲长连接的最长保持时间。
# 上下文 upstream
# 语法
keepalive_timeout time;
# 默认值
keepalive_timeout 60s;
queue
商业Nginx的参数,表示所有上游服务器不可用时,请求会被放到队列中等待。
# 上下文 upstream
# 语法
queue number [timeout=time];
#示例
queue 100 timeout=30s;
示例
upstream back_end {
server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
keepalive 32;
keepalive_requests 50;
keepalive_timeout 30s;
}
server {
listen 80;
server_name localhost;
location /proxy {
proxy_pass http://back_end/proxy;
}
}
proxy_pass
由http_proxy模块提供(ngx_http_proxy_module)
# 上下文 location if limit_except
# 语法
proxy_pass URL;
# 示例
# URL必须以http或https开头
# URL中可以携带变量
# URL中是否带URI,会直接影响发往上游的请求的URL
proxy_pass http://127.0.0.1:8080
proxy_pass http://127.0.0.1:8080/proxy
带/
与不带/
用法区别
proxy_pass http://127.0.0.1:8080
proxy_pass http://127.0.0.1:8080/
# 不带反斜线
# 用户请求URL:/bbs/abc/test.html
# 请求到达Nginx的URL:/bbs/abc/test.html
# 请求到达上游应用服务器的URL:/bbs/abc/test.html
location /bbs/ {
proxy_pass http://127.0.0.1:8080
}
# 带反斜线
# 用户请求URL:/bbs/abc/test.html
# 请求到达Nginx的URL:/bbs/abc/test.html
# 请求到达上游应用服务器的URL:/abc/test.html
location /bbs/ {
proxy_pass http://127.0.0.1:8080/
}
总结
不带/
意味着Nginx不会修改用户URL,而是直接透传给上游的应用服务器
带/
意味这Nginx会修改用户URL,修改方法:将location后的URL从用户URL中删除
proxy_request_buffering
如果开启,会开辟一片缓冲区,接受完客户端发来的数据后一次性传递给上游服务器。适应场景是
- 吞吐量要求高
- 上游服务器并发处理能力低
如果是off,那么适用的场景是,Nginx接受处理,和传到上游服务器性能较优的时候,这样可以更及时的响应,减少Nginx磁盘I/O。
# 上下文 http server location
# 语法
proxy_request_buffering on | off;
# 默认值
proxy_request_buffering on;
client_body_buffer_size
缓冲区大小,一般会看请求头里的Content-Length
大小,如果小于,则存在内存中;如果大于会存入磁盘,一般是client_body_temp_pat
指定的目录。
# 上下文 http server location
# 语法
client_body_buffer_size size;
# 默认值
# 32位8k, 64位16k
client_body_buffer_size 8k | 16k;
client_max_body_size
决定Nginx可以处理请求体大小,一般会看请求头里的Content-Length
大小,超过一般会返回413
状态码。
# 上下文 http server location
# 语法
client_max_body_size size;
# 默认值
# 大于1M不处理,直接丢弃,尤其是上传文件的时候
client_max_body_size 1M
client_body_in_single_buffer
请求体尽量分配到内存中连续的空间上。
# 上下文 http server location
# 语法
client_body_in_single_buffer on | off;
# 默认值
client_body_in_single_buffer off;
client_body_temp_path
请求体大于client_body_buffer_size
后,存入磁盘的目录。
# 上下文 http server location
# 语法
client_body_temp_path path [level1] [level2] [level3];
# 默认值
# 一般是相对于Nginx部署的Nginx根目录
client_body_temp_path client_body_temp;
client_body_in_file_only
请求体直接存入磁盘的目录。
# 上下文 http server location
# 语法
# clean 请求完成后会删掉,on则不会删除
client_body_in_file_only on | clean | off;
# 默认值
# 一般是相对于Nginx部署的Nginx根目录
client_body_in_file_only off;
client_body_timeout
客户端和Nginx建立连接后,在超时时间内没有发送请求的话,会断开连接。
# 上下文 http server location
# 语法
# clean 请求完成后会删掉,on则不会删除
client_body_timeout time;
# 默认值
client_body_timeout 60s;
请求行修改指令
proxy_method
修改客户端的请求行方法,然后传给上游服务器。
# 上下文 http server location
# 语法
proxy_method method;
proxy_http_version
修改客户端的请求行协议,然后传给上游服务器。
# 上下文 http server location
# 语法
proxy_http_version 1.0 | 1.1;
# 默认值
# 1.0协议不支持keepalive,所以如果需要客户端与上游服务器保持长连接需要设置为1.1
proxy_http_version 1.0;
proxy_set_header
修改客户端的请求头,然后传给上游服务器。
# 上下文 http server location
# 语法
proxy_set_header field value;
# 默认值
# 1.0协议不支持keepalive,所以如果需要客户端与上游服务器保持长连接需要设置为1.1,同时将Connection on
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
proxy_pass_request_header
如果是on,客户端的请求头会原封不动传给上游服务器,off则相反,且只会禁止客户端传来的header,Nginx自身通过proxy_set_header
不起作用。
# 上下文 http server location
# 语法
proxy_pass_request_header on | off;
# 默认值
proxy_pass_request_header on;
proxy_set_body
修改客户端的请求体内容。
# 上下文 http server location
# 语法
proxy_set_body value;
proxy_pass_request_body
如果是on,客户端的请求体会原封不动传给上游服务器,off则相反,且只会禁止客户端传来的body,Nginx自身通过proxy_set_body
不起作用。
# 上下文 http server location
# 语法
proxy_pass_request_body on | off;
# 默认值
proxy_pass_request_body on;
长连接
# 客户端到Nginx,位于http段中,默认就有,即已经开启,如果设置为0则是关闭。
keepalive_timeout 65;
# Nginx到上游服务器,位于upstream段中
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;
proxy_connect_timeout
Nginx连接上游服务器的超时时间,即三次握手后一定时间内没有和上游服务器连接成功,则断开。
# 上下文 http server location
# 语法
proxy_connect_timeout time;
# 默认值
proxy_connect_timeout 60s;
proxy_socket_keepalive
打开TCP层长连接,TCP层长连接由内核提供。
# 上下文 http server location
# 语法
proxy_socket_keepalive on | off;
# 默认值
proxy_socket_keepalive off;
proxy_send_timeout
Nginx在一定时间内没有向上游服务器发送内容,则断开。
# 上下文 http server location
# 语法
proxy_connect_timeout time;
# 默认值
proxy_connect_timeout 60s;
proxy_ignore_client_bort
代理服务器Nginx是否主动放弃客户端主动断开连接的请求,如果开启则忽略已经发送给上游服务器的请求。
# 上下文 http server location
# 语法
proxy_ignore_client_bort on | off;
# 默认值
proxy_ignore_client_bort off;