之前一直用同样的方式连接后端服务, 是正常使用的。 如
location ^~/prod-api/ {
proxy_pass http://$api_host:$api_port;
......
}
连接 http://$api_host:8877/ws/ 就会异常
server {
listen 443 ssl;
set $api_host api;
..........
location /ws/ {
proxy_pass http://$api_host:8877/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_connect_timeout 90s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
send_timeout 120s;
}
}
设置 http://api:8877/ws/ 正常
server {
listen 443 ssl;
set $api_host api;
..........
location /ws/ {
proxy_pass http://api:8877/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_connect_timeout 90s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
send_timeout 120s;
}
}
在 nginx 容器内两种设置的抓包截图: https://imgur.com/a/XzyNFQ6
搞不清楚是什么原因导致这种情况,为什么不能这样配。想请教下大家
贴上完整配置
server {
listen 443 ssl;
client_max_body_size 20M;
index index.html;
ssl_certificate /etc/nginx/templates/1.pem;
ssl_certificate_key /etc/nginx/templates/1-key.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
server_name ${NGINX_HOST};
index index.html;
set $api_port 8877;
set $api_host api;
#add_header Access-Control-Allow-Origin *;
#add_header Access-Control-Allow-Credentials true;
#add_header Access-Control-Allow-Methods GET,POST;
location / {
expires off;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
#try_files $uri $uri/ /index.html;
index index.html;
root /www/dist/;
server_tokens off;
}
location /ws/ {
proxy_pass http://$api_host:8877/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_connect_timeout 90s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
send_timeout 120s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded $proxy_add_x_forwarded_for;
}
location ^~/prod-api/ {
rewrite ^/prod-api/(.*)$ /$1 break;
proxy_set_header X-Forwarded-Proto $scheme;
# proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded $proxy_add_x_forwarded_for;
proxy_pass http://$api_host:$api_port;
字数超了。。。。。。。。
}
}
}
1
msg7086 156 天前
set 指令可能是在 proxy_pass 之后执行的。
纯粹猜测,你可以做做实验或者查一下资料。 Nginx 的配置文件,归根结底是配置而不是程序,不要总是期望写在上面的会比写在下面的早执行。 |
2
msg7086 156 天前
另外你可以看看能不能用 upstream 代替 set 来设置变量。upstream 应该是在很靠前的阶段执行的。
|
3
rrfeng 156 天前
完整配置贴出来看看
|
4
Hanada 149 天前 1
proxy_pass 的值有变量的话 nginx 的处理逻辑是不一样的。如果有接变量的话,nginx 不会再帮你附加原始请求 uri 进去,所以你异常那个就变成固定使用/ws/回上层了。如果你一定要用变量,可以考虑这样写
proxy_pass http://$api_host:8877$request_uri; 另外不建议无脑给 Connection 头写死设置 Upgrade ,可以参考 nginx 官方第二种写法,用 map 来指定 https://nginx.org/en/docs/http/websocket.html |