使用apache代理WebSocket连接(wss)到其他Nginx代理

时间:2019-02-27 20:23:14

标签: apache nginx websocket proxy

我有一个独特的问题。我的网站托管在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的请求应该很简单。有人发现这种配置或方法有问题吗?

0 个答案:

没有答案