nginx反向代理 后端服务,正常的话我们只需要输入域名加指定的location块名就能成功访问目标服务了.
例如:
location ^~ /mall/ {
proxy_pass http://127.0.0.1:8281/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
但是并不意味着所有服务都可以正常访问.
有一些服务通过就会遇到访问 页面空白,F12查看网络的话,资源请求都是正常 200 状态码.
唯独 应该展示内容的网页,什么都没有,一片空白.
这个在早期部署服务 配置nginx时就有遇到.
先提出出现这种情况的一个要素.
proxy_buffering
抄取官方一篇文章中的说明:
NGINX 默认启用代理缓冲(proxy_buffering 指令设置为on
)。代理缓冲意味着 NGINX 将来自服务器的响应存储在内部缓冲区中,并且在整个响应被缓冲之后才开始向客户端发送数据。缓冲有助于优化慢速客户端的性能 —— 因为 NGINX 缓冲响应的时间与客户端检索所有响应的时间一样长,代理服务器可以尽可能快地返回响应,然后返回到可用的状态以响应其他请求。如果代理缓冲被禁用,则 NGINX 只会在默认为一个内存页大小(4 KB 或 8 KB,具体取决于操作系统)的缓冲区内缓存服务器响应的开头部分后就开始向客户端传输。通常,这个缓存空间只够缓存响应http消息头。NGINX 收到响应后会同步发送给客户端,迫使服务器处于空闲状态,直到 NGINX 可以接受下一个响应段为止。
因此,对于经常在 NGINX 配置中看到
proxy_buffering
off
指令的情况,我们感到非常惊讶。也许这样做是为了减少客户端延迟,但其影响可以忽略不计,而关闭后的副作用却很多:代理缓冲被禁用后,速率限制和缓存即便配置了也不起作用,性能也会受影响等等。
我还搜索了一下博客,其中这位博主也有对这个配置讲解.
但是作为懵圈的你不是特意查看可能不知道原来是因为它导致的页面空白.
proxy_buffering 主要是实现被代理服务器的数据和客户端的请求异步。
为了方便理解,我们定义三个角色,A为客户端,B为代理服务器,C为被代理服务器。
当proxy_buffering开启,A发起请求到B,B再到C,C反馈的数据先到B的buffer上,然后B会根据proxy_busy_buffer_size来决定什么时候开始把数据传输给A。
在此过程中,如果所有的buffer被写满,数据将会写入到temp_file中。(注意看这里,关键地方)
相反,如果proxy_buffering关闭,C反馈的数据实时地通过B传输给A。
以下配置,都是针对每一个http请求的:
1. proxy_buffering on;
该参数设置是否开启proxy的buffer功能,参数的值为on或者off。
如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。
但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的2. proxy_buffer_size 4k;
该参数用来设置一个特殊的buffer大小的。
从被代理服务器(C)上获取到的第一部分响应数据内容到代理服务器(B)上,通常是header,就存到了这个buffer中。
如果该参数设置太小,会出现502错误码,这是因为这部分buffer不够存储header信息。建议设置为4k。3. proxy_buffers 8 4k;
这个参数设置存储被代理服务器上的数据所占用的buffer的个数和每个buffer的大小。
所有buffer的大小为这两个数字的乘积。4. proxy_busy_buffer_size 16k;
在所有的buffer里,我们需要规定一部分buffer把自己存的数据传给A,这部分buffer就叫做busy_buffer。
proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。对于B上buffer里的数据何时传输给A,我个人的理解是这样的:
1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给A;
2)如果完整数据大小不少于busy_buffer大小,则装满busy_buffer后,马上传给A;5. proxy_temp_path
语法:proxy_temp_path path [level1 level2 level3]
定义proxy的临时文件存在目录以及目录的层级。例:proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
其中/usr/local/nginx/proxy_temp为临时文件所在目录,1表示层级1的目录名为1个数字(0-9),2表示层级2目录名为2个数字(00-99)6. proxy_max_temp_file_size
设置临时文件的总大小,例如 proxy_max_temp_file_size 100M;7. proxy_temp_file_wirte_size
设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。
通过上述内容,我们可以得知,对于一个块服务配置中,如果我们不主动设置 上述内容,
那么就意味着nginx的请求反馈的数据 可能会远超默认值的哦,那么nginx就会将数据写入到 nginx目录下的 temp_file ,
然而 关键时刻来了,出现空白的情况,大多数是因为 没有权限 写入到 这个目录下,就会出现报错.
这里是我特意修改配置后,可以看到权限拒绝写入到 proxy_temp目录下(论日志的重要性)
所以看到这里,你是不是对它的理解多了一些呢.
那么知道原因了,如何解决呢?
3种办法,
第1个
是关闭这个配置在你的location块里.
location ^~ /nacos/ {
allow 1.1.1.1; # 允许办公室的IP
deny all; # 其他所有IP拒绝访问
proxy_pass http://1.1.1.1:8848/nacos/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_buffering off;
}
第2个
自然是调大上一位博主提到的一个数值,他也给出示例了,这里贴一下
server
{
listen 80;
server_name www.baidu.com;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 2 4k;
proxy_busy_buffers_size 4k;
proxy_temp_path /tmp/nginx_proxy_tmp 1 2;
proxy_max_temp_file_size 20M;
proxy_temp_file_write_size 8k;
location /
{
proxy_pass http://192.168.10.110:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
第3个
给proxy_temp 目录提权. chmod 777 观察下 是否正常,
如果不正常则按照第二步配置即可
end.