我如何为两个都需要 socket.io 的应用程序设置带有端口 80 的反向代理的 NGINX?
How do I setup NGINX with a reverse proxy to port 80 for two apps that both need 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/;
}
所以我在这里要做的是将 appOne 运行ning 放在 demo.someserver.com/appOne 的子文件夹中,并将 appTwo 运行ning 放在子文件夹中在 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/;
}
但我不知道这到底是怎么回事。任何指示或有人试图做同样的事情吗?
所以我的问题是 - 如何通过反向代理与 socket.io 建立单独的连接。或者我应该有一个 socket.io 连接并且都连接到那个? (但我可以在一台服务器上有多个客户端)
您可以在脚本中将自定义路径设置为 socket.io
。
Sets the path v under which engine.io and the static files will be
served. Defaults to /socket.io.
If no arguments are supplied this method returns the current value.
来源:http://socket.io/docs/server-api/#server#path%28v:string%29:server
如果您需要两个单独的 socket.io 应用程序,您可以通过在客户端初始化 socket.io 时设置(未记录的)path
选项来执行此操作。
为了保持一致,我将为您提供 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
}
app1.js 和 app2.js(表达+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);
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>
因此,如果您同时启动 app1.js
和 app2.js
并导航到
http://demo.someserver.com/appOne
然后
http://demo.someserver.com/appTwo
您将在您的控制台中分别看到 1111
和 2222
,这意味着您有两个独立的 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/;
}
所以我在这里要做的是将 appOne 运行ning 放在 demo.someserver.com/appOne 的子文件夹中,并将 appTwo 运行ning 放在子文件夹中在 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/;
}
但我不知道这到底是怎么回事。任何指示或有人试图做同样的事情吗?
所以我的问题是 - 如何通过反向代理与 socket.io 建立单独的连接。或者我应该有一个 socket.io 连接并且都连接到那个? (但我可以在一台服务器上有多个客户端)
您可以在脚本中将自定义路径设置为 socket.io
。
Sets the path v under which engine.io and the static files will be served. Defaults to /socket.io.
If no arguments are supplied this method returns the current value.
来源:http://socket.io/docs/server-api/#server#path%28v:string%29:server
如果您需要两个单独的 socket.io 应用程序,您可以通过在客户端初始化 socket.io 时设置(未记录的)path
选项来执行此操作。
为了保持一致,我将为您提供 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
}
app1.js 和 app2.js(表达+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);
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>
因此,如果您同时启动 app1.js
和 app2.js
并导航到
http://demo.someserver.com/appOne
然后
http://demo.someserver.com/appTwo
您将在您的控制台中分别看到 1111
和 2222
,这意味着您有两个独立的 socket.io 应用程序。