如何配置Apache反向代理同时支持HTTPS网站与WSS Websocket服务
问题根因
你当前的配置存在3个核心错误:
- 443端口的虚拟主机未配置SSL证书参数,导致HTTPS访问时触发证书不安全报错
- 443端口的虚拟主机只配置了WebSocket相关代理规则,没有配置普通HTTP请求的反向代理指向网站服务的8030端口
- WebSocket匹配的Rewrite规则变量语法错误,代理跳转逻辑冗余,会导致不必要的请求回环
前置检查
首先确保Apache已经启用必要模块,Debian/Ubuntu执行以下命令启用:
a2enmod proxy proxy_http proxy_wstunnel rewrite ssl
CentOS/RHEL修改httpd.conf加载对应模块即可。
修正后的完整配置
<VirtualHost *:80> ServerName app.mydomain.com # 80端口直接跳转HTTPS,无需冗余代理配置 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 # SSL证书配置,替换为你实际的证书文件路径 SSLEngine on SSLCertificateFile /path/to/your/fullchain.pem SSLCertificateKeyFile /path/to/your/privkey.pem # 如证书服务商要求提供证书链,取消下方注释填写对应路径 # SSLCertificateChainFile /path/to/chain.pem # 修复WebSocket匹配规则,匹配后直接代理到后端WS服务 RewriteEngine on RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] RewriteRule ^/app/(.*) ws://10.160.x.x:6001/app/$1 [P,L] # 长路径规则在前,优先匹配/app前缀的WebSocket请求 ProxyPass /app/ ws://10.160.x.x:6001/app/ ProxyPassReverse /app/ ws://10.160.x.x:6001/app/ # 剩余所有请求代理到网站服务的8030端口 ProxyPreserveHost on ProxyPass / http://10.160.x.x:8030/ ProxyPassReverse / http://10.160.x.x:8030/ ProxyRequests off </VirtualHost>
生效操作
修改完配置后执行语法检查:
# Debian/Ubuntu apache2ctl configtest # CentOS/RHEL httpd -t
确认语法无报错后重载Apache服务即可生效。
内容的提问来源于stack exchange,提问作者naghal
相关产品推荐
相关产品推荐

