APACHE 反向代理中的 Web 套接字

Posted

技术标签:

【中文标题】APACHE 反向代理中的 Web 套接字【英文标题】:Web Socket in APACHE Reverse Proxy 【发布时间】:2020-08-05 15:12:51 【问题描述】:

我在后面运行两台服务器和 AEBS 基站。 Server1 运行 10.12.6 和 Server 5.3.1 并使用 webapps 执行反向代理,如前体.ca 教程中所述。 这使我只有一个外部 IP 地址,其中 server1.mydomain 和 server2.mydomain 在内部进行分发。 这工作正常.. 但在 server2 上我运行 Filemaker Webdirect,它使用 Web 套接字。所以我在浏览器中得到一个 wss:// 错误。 我写的网络应用程序;

来自http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass

RewriteEngine On

RewriteCond %HTTPS =off
RewriteRule . - [E=protocol:http,E=port:80]
RewriteCond %HTTPS =on
RewriteRule . - [E=protocol:https,E=port:443]

SSLProxyEngine on
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPreserveHost On
ProxyPassReverse / http://1.2.3.4:443/
ProxyPass / http://1.2.3.4:443/
ServerName filemaker.precursor.ca

显然把我自己的server2的IP地址和它的名字..

但是 web 套接字 wss://server2.mydomain 不起作用.. 并且 web 直接失败。

我可以登录,但是一旦我打开一个 wss 连接,它就不再工作了。 .这是一个apache mod_proxy错误..

在我阅读的 apache 错误日志中 [Sun Apr 19 21:58:04.846046 2020] [proxy_http:error] [pid 598] (70008)部分结果有效但处理不完整:[client 189.62.112.162:49213] AH01110: error reading response

在我阅读的浏览器中

WebSocket connection to 'wss://fmserver.embatek.com.br/fmi/webd/PUSH?v-uiId=1&v-pushId=341172cf-5d45-454d-972e-3029de5807fa&X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.3.2.vaadin1-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true' failed: Unexpected response code: 500

关于在哪里摆弄的任何提示。 你的 皮埃尔

【问题讨论】:

【参考方案1】:

时间久了,可能已经解决了。

我刚刚遇到了同样的问题。我在我的环境中使用了 nginx,但是通过将以下值传递给服务器来解决它。

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;

nginx中的最终代码如下

upstream filemakerserver-webdirect-upstream 
  server xxxxxx.xxx:443;


server 
  listen 80;
  server_name yyyyyy.yyy;

  if ($host = yyyyyy.yyy) 
    return 301 https://$host$request_uri;
  

  return 404;


server 
  listen 443 http2 ssl;
  server_name yyyyyy.yyy;

  location / 
    try_files $uri @filemakerserver-webdirect-upstream;
  

  location @filemakerserver-webdirect-upstream 
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache_bypass $http_upgrade;
    proxy_pass https://branch-office;
  

  ssl_certificate /etc/letsencrypt/live/yyyyyy.yyy/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/yyyyyy.yyy/privkey.pem;

以下是我用日语写的一篇文章。

https://qiita.com/Hi_Noguchi/items/82bc17913b646bd6583f

我希望这对 apache 环境有所帮助。

【讨论】:

【参考方案2】:

我使用的是 apache,并且安全连接在代理处停止,所以我想如果您的 FileMaker 服务器使用的是安全连接。 10.1.2.3 是 FileMaker 服务器的内部地址。这里可能有一些多余的东西,但它有效

<IfModule mod_ssl.c>
<VirtualHost *:443>
  ServerName my.external.server.name

  RewriteEngine on
  RewriteCond $HTTP:Upgrade websocket [NC]
  RewriteCond $HTTP:Connection upgrade [NC]
  RewriteRule /(.*) "ws://10.1.2.3:80/$1" [P,L]

  # <Location />
    ProxyPreserveHost On

    ProxyPass "/fmi/webd/PUSH" "ws://10.1.2.3:80/fmi/webd/PUSH"
    ProxyPassReverse "/fmi/webd/PUSH" "ws://10.1.2.3:80/fmi/webd/PUSH"

    ProxyPass / http://10.1.2.3:80/
    ProxyPassReverse / http://10.1.2.3:80/

    # Order allow,deny
    # Allow from all
  # </Location>
SSLCertificateFile /etc/letsencrypt/live/my.external.server.name/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my.external.server.name/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/my.external.server.name/chain.pem
</VirtualHost>
</IfModule>

【讨论】:

以上是关于APACHE 反向代理中的 Web 套接字的主要内容,如果未能解决你的问题,请参考以下文章

Apache 反向代理 Unix 套接字

apache配置反向代理+websocket

干货!传说中的反向代理

apache做反向代理服务器

Apache 做反向代理服务器

建策百科干货!传说中的反向代理