主要重点在于单端口并且同一个路径提供不同服务,首先需要满足以下条件:

  1. 首先根据官方教程完成部署,并使用pm2 start ./server/main.js --node-args="-r esm" --name hackchat启动服务。
  2. 假设在创建配置时,默认选择的是 6060 端口作为 websocket 端口。
  3. 假设需要使用 once.chat 这个域名,但是只想使用 443 端口,不希望 websocket 走 6060。

流程:

  1. 修改 client/client.js,在 320 行找到 var wsPath = ':6060';改为 var wsPath = '/';
  2. 根据普通的 Nginx 配置流程,完成端口监听,SSL 等配置,我这边用的 BT面板,就不再详细说了。
  3. 修改 Nginx 配置,对于 localtion / 进行如下配置

    location / {
         root  /www/wwwroot/hackchat/client;
         if ( $http_upgrade = "websocket" ) {
           proxy_pass http://127.0.0.1:6060;
             }
           proxy_set_header Host $host:$server_port;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header REMOTE-HOST $remote_addr;
           add_header X-Cache $upstream_cache_status;
           proxy_set_header X-Host $host:$server_port;
           proxy_set_header X-Scheme $scheme;
           proxy_connect_timeout 30s;
           proxy_read_timeout 86400s;
           proxy_send_timeout 30s;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
     }

此时打开网页,即可正常加载静态资源的同时,也能用根路径连接到 websocket 服务。

如果嫌麻烦的话呢,也可以修改 wsPath ,带上 /chat-ws 这样的 path (官方的实现方式),在 Nginx 中就可以直接通过 location 进行区分了,配置起来更简单一点。

欢迎体验: once.chat