Node.js 代理套接字io无法连接到nginx,docker上的节点
我努力使用nginx、node和react连接docker应用程序中的socket.io实例。套接字请求保持挂起状态,然后在一段时间后失败。我尝试了不同的配置,以使节点服务器的套接字请求由nginx代理,但没有成功。它过去在docker之外工作,但现在我的套接字出现故障,一切都被卡住了 这是我的实际nginx配置:Node.js 代理套接字io无法连接到nginx,docker上的节点,node.js,reactjs,docker,nginx,proxy,Node.js,Reactjs,Docker,Nginx,Proxy,我努力使用nginx、node和react连接docker应用程序中的socket.io实例。套接字请求保持挂起状态,然后在一段时间后失败。我尝试了不同的配置,以使节点服务器的套接字请求由nginx代理,但没有成功。它过去在docker之外工作,但现在我的套接字出现故障,一切都被卡住了 这是我的实际nginx配置: upstream frontend { least_conn; server client:8080; } upstream backend { least
upstream frontend {
least_conn;
server client:8080;
}
upstream backend {
least_conn;
server server:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://frontend;
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;
}
location /api {
proxy_pass http://backend;
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;
}
location /ws/ {
proxy_pass http://backend;
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;
}
}
这是我的docker撰写的文件
version: '3'
services:
nginx:
build:
context: ../..
dockerfile: ./dev-kit/docker/nginx/Dockerfile
ports:
- 8080:80
links:
- client
- server
client:
build: ../../client
ports:
- 8088:8080
volumes:
- ../../client:/app:cached
command: npm run start
server:
build: ../../server
ports:
- "8082:8080"
volumes:
- ../../server:/app:cached
depends_on:
- "mongo"
mongo:
image: "mongo"
volumes:
- /usr/local/var/mongodb/:/data/db
ports:
- "27017:27017"
以下是express上的服务器端:
const express = require('express');
const app = module.exports = express();
const http = require('http').Server(app);
const bodyParser = require('body-parser');
const io = require('socket.io')(http);
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const appInterface = process.env.HOST || '0.0.0.0';
const port = process.env.PORT || 8080;
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested- With, Content-Type, Accept, x-access-token');
res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE');
next();
});
io.on('connection', (socket) => {
console.log('one user connected !');
socket.on('register', (userId) => {
users[userId] = socket.id;
});
});
// Start server
http.listen(port, appInterface.toString(), function (err) {
console.log('[%s] Listening on http://localhost:%d',
app.settings.env, port);
});
不幸的是,由于套接字io请求失败,因此从未执行此操作
最后,这里是客户端的我的app.js,在这里我实例化了一个套接字io实例:
const socket = io('http://server:8080', { path: '/ws/socket.io' });
socket.emit('register', XXXX);
非常感谢你的帮助。我尝试了许多不同的nginx配置来将套接字io请求代理到服务器,但没有成功。我认为您需要使用@sign location,如下所述 因此nginx.conf如下所示:
location /socket.io {
try_files $uri $uri/ @websocket;
}
...
location @websocket {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
从您的服务器端代码来看,您没有启动express server(例如,
应用程序。请听
)您好,谢谢您的回答,我真的这样做了,我在我的帖子中编辑了我的编辑,很抱歉,大家有想法吗?您在docker compose文件和Nginx上的端口映射配置。您找到解决方案了吗@Joelitocker compose说“服务器:8082”,但nginx.conf说“上游后端{服务器:8080