Skip to content

反向代理

upstream

upstream模块用于定义上游服务的相关信息。

sh
# 上下文 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

sh
# 上下文 http

# 语法
upstream name {...}

# 示例
upstream tomcat {
    ......
}

server

sh
# 上下文 upstream

# 语法
server address [parameters];
parameters
可选参数含义
weight=number权重值,默认为1
max_conns=number上游服务器的最大并发连接数
fail_timeout=time服务器不可用的判定时间
max_fails=number服务器不可用的检查次数
backup备份服务器,仅当其它服务器都不可用时启用
down标记服务器长期不可用,离线维护

keepalive

限制每个worker子进程与上游服务器空闲长连接的最大数量。

sh
# 上下文 upstream

# 语法
keepalive connnections;

#示例
keepalive 16;

keepalive_requests

单个长连接可以处理的最多HTTP请求个数。

sh
# 上下文 upstream

# 语法
keepalive_requests number;

# 默认值
keepalive_requests 100;

keepalive_timeout

空闲长连接的最长保持时间。

sh
# 上下文 upstream

# 语法
keepalive_timeout time;

# 默认值
keepalive_timeout 60s;

queue

商业Nginx的参数,表示所有上游服务器不可用时,请求会被放到队列中等待。

sh
# 上下文 upstream

# 语法
queue number [timeout=time];

#示例
queue 100 timeout=30s;

示例

sh
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)

sh
# 上下文 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

/与不带/用法区别

sh
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

如果开启,会开辟一片缓冲区,接受完客户端发来的数据后一次性传递给上游服务器。适应场景是

  1. 吞吐量要求高
  2. 上游服务器并发处理能力低

如果是off,那么适用的场景是,Nginx接受处理,和传到上游服务器性能较优的时候,这样可以更及时的响应,减少Nginx磁盘I/O。

sh
# 上下文 http server location

# 语法
proxy_request_buffering on | off;

# 默认值
proxy_request_buffering on;

client_body_buffer_size

缓冲区大小,一般会看请求头里的Content-Length大小,如果小于,则存在内存中;如果大于会存入磁盘,一般是client_body_temp_pat指定的目录。

sh
# 上下文 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状态码。

sh
# 上下文 http server location

# 语法
client_max_body_size size;

# 默认值
# 大于1M不处理,直接丢弃,尤其是上传文件的时候
client_max_body_size 1M

client_body_in_single_buffer

请求体尽量分配到内存中连续的空间上。

sh
# 上下文 http server location

# 语法
client_body_in_single_buffer on | off;

# 默认值
client_body_in_single_buffer off;

client_body_temp_path

请求体大于client_body_buffer_size后,存入磁盘的目录。

sh
# 上下文 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

请求体直接存入磁盘的目录。

sh
# 上下文 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建立连接后,在超时时间内没有发送请求的话,会断开连接。

sh
# 上下文 http server location

# 语法
# clean 请求完成后会删掉,on则不会删除
client_body_timeout time;

# 默认值
client_body_timeout 60s;

请求行修改指令

proxy_method

修改客户端的请求行方法,然后传给上游服务器。

sh
# 上下文 http server location

# 语法
proxy_method method;

proxy_http_version

修改客户端的请求行协议,然后传给上游服务器。

sh
# 上下文 http server location

# 语法
proxy_http_version 1.0 | 1.1;

# 默认值
# 1.0协议不支持keepalive,所以如果需要客户端与上游服务器保持长连接需要设置为1.1
proxy_http_version 1.0;

proxy_set_header

修改客户端的请求头,然后传给上游服务器。

sh
# 上下文 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不起作用。

sh
# 上下文 http server location

# 语法
proxy_pass_request_header on | off;

# 默认值
proxy_pass_request_header on;

proxy_set_body

修改客户端的请求体内容。

sh
# 上下文 http server location

# 语法
proxy_set_body value;

proxy_pass_request_body

如果是on,客户端的请求体会原封不动传给上游服务器,off则相反,且只会禁止客户端传来的body,Nginx自身通过proxy_set_body不起作用。

sh
# 上下文 http server location

# 语法
proxy_pass_request_body on | off;

# 默认值
proxy_pass_request_body on;

长连接

sh
# 客户端到Nginx,位于http段中,默认就有,即已经开启,如果设置为0则是关闭。
keepalive_timeout 65;

# Nginx到上游服务器,位于upstream段中
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;

proxy_connect_timeout

Nginx连接上游服务器的超时时间,即三次握手后一定时间内没有和上游服务器连接成功,则断开。

sh
# 上下文 http server location

# 语法
proxy_connect_timeout time;

# 默认值
proxy_connect_timeout 60s;

proxy_socket_keepalive

打开TCP层长连接,TCP层长连接由内核提供。

sh
# 上下文 http server location

# 语法
proxy_socket_keepalive on | off;

# 默认值
proxy_socket_keepalive off;

proxy_send_timeout

Nginx在一定时间内没有向上游服务器发送内容,则断开。

sh
# 上下文 http server location

# 语法
proxy_connect_timeout time;

# 默认值
proxy_connect_timeout 60s;

proxy_ignore_client_bort

代理服务器Nginx是否主动放弃客户端主动断开连接的请求,如果开启则忽略已经发送给上游服务器的请求。

sh
# 上下文 http server location

# 语法
proxy_ignore_client_bort on | off;

# 默认值
proxy_ignore_client_bort off;