如何配置 apache 反向代理网站和 websocket 服务器
How to configure apache to reverse proxy a website and a websocket server
我在 docker 有一个网站 运行,通过反向代理在 https 中提供服务。
该应用程序使用另一个容器中同一服务器上的 websocket 服务器。
我可以让应用程序在 https 或 websocket 中工作,以正确地将 wss 请求代理到后端 ws 服务器。
这是一个小架构:
每当我将第二个虚拟主机添加到我的配置时,我现在可以成功连接到 wss://app.mydomain.com
,但是 https://app.mydomain.com
上的应用程序变得不安全并且无法正常访问。
如果我删除它,我可以使用 https 访问该应用程序,但无法连接到 wss。
这是我的 Apache 配置:
<VirtualHost *:80>
ServerName app.mydomain.com
ProxyPreserveHost on
ProxyPass / http://10.160.x.x:8030/
ProxyPassReverse / http://10.160.x.x:8030/
#ProxyPass /app/ ws://10.160.x.x:6001/app/
#ProxyPassReverse /app ws://10.160.x.x:6001/app
RewriteEngine on
RewriteCond %{SERVER_NAME} =app.mydomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerName app.mydomain.com
RewriteEngine on
RewriteCond ${HTTP:Upgrade} websocket [NC]
RewriteCond ${HTTP:Connection} upgrade [NC]
RewriteRule .* "wss://app.mydomain.com/" [P,L]
ProxyPass /app/ ws://10.160.x.x:6001/app/
ProxyPassReverse /app/ ws://10.160.x.x:6001/app/
ProxyRequests off
</VirtualHost>
如何编辑配置文件以通过 https 访问网站,同时能够连接到 websocket 服务器?
这就是最终起作用的方法:
<VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =app.mydomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerName app.mydomain.com
ProxyPreserveHost on
RewriteEngine on
RewriteCond ${HTTP:Upgrade} websocket [NC]
RewriteCond ${HTTP:Connection} upgrade [NC]
RewriteRule .* "wss://app.mydomain.com/" [P,L,END]
ProxyPass /app/ ws://10.160.x.x:6001/app/
ProxyPassReverse /app/ ws://10.160.x.x:6001/app/
ProxyPreserveHost on
ProxyPass / http://10.160.x.x:8030/
ProxyPassReverse / http://10.160.x.x:8030/
SSLCertificateFile /etc/letsencrypt/live/app.mydomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/app.mydomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/app.mydomain.com/chain.pem
</VirtualHost>
我在 docker 有一个网站 运行,通过反向代理在 https 中提供服务。 该应用程序使用另一个容器中同一服务器上的 websocket 服务器。
我可以让应用程序在 https 或 websocket 中工作,以正确地将 wss 请求代理到后端 ws 服务器。
这是一个小架构:
每当我将第二个虚拟主机添加到我的配置时,我现在可以成功连接到 wss://app.mydomain.com
,但是 https://app.mydomain.com
上的应用程序变得不安全并且无法正常访问。
如果我删除它,我可以使用 https 访问该应用程序,但无法连接到 wss。
这是我的 Apache 配置:
<VirtualHost *:80>
ServerName app.mydomain.com
ProxyPreserveHost on
ProxyPass / http://10.160.x.x:8030/
ProxyPassReverse / http://10.160.x.x:8030/
#ProxyPass /app/ ws://10.160.x.x:6001/app/
#ProxyPassReverse /app ws://10.160.x.x:6001/app
RewriteEngine on
RewriteCond %{SERVER_NAME} =app.mydomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerName app.mydomain.com
RewriteEngine on
RewriteCond ${HTTP:Upgrade} websocket [NC]
RewriteCond ${HTTP:Connection} upgrade [NC]
RewriteRule .* "wss://app.mydomain.com/" [P,L]
ProxyPass /app/ ws://10.160.x.x:6001/app/
ProxyPassReverse /app/ ws://10.160.x.x:6001/app/
ProxyRequests off
</VirtualHost>
如何编辑配置文件以通过 https 访问网站,同时能够连接到 websocket 服务器?
这就是最终起作用的方法:
<VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =app.mydomain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
ServerName app.mydomain.com
ProxyPreserveHost on
RewriteEngine on
RewriteCond ${HTTP:Upgrade} websocket [NC]
RewriteCond ${HTTP:Connection} upgrade [NC]
RewriteRule .* "wss://app.mydomain.com/" [P,L,END]
ProxyPass /app/ ws://10.160.x.x:6001/app/
ProxyPassReverse /app/ ws://10.160.x.x:6001/app/
ProxyPreserveHost on
ProxyPass / http://10.160.x.x:8030/
ProxyPassReverse / http://10.160.x.x:8030/
SSLCertificateFile /etc/letsencrypt/live/app.mydomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/app.mydomain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/app.mydomain.com/chain.pem
</VirtualHost>