dar*_*ley 1 sockets reverse-proxy nginx node.js socket.io
我已经在这几天了.我这么近,然后连接似乎死亡或socket.io无法找到.但那么也许我做错了?
我的NGINX文件看起来像这样:
upstream appOne {
server demo.someserver.com:1111;
}
upstream appTwo {
server demo.someserver.com:2222;
}
location /appOne/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://appOne/;
}
location /appTwo/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://appTwo/;
}
location /socket.io/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://appOne/socket.io/;
}
Run Code Online (Sandbox Code Playgroud)
所以我在这里要做的是让appOne在demo.someserver.com/appOne的子文件夹中运行,让appTwo在demo.someserver.com/appTwo的子文件夹中运行,但两者都有一个反向代理.
所有连接都很好,除了两个应用程序都需要socket.io运行,不应该真的需要相互连接(虽然我开始认为这不是一个坏主意).但是目前他们都连接到appOne/socket.io/socket.io.js因为最后一个NGINX位置.当连接类似于套接字连接不在同一端口等时,这会导致各种问题.
我试图避免的是在任何前端JS文件中命名端口和应用程序名称appOne和appTwo在此上下文中可以是clientOne和clientTwo.
我确实想到过这样的事情:
if ($request_uri == 'appOne') {
proxy_pass http://appOne/socket.io/;
}
if ($request_uri == 'appTwo') {
proxy_pass http://appTwo/socket.io/;
}
Run Code Online (Sandbox Code Playgroud)
但我不知道这究竟是如何运作的.任何指针或任何人试图做同样的事情?
所以我的问题是 - 如何通过反向代理与socket.io建立单独的连接.或者我应该有一个socket.io连接并且都附加到那个?(但我可以在一台服务器上拥有多个客户端)
如果您需要两个单独的socket.io应用程序,则可以path在客户端初始化socket.io时通过设置(未记录的)选项来执行此操作.
为了保持一致,我将为您提供Nginx配置和节点文件的完整工作示例:
nginx配置:
upstream appOne {
server demo.someserver.com:1111;
}
upstream appTwo {
server demo.someserver.com:2222;
}
server {
listen 80;
server_name demo.someserver.com;
root /path/to/working/dir; #probably not necessary
location /appOne/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://appOne/;
}
location /appTwo/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://appTwo/;
}
# no need for /socket.io location
# each app will connect socket.io via /appOne/socket.io or /appTwo/socket.io
}
Run Code Online (Sandbox Code Playgroud)
app1.js和 app2.js(Express + Socket.io示例):
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var port = 1111; //or 2222 for app2.js
app.get('*', function(req, res) {
res.sendFile(__dirname + '/index1.html'); //or index2.html for app2.js
});
io.on('connection', function(socket) {
socket.emit('hello', {port: port});
});
server.listen(port);
Run Code Online (Sandbox Code Playgroud)
index1.html和 index2.html:
<!DOCTYPE html>
<html>
<head>
<script src="/appOne/socket.io/socket.io.js"></script>
<!--<script src="/appTwo/socket.io/socket.io.js"></script>-->
<script>
var socket = io('/', {path: '/appOne/socket.io'});
//var socket = io('/', {path: '/appTwo/socket.io'});
socket.on('hello', function(data) {
console.log(data.port);
});
</script>
</head>
<body>
<h1>app</h1>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
所以,如果你启动这两个app1.js和app2.js并导航到
http://demo.someserver.com/appOne
Run Code Online (Sandbox Code Playgroud)
然后
http://demo.someserver.com/appTwo
Run Code Online (Sandbox Code Playgroud)
您将在控制台中看到1111并2222分别,这意味着你有两个独立的socket.io应用.