我有一个独特的问题。我的网站托管在Apache服务器上,我需要客户端通过wss和https与另一个应用程序进行通信,对此第二个应用程序的调用通过nginx进行代理。
我的呼叫apache proxy.conf大约是这个
RewriteEngine On
#SSL Proxy
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
#https
RewriteRule ^/https/api/(.*) https://nginx.mydomain.com/api/$1 [P]
ProxyPassReverse /https/api/ https://nginx.mydomain.com/api/
<IfModule mod_proxy_wstunnel.c>
ProxyPass /wss/socket/ wss://nginx.mydomain.com/socket/
ProxyPassReverse /wss/socket/ wss://nginx.mydomain.com/socket/
</IfModule>
然后我在nginx.mydomain.com
上有一个nginx配置
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
return 302 /api/;
}
location /api/ {
proxy_pass http://127.0.0.1:4283/;
client_max_body_size 5m;
}
location /socket/ {
proxy_pass http://127.0.0.1:4284/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
add_header X-Frame-Options deny;
add_header "X-XSS-Protection" "1; mode=block";
add_header X-Content-Type-Options nosniff;
server_tokens off;
}
可以说我打了一个https://apache.mydomain.com/http/api/example
的电话,然后按预期将电话代理到https://nginx.mydomain.com/api/example
。在我的浏览器中,new Websocket("wss://nginx.mydomain.com/socket/");
运行正常。但是调用wss://apache.mydomain.com/socket/
会导致503。值得注意的是,我知道http://*.mydomain.com
如果没有子域附加应用程序,则会返回503。
我也尝试过此脚本
curl --include \
--no-buffer \
--header "Connection: Upgrade" \
--header "Upgrade: websocket" \
--insecure \
https://nginx.mydomain.com/socket/
这会导致nginx发出以下消息
HTTP/1.1 404 WebSocket Upgrade Failure
Date: Wed, 27 Feb 2019 20:19:27 GMT
Content-Type: text/html
Content-Length: 77
Connection: close
Server: nginx
<html><head></head><body><h1>404 WebSocket Upgrade Failure</h1></body></html>
但是仍然从浏览器调用wss://nginx.mydomain.com/socket/
可以打开套接字而不会出现问题。我不知道问题可能在哪里。如果nginx正在代理,则通过Apache向nginx的请求应该很简单。有人发现这种配置或方法有问题吗?