nginx - 当proxy_pass通过2个nginx时Websocket 404
问题描述
我试图让 websockets(socket.io)通过 2 个 proxy_pass 和 2 个不同的服务器(一个是服务器负载平衡器,另一个是实际服务器)工作。当 socket.io 尝试时,我得到 400
在这种情况下,我有两台服务器,一台 domainName :
domainName : dev-socket.domain.com -> cname 到 lb.domain.com
服务器 1:lb.domain.com - 处理所有认证 - 处理我们所有的 {subdomain}.domain.com 请求,将它们代理传递给正确的服务器 - 一切正常,除了 websockets
服务器 2:dev.domain.com - 托管处理所有 websocket 的实际 api - nginx proxyPass 到 rightfull :port 应用程序
什么应该起作用,而不是:
dev-socket.domain.com (domainName) -> lb.domain.com (Server1, ssl) -> dev.domain.com (server2) -> nodeJsApp
这得到了400。
工作原理:如果我绕过 lb.domain.com 并直接执行此操作,则此方法有效: dev-socket.domain.com (domainName) -> dev.domain.com (server2, ssl) -> nodeJsApp
服务器 1:lb.domain.com:
map $http_connection $upgrade_requested {
default upgrade;
'' close;
}
server {
listen 80;
listen 443 ssl http2;
server_name dev-socket.domain.com;
access_log /var/log/nginx/dev-socket.domain.com-access.log;
error_log /var/log/nginx/dev-socket.domain.com-error.log error;
client_max_body_size 256M;
ssl_certificate /etc/letsencrypt/live/dev-
socket.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dev-
socket.domain.com/privkey.pem;
includeSubDomains; preload";
location /socket/live {
proxy_read_timeout 120;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://91.121.117.17/socket/live;
}
location / {
proxy_pass http://server_dev;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
location ~ ^/.well-known/acme-challenge/ {
allow all;
default_type "text/plain";
root /usr/share/nginx/html/;
}
}
服务器 2:dev.domain.com
map $http_connection $upgrade_requested {
default upgrade;
'' close;
}
server {
listen *:443;
server_name dev-socket.domain.com;
#ssl_certificate /etc/letsencrypt/live/dev-socket.domain.com/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/dev-socket.domain.com/privkey.pem;
#ssl on;
client_max_body_size 5M;
access_log /var/log/nginx/dev-socket.domain.com;
error_log /var/log/nginx/dev-socket.error;
location /socket/live {
proxy_pass http://localhost:3000;
proxy_read_timeout 120;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen *:80;
server_name dev-socket.domain.com;
if ($http_x_forwarded_proto != "https") {
return 301 https://$server_name$request_uri;
}
access_log /var/log/nginx/dev-socket.domain.com;
error_log /var/log/nginx/dev-socket.error;
location / {
proxy_pass http://localhost:3000;
}
}
上面的配置在握手期间得到一个简单的 400 错误,而不是成功。
WebSocket connection to 'wss://dev-socket.domain.com/socket/live/?Auth=e02b7a2ab5c158d7f46c18d36f45955bf3769716&sessionId=5a38e191fc6bf8602001b237&EIO=3&transport=websocket&sid=Fu6M2b1I9sh9stLFAANX' failed: Error during WebSocket handshake: Unexpected response code: 400
我可以通过检查两个 nginx(server1、server2)的活动日志来确认请求正在到达 server2。所以我目前的猜测是关于格式错误的标题..
如前所述,如果我绕过 lb.domain.com,并在 dev.domain.com 目录上激活 ssl,它就可以工作
解决方案
推荐阅读
- .net-core - 删除迁移和更新数据库实体框架核心时出错 从流中读取时出错
- reactjs - 如何配置 React 客户端、.NET Core 3.1 后端、单租户 SSO
- drake - np.linalg.solve() 是否不适用于 AutoDiff?
- r - 围绕 data.table 中的特定值对时间序列进行子集化
- java - java中的正则表达式(java字符串)
- html - 为什么我的页脚内的 2 个 div 进入不同的角落?
- c++ - std::function 来自“new”并输入
- java - 在 .war 中编译一个 java 类
- mysql - MySQL根据下一个和上一个项目查询订单项目
- ios - 为什么我的列分隔符不在我的 Swift Xcode 项目的表格视图中排列?