如何在 nginx nodejs 服务器上配置“ws”websocket?

Posted

技术标签:

【中文标题】如何在 nginx nodejs 服务器上配置“ws”websocket?【英文标题】:How do i configure "ws" websocket on nginx nodejs server? 【发布时间】:2018-11-26 09:04:14 【问题描述】:

我目前正在尝试在 nginx debian 远程服务器上部署我的 NODEJS 应用程序。 它在本地主机中运行良好。 但是我在让 websocket 在远程 nginx 服务器上工作时遇到了一些困难。 我使用“ws”nodejs 模块。

这就是我声明我的 websocket 服务器端的方式:

var WebSocket_ = require('ws');
var wss = new WebSocket_.Server(port: 40510);

这就是我打开 websocket 客户端的方式:

var ws = new WebSocket('ws://localhost:40510');

我知道我必须在我的 Nginx VPS 上配置 /etc/nginx/sites-available/default :

我需要添加一个 websocket 块位置并定义一个特定的 proxipass 吗? 如果是怎么办?

我是否必须替换 var "ws = new WebSocket('ws://localhost:40510');"通过我的客户端代码中的另一条指令?

提前感谢您的回答!

【问题讨论】:

【参考方案1】:

如果你已经有一个 server 块,把它放在里面(通常在 sites-available 或 nginx.conf 里面):

location /ws 
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:40510;

现在,根据您的 Nginx 侦听端口,您将配置您的客户端 IP/端口(默认情况下,Nginx 侦听端口 80)

var ws = new WebSocket('ws://localhost:80/ws');

完整的配置文件(示例):

http 
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    fastcgi_buffers 64 4K;

    server 
        listen       localhost:80 default_server;
        server_name  localhost;

        # Logs
        access_log /var/log/nginx/main.access.log;
        error_log /var/log/nginx/main.error.log;

        # Websocket
        location /ws 
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_pass http://localhost:40510;
        
    

【讨论】:

非常感谢。您确认,我不需要更改指令“var wss = new WebSocket_.Server(port: 40510);”中的任何内容? 如果它现在在没有 Nginx 的情况下工作,它应该没问题。 我的服务器监听配置:监听 80 default_server;听 [::]:80 default_server; 其实显然是client端,websocket地址必须以ws开头:// 未捕获的 DOMException:无法构造“WebSocket”:URL 的方案必须是“ws”或“wss”。不允许使用“http”。【参考方案2】:

非常感谢

我已经使用了一个块位置,带有一个重定向代理反向:

    location / 


           proxy_pass http://localhost:8888;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_cache_bypass $http_upgrade;


            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            # try_files $uri $uri/ =404;
    

我不应该改用我的域名吗? 比如:

var ws = new WebSocket('http://vincentfritz-dev.fr/ws');

?

【讨论】:

以上是关于如何在 nginx nodejs 服务器上配置“ws”websocket?的主要内容,如果未能解决你的问题,请参考以下文章

如何在生产服务器上部署 Node.js 应用

nginx配置sso登录

在Server2003上配置nginx反向代理nodejs。

如何在 php/apache 服务器上部署 nodejs 应用程序?

NGINX _ nginx 上的 rtmp nodejs 服务器配置:[emerg] bind() to 0.0.0.0:1935 failed (98: Address already in use

nodejs+nginx配置gzip压缩