当使用Nginx作为反向代理时,我是否需要在expressjs中为纯websocket应用程序进行路由?

时间:2017-08-16 13:19:16

标签: node.js express nginx

很难写出一个合适的标题。

我有一个基于快速服务器的纯websocket应用程序。在开发模式下,快速服务器执行一些简单的路由来访问html,js和png文件。基本上它是一个只处理websocket协议的单页应用程序。但在生产模式下,我将所有这些委托给Nginx,因此我不会在快递生产中做任何路由。我期待Nginx会在其" root"上找到所有这些文件。目录。我得到一个"无法得到/"然而错误。

TL; DR版本:

当我使用Nginx为单页应用程序提供静态内容时,我是否需要在快速路由中执行任何操作?如果是这样,怎么样?

UPD (我的Nginx设置,可以找到另一个更详细的问题here):

upstream upstream_project {
    server 127.0.0.1:8888;
    keepalive 64;
}

server {
        listen 0.0.0.0:80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /usr/local/share/html;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name ws_server;

        location / {
                try_files $uri $uri/ index.html;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;

                proxy_redirect off;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_pass http://upstream_project;
                proxy_read_timeout 240s;
        }
}

已更新

我在Nginx日志中发现客户端正试图通过ipv6访问服务器。见:

    kevent() reported that connect() failed (61: Connection refused) while
 connecting to upstream, client: ::1, server: ws_server, request: "GET / 
HTTP/1.1", upstream: "http://127.0.0.1:8888/", host: "localhost"

我删除了ipv6服务器监听行(listen [::]:80 default_server ipv6only=on;),并且必须更改try_files行以明确使用文件名。

try_files $uri $uri/app.js ;

然后我可以让我的应用运行起来。但我不明白。我为什么要这样做?

我仍然无法从" root"的子目录访问静态png文件。夹。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

NGINX支持WebSocket,允许在客户端和后端服务器之间建立隧道。要使NGINX将升级请求从客户端发送到后端服务器,必须明确设置升级和连接标头,如下例所示:

location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

有关详细信息和示例,请查看此NGINX guide

相关问题