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

标签 node.js nginx reverse-proxy

我正在尝试在同一个服务器/端口上运行多个 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;
    }
}

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

但我想用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)

我猜这是因为我正在代理请求,但我并不完全理解该过程在内部是如何工作的,我很乐意让它发挥作用。

关于此需要注意的一点是我必须使用 <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我现在可以使用它了,但这不是正确的解决方案。

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

最佳答案

遇到了同样的问题。通过在 nginx 配置中将 /socket.io 路由到我的 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;
    }
}

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

关于node.js - Socket.io 客户端 javascript 文件位置(使用 nginx 反向代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308663/

相关文章:

node.js - 如何从 MongoJS 查询输出中选择值

javascript - 使用连接表续写 self 关系

http - nginx 日志 http 状态 什么是 404 187

ruby-on-rails - Sidekiq Web UI 未加载或安装或生产中没有错误的东西

ssl - 反向代理 : How to relay (encrypted) SSL traffic to a (decrypted) TCP connection?

javascript - 使用 indexOf 匹配精确的字符串

node.js - 通过休息以编程方式使用 Mocha

nginx - 在 nginx.conf 中使用环境变量或参数

reverse-proxy - IIS Express可以支持反向代理吗?

docker - Traefik/Docker:使用端口作为前端规则(而不是路径或子域)