欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【记录】Nginx 反向代理 Websocket

程序员文章站 2022-04-30 23:18:13
...

nginx 从 1.3 版本后就已经支持 websocket 的反向代理,不过作为开发运维人员,永远是根据业务需求去调整,而不是盲从。

用 nginx 反向代理有什么好处呢?

省钱

拿最火的微信小程序开发来说,官方不允许你在使用 websocket 通讯的时候添加端口。这就很操蛋了,如果专门用一台服务器来做 websocket 服务有些浪费,而通过 nginx 的反向代理,你可以把 80 端口的请求直接转发到当前服务器上的其它端口,既可以实现80端口的访问又没必要专门开放一个websocket端口外部通讯,简直爽歪歪。

省事

现在的网站几乎都是 https 协议访问了吧,你把 nginx 证书配置好,既可以用 https 访问网站又可以用 wss:// 访问 websocket ,不需要单独配置。

注意

如果使用同域名不同路径去配置Websocket,记得要处理好 nginx rewrite 规则,否则你的 websocket 就扑街了无法连接。

一般网站都会去使用URL重写,比如 typecho 这些框架都有规则。

你可以这么处理:

server {
    listen 80;
    ... ...
    # 你的 websocket 地址
    # 客户端连接地址 ws://xxx.com/chat/
    location /chat/ {
        proxy_pass http://127.0.0.1:8282
    }
    # 你的网站重写规则
    location / {
        include rewrite/typecho.conf
    }
}

注意顺序,当有用户连接 ws://xxx.com/chat/ 时会转发到 8282 端口的Websocket服务,否则就是正常访问。

如果有配置证书,就需要使用 wss://xxx.com/chat/ 连接。

以下代码供参考:

说明:80 是 http 默认端口,443 是 https  默认端口,如果你的域名没有备案,服务器在国内是无法正常访问的,只能换别的端口,包括 8080 都不行。

server
    {
        listen 2020 ssl http2;
        #listen [::]:443 ssl http2;
        server_name www.example.net example.net;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/work/example;

        ssl_certificate /usr/local/nginx/conf/ssl/www.example.net/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/www.example.net/www.example.net.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
        
        location /chat/ {
            proxy_pass http://127.0.0.1:2026;
            proxy_http_version 1.1;
            proxy_connect_timeout 4s;
            proxy_read_timeout 60s;
            proxy_send_timeout 12s;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
        }
        location / {
            include rewrite/typecho.conf;
        }
        #error_page   404   /404.html;
        ... ...