Socket.io客户端javascript文件位置(使用nginx反向代理)

Cas*_*sen 5 reverse-proxy nginx node.js

我正在尝试在同一服务器/端口上运行多个NodeJS应用程序,使用nginx作为代理实际运行的Node应用程序的反向代理.

server {
    listen       8000;
    server_name  node.domain.com;
    root         /var/www/node;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    # Enables WS support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect off;

    location / {
        proxy_pass http://127.0.0.1:8001;
    }

    location /irc/ {
        proxy_pass http://127.0.0.1:8002;
    }

    location /voidwalker/ {
        proxy_pass http://127.0.0.1:8003;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我forever在不同的子目录中运行(使用)不同的项目(NodeJS应用程序)/var/www/node.

但我想在我的一个项目中使用socket.io.在socket.io文档中,它声明我应该使用<script src="/socket.io/socket.io.js"></script>在客户端加载socket.io-client,它返回404:

GET http://node.domain.com/socket.io/socket.io.js 404 (Not Found)
Run Code Online (Sandbox Code Playgroud)

我猜这是因为我正在代理请求但我并不完全理解这个过程在内部是如何工作的,我希望能够让它发挥作用.

关于这一点需要注意的是我必须使用<link rel="stylesheet" href="/voidwalker/css/main.css">加载我的CSS,而我宁愿使用<link rel="stylesheet" href="/css/main.css">以防我想在特定的子域/其他域上部署它(因为这是一个开发服务器).

编辑

因此,在与Ray Stantz一起调试之后,我们认为代理中出现了问题.我将socket.io.js移入了/public/js/socket.io.js,我现在可以使用它,但这不是正确的解决方案.

如果有人对此有任何想法,我会很高兴听到他们并试一试!

小智 3

有同样的问题。/socket.io通过在 nginx 配置中路由到我的 node.js 应用程序来解决。在你的情况下它应该看起来像:

server {
    listen       8000;
    server_name  node.domain.com;
    root         /var/www/node;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;

    # Enables WS support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect off;

    location / {
        proxy_pass http://127.0.0.1:8001;
    }

    location /irc/ {
        proxy_pass http://127.0.0.1:8002;
    }

    location /voidwalker/ {
        proxy_pass http://127.0.0.1:8003;
    }

    location /socket.io {
        proxy_pass http://127.0.0.1:8003;
    }
}
Run Code Online (Sandbox Code Playgroud)

此解决方案的唯一缺点是只有voidwalker应用程序可以使用 socket.io(因为/socket.io仅在 127.0.0.1:8003 上提供服务)。