首页 » nginx » 正文

nginx反向代理的一些问题

1、代理websocket

参考链接: https://blog.csdn.net/u011411069/article/details/98475433  
http字段内添加以下内容
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
location字段内添加以下内容  
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
map指令的作用:  

该作用主要是根据客户端请求中 $http_upgrade  的值,来构造改变 $connection_upgrade 的值,即根据变量 $http_upgrade 的值创建新的变量 $connection_upgrade ,创建的规则就是{}里面的东西。 
 
其中的规则没有做匹配,因此使用默认的,即:  

 $connection_upgrade 的值会一直是 upgrade 。然后如果 $http_upgrade 为空字符串的话,那值会是 close
Nginx代理webSocket经常中断的解决方法(也就是如何保持长连接)
现象描述:用nginx反代代理某个业务,发现平均1分钟左右,就会出现webSocket连接中断,然后查看了一下,是nginx出现的问题。
产生原因:nginx等待第一次通讯和第二次通讯的时间差,超过了它设定的最大等待时间,简单来说就是超时!
解决方法1  
其实只要配置nginx.conf的对应localhost里面的这几个参数就好
proxy_connect_timeout; 
proxy_read_timeout; 
proxy_send_timeout;
解决方法2  
发心跳包,原理就是在有效地再读时间内进行通讯,重新刷新再读时间

配置示例

http {
    server {
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://webscoket;
            proxy_http_version 1.1;
            proxy_connect_timeout 4s;                #配置点1
            proxy_read_timeout 60s;                  #配置点2,如果没效,可以考虑这个时间配置长一点
            proxy_send_timeout 12s;                  #配置点3
            proxy_set_header Upgrade $http_upgrade; 
            proxy_set_header Connection "Upgrade";  
        }
    }
}
关于上面配置2的解释  
这个是服务器对你等待最大的时间,也就是说当你webSocket使用nginx转发的时候,用上面的配置2来说,如果60秒内没有通讯,依然是会断开的,所以,你可以按照你的需求来设定。比如说,我设置了10分钟,那么如果我10分钟内有通讯,或者10分钟内有做心跳的话,是可以保持连接不中断的,详细看个人需求。
WebSocket与Socket的关系  
Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。
WebSocket就像HTTP一样,则是一个典型的应用层协议。总的来说:Socket是传输控制层接口,WebSocket是应用层协议。

2、反向代理二级目录

比如某个代理方案:  
location /zabbix/ {
    #root /usr/www/wj;
    index index.php index.html index.htm;
    proxy_set_header Host $host;
    proxy_set_header X-Real-Ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http:/127.0.0.1:8088/;
    proxy_set_header   X-Forwarded-Proto https;
    proxy_set_header   X-Forwarded-Host $server_name;

    proxy_read_timeout  1200s;
    client_max_body_size 0;
  }
其中 location /zabbix/ 最后面有个反斜杠 "/" 不可忽略,  
proxy_pass http:/127.0.0.1:8088/ 最后面有个反斜杠 "/" 不可忽略

发表评论