Nginx反向代理Websocket,实现wss访问

  基础研究 , 服务器配置

如何让nginx反向代理实现websocket功能?这是我在开发微洽系统时思考的。毕竟如果想支持高并发,使用nginx做反向代理,对接后端的应用服务器。这样的架构才更容易扩展。

既然是传输聊天信息的所以,微洽自然使用了SSL。虽然不使用nginx做代理,直接使用Swoole的websocket也能支持wss访问,但是却只能依赖一台后端的应用服务器,架构无法扩展的系统是不可以忍受的。

让Swoole支持wss也是非常简单的,只需要你使用域名申请一个证书就可以了。比如:你的域名是abc.com,申请的SSL证书得到cert和key之后。

将
$server = new swoole_websocket_server("0.0.0.0", 9502);
修改为
$server = new swoole_websocket_server("0.0.0.0", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$server->set(array(
    'ssl_cert_file' => '/path/to/abc.com.cert',
    'ssl_key_file'  => '/path/to/abc.com.key',
));

就可以了,唯一要注意的是,使用js发起请求的时候,需要将IP访问改为域名访问。

如果使用nginx做反向代理,则不需要改动上面的代码。直接在nginx中增加配置文件即可。配置如下:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream websocket {
    server localhost:1234; # appserver_ip:ws_port
}

server {
    listen 443 ssl;
    server_name ws.abc.com;
    ssl on;
        ssl_certificate         /path/to/abc.com.cert;
        ssl_certificate_key     /path/to/abc.com.key;

    location / {
         proxy_pass http://websocket;
         proxy_read_timeout 300s;
         proxy_send_timeout 300s;

         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_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection $connection_upgrade;
    }
}

proxy_read_timeout

默认值 60s 上下文 http server location 说明 该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。 这个时间不是获得整个response的时间,而是两次reading操作的时间。

proxy_send_timeout

语法 proxy_send_timeout time 默认值 60s 上下文 http server location 说明 这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。 如果超时后,upstream没有收到新的数据,nginx会关闭连接。


本文作者: 江边望海
本文链接: https://www.jiangbianwanghai.com/2018/09/18/Nginx-reverse-proxy-to-implement-WSS/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!