我在 aws ec2 实例前使用负载均衡器(将来我会有更多)。在这个 ec2 中,我有一个由 nginx 在端口 80 上提供服务的网站,一个在 8080 上监听的 nodejs 应用程序和在 4555 上的 websocket。
我的 nginx.conf 有根据位置传递请求的规则/如您所见:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
root /var/www/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#try_files $uri $uri/ @rewrite;
# location @rewrite {
# rewrite ^/(.*)$ /index.php?param=$1;
#}
location /api {
proxy_pass http://127.0.0.1:8080;
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 /chat {
proxy_pass http://127.0.0.1:4555;
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;
}
}
当我将连接直接重定向到实例时它可以工作,但是现在我们在前面有了负载均衡器,它就不再工作了。
Web 应用程序输出:
WebSocket 与 'wss://www.domain.com/socket.io/?EIO=3&transport=websocket' 连接失败:WebSocket 握手期间出错:意外响应代码:200
这是标题:
Request URL: wss://www.domain.com/socket.io/?EIO=3&transport=websocket
Request Method: GET
Status Code: 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: keep-alive
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 May 2019 18:53:37 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Server: nginx/1.14.1
Transfer-Encoding: chunked
X-Powered-By: PHP/5.6.40
Accept-Encoding: gzip, deflate, br
Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: Upgrade
Cookie: PHPSESSID=a6v5ebp25cajb1dj9s6je605a3
Host: www.domain.com
Origin: https://www. domain.com
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: kmYaufsBu3UFD+qGm1vlGA==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
EIO: 3
transport: websocket