登录后台

页面导航

本文编写于 828 天前,最后修改于 828 天前,其中某些信息可能已经过时。

示例

header部分是必加的

server{
        listen 80;
        server_name jsocn.com;
        
        location / {
                proxy_pass http://10.0.0.7; # 将http请求代理传送到10.0.0.7
                proxy_http_version 1.1; #http协议设置为1.1
             
                proxy_connect_timeout 120s; #代理服务器向后端请求http时,超时时间设置为120秒,默认60秒
                proxy_read_timeout 60s;# 建立连接以后,60秒内后端没有响应header,则超时
                proxy_send_timeout 60s; #60秒内没有将数据传送完,则超时,往往生产环境会调至600s
                
                proxy_set_header Host $http_host; #代理服务器转发http请求时携带Host变量为www.jsocn.com
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #代理服务器向后端转发时,携带真实的客户机IP,通过nginx log可看到
                proxy_set_header Connection ""; #自定义设置头部,将connection设置为空,可使http连接设置为长链接
                proxy_buffering on; #打开代理缓存,
                proxy_buffer_size 8k;#将header缓存到代理服务器上的内存中
                proxy_buffers 4 64k;#将data缓存到代理服务器上的内存中
                
                
        }
}

参数详解

proxy_set_header

# 添加发往后端服务器的请求头信息,
Syntax: proxy_set_header field value; Default: proxy_set_header Host $proxy_host;
            proxy_set_header Connection
Context:    http, server, location

# 客户端请求Host的值是www.jsocn.net,那么代理服务会像后端请求时携带Host变量为www.jsocn.net 
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中, $remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 这种方式已经弃用了,因为需要在后端服务器也需要在配置文件中定义X-Real-Ip这个变量

# 客户端通过代理服务访问后端服务,后端服务会通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_http_version

# 代理的向后端请求时使用的HTTP协议版本。默认1.0版本 
Syntax: proxy_http_version 1.0 | 1.1; Default: proxy_http_version 1.0;
Context: http, server, location
This directive appeared in version 1.1.4

proxy_connect_timeout

# nginx代理与后端服务器 "连接超时" 时间(代理连接超 时)
Syntax: proxy_connect_timeout time; Default: proxy_connect_timeout 60s; Context: http, server, location

proxy_read_timeout

# nginx代理等待后端服务器 "响应(Header)超时" 时 间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s; Context: http, server, location

proxy_send_timeout

#后端服务器 "数据(Data)回传给nginx代理超时" 时 间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

proxy_buffer(缓冲区)

1)启用缓冲时, nginx代理服务器将尽快的接收响应Header以及响应报文,并将其保存到 proxy_buffer_size(Headers) 和 proxy_buffers(data) 设置的缓冲区中。

# proxy_buffer代理缓冲区
Syntax: proxy_buffering on | off; Default: proxy_buffering on; Context: http, server, location

如果响应报文过大无法存储至内存,则会将其中部分保存到磁盘上的临时文件中。写入临时文件由proxy_temp_path (控制临时存储目录)proxy_max_temp_file_size (控制临时存储目录大 小) 和 proxy_temp_file_write_size(控制一次写 入临时文件的数据大小),临时文件最大大小由proxy_buffer_size 和 proxy_buffers 限制。但当禁 用缓冲时, nginx 代理服务器会在接收到响应时立即同 步传递给客户端。 nginx 代理服务器不会读取整个响应。

2) proxy_buffer_size 用于控制代理服务读取后端第 一部分响应 Header 的缓冲区大小。

Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
# proxy_buffer_size 64k;

3) proxy_buffers 是代理服务器为单个连接设置响应 缓冲区 “数量” 和 “大小”。 如果一个后端服务所返回的页面大小为 256KB ,那么会为其分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到proxy_temp_path 指定的路径中。但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。所以这个值一般建议设置为站点响应所产生的页面大小中间值,如果站点大部分脚本所产生的页面大小为 256KB ,那么 可以把这个值设置为 “16 16k”、“4 64k” 等。

Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
#proxy_buffers 4 64k;

代理参数总结

# 代理网站常用优化配置如下,将配置写入一个新文件,调 用时使用include即可
vim /etc/nginx/proxy_params 
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 4 64k;


# 使用include方式,便于后续Location的重复使用。 
location / {
        proxy_pass http://10.0.0.7:
        include proxy_params; #相对路径,proxy_params在/etc/nginx/下
}

location / {
        proxy_pass http://10.0.0.8:
        include proxy_params; 
}