同一服务器部署PHP与Node.js应用如何实现跨端口平滑访问
解决方案
最优方案:Apache反向代理(完全隐藏端口,用户无感知访问,无需跨端口跳转)
该方案直接将聊天服务挂载到你现有443端口的域名下,完全不用暴露2053端口,也不需要额外跳转,适配你已有的身份认证逻辑。
步骤1:启用Apache必需模块
执行以下命令启用代理相关模块(适配Debian/Ubuntu环境,CentOS环境请修改Apache配置文件手动加载对应模块):
a2enmod proxy proxy_http proxy_wstunnel rewrite systemctl restart apache2
步骤2:选择适配的代理配置
以下两种配置二选一即可:
配置A:同域名路径代理(无需新增域名)
将聊天服务挂载到主站的/chat路径下,例如访问https://你的域名/chat即可进入聊天功能。将以下配置写入你现有443端口的虚拟主机<VirtualHost *:443>块内:
# 聊天服务HTTP代理 ProxyPass "/chat" "http://127.0.0.1:2053" ProxyPassReverse "/chat" "http://127.0.0.1:2053" # WebSocket支持(聊天类应用基本都需要,必须配置) RewriteEngine On RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] RewriteRule ^/chat/(.*) "ws://127.0.0.1:2053/$1" [P,L]
注意:该配置需要你对Node聊天服务的静态资源路径做适配,添加/chat前缀,或者在Apache配置中补充路径重写规则。
配置B:子域名代理(无需修改Node服务代码)
新增独立子域名例如chat.你的域名指向聊天服务,单独新增以下虚拟主机配置:
<VirtualHost *:443> ServerName chat.yourdomain.com # SSL证书配置和主站保持一致即可 SSLEngine on SSLCertificateFile /path/to/your/ssl/cert.pem SSLCertificateKeyFile /path/to/your/ssl/key.pem # 代理聊天服务 ProxyPass "/" "http://127.0.0.1:2053" ProxyPassReverse "/" "http://127.0.0.1:2053" # WebSocket支持 RewriteEngine On RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] RewriteRule ^/?(.*) "ws://127.0.0.1:2053/$1" [P,L] </VirtualHost>
Cloudflare侧配置:新增一条子域名的A/AAAA解析记录指向你的服务器IP,代理模式和主站保持一致即可,无需开放2053端口的公网访问权限。
步骤3:验证配置并生效
执行配置校验命令,避免语法错误导致服务宕机:
apache2ctl configtest
返回Syntax OK后执行重载命令生效配置:
systemctl reload apache2
备选方案:直接端口跳转(无需修改Apache配置,不隐藏端口)
如果不需要隐藏端口,直接配置互跳逻辑即可:
- PHP站跳转聊天服务:直接跳转至
https://你的域名:2053 - 聊天服务跳转回PHP站:直接跳转至
https://你的域名
注意需要在服务器防火墙和Cloudflare规则中放开2053端口的公网访问权限,Cloudflare原生支持2053端口的HTTPS代理,无需额外调整。
常见问题排查
之前配置虚拟主机宕机基本都是配置语法错误导致,每次修改配置后必须先执行apache2ctl configtest校验,确认无问题后再重载服务即可避免宕机。
内容的提问来源于stack exchange,提问作者interdimenional
相关产品推荐
相关产品推荐

