【发布时间】:2019-05-21 16:18:39
【问题描述】:
我整天都在尝试让我的 Nginx/React 应用程序连接到我的 Node.js 后端,这在我的开发环境中运行良好。我的前端和后端部署在同一个虚拟机上各自的 Docker 容器中。 Nginx 容器可以直接与 Node.js 容器通信,并且确认可以正常工作,因为其他 get/post 请求工作正常。
这是我最初的 Nginx 配置。
server {
listen 80;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
//This is the initial route to connect to socket.io
location /api/notices {
proxy_pass http://nodejs:8000;
}
location ~ ^/api/infoblock/[0-9a-zA-Z]+$ {
proxy_pass http://nodejs:8000;
}
}
这是我在控制台中遇到的错误:
POST http://domain_name/socket.io/?EIO=3&transport=polling&t=MVFZtgP 405 (Not Allowed)
我在网上做了一些更多的研究,并被告知要添加类似的内容:
location /socket.io/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_pass http://nodejs:8000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
}
当我这样做时,405 错误消失了,但似乎什么都没有发生。我没有从 socket.io 连接中获取任何数据,控制台中也没有抛出任何东西。
我不确定我需要做什么。我已经尝试了很多我在网上找到的“解决方案”,但似乎无法弄清楚为什么 socket.io 连接不起作用,但正常的 get/post 请求会。
这是我从前端连接的方式,这再次证实在我的开发环境中工作。
let socket = socketIOClient("/api/notices");
socket.on("NoticesReact", this._socketNotices);
如何修复我的 nginx 配置以使用 Node.js + Socket.io
【问题讨论】:
-
nginx 在 docker 容器上,不是吗?
-
是的,我正在使用他们的官方容器,但我正在使用此配置来处理我的应用程序。
-
你在 nginx 容器中
ping nodejs的结果是什么? -
不完全确定如何从容器中“ping”,因为它们都只是运行一件事,所以普通的 linux 命令不会真正起作用。但我的前端也在向
api/infoblocks/...路由发出get/post 请求。这很好用,因为它没有使用 socket.io。这只是一条正常的路线。 -
似乎是 nginx 的配置或容器的对话方式有问题,但它们可以正常的获取/发布请求。所以不知道发生了什么。
标签: node.js reactjs nginx socket.io