【问题标题】:How to setup nginx for multiple nodejs apps on a server (using socket.io with namespaces)如何在服务器上为多个 nodejs 应用程序设置 nginx(使用带有命名空间的 socket.io)
【发布时间】:2018-11-30 13:46:37
【问题描述】:

我们有一个 nodejs 应用程序当前使用 socket.io(带有命名空间)。此应用程序用作特定金融市场的仪表板。每个应用实例订阅特定的市场数据并提供仪表板。最初,我们在服务器上为 3 个单独的市场配置了该应用程序的 3 个单独实例,所有实例都绑定到单独的端口以服务请求。

由于我们计划添加更多市场,因此拥有一个可以使用单个端口(以及每个市场的单独 URI)的反向代理服务器是有意义的。但是,由于各种原因,设置 nginx 一直是一场噩梦。

(a) 一个市场的每个应用程序实例可以处于不同的开发阶段,因此可以有不同的静态文件。通过 nginx 管理所有静态文件似乎很痛苦?可以做些什么来让应用程序本身处理静态文件。

(b) socket.io 通信失败。我们试图调查网络通信,似乎在尝试连接到 socket.io 服务器时不断出现 404 page not found 错误。不知道为什么它通过 http::/localhost/server.io/ 而不是 ws://localhost/server.io/ 连接?有人可以指出一个类似的例子吗?有什么需要注意的吗?

在我们的例子中,我们一直在 nginx 站点可用/默认中尝试以下内容

        location /app/ {
            proxy_pass http://localhost:3000/;
            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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # kill cache
            add_header Last-Modified $date_gmt;
            add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
            if_modified_since off;
            expires off;
            etag off;

    }

【问题讨论】:

    标签: node.js nginx socket.io


    【解决方案1】:

    使用 nginx 作为反向代理应该不会给您带来困难。 nginx 的好处是你可以在同一台服务器上拥有不同域的多个项目。

    这里是一个带有多个项目的 nginx 示例:

    server {
    listen 80;
    server_name yourdomain.com;
    
       location / {
        proxy_pass http://localhost:3000;
    #Rember to set the header like this otherwise the socket might not work.
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
       }
    }
    server {
    listen 80;
    server_name subdomain.yourdomain.com;
    
       location / {
        proxy_pass http://localhost:3001;
       }
    }
    

    我不确定你的套接字为什么会失败。也许错误在于您尝试在客户端站点上定义路由。尝试使用这样的 javascript:

    var socket = io();
    

    或者如果您的套接字在您的其他应用程序之一上运行:

    var socket = io('http://yourdomain.com');
    

    请记住,您的更改应添加到启用站点而不是站点可用

    【讨论】:

    • 是的,这似乎有效。相反,我试图在单个服务器块下拥有多个节点(由 localhost/app1 、 localhost/app2 等 URI 分隔),由于某种原因,设置起来更加痛苦。非常感谢:) !!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2021-02-27
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多