在 Debian 上让 Apache 支持 Node.js 的推荐做法
在 Debian 上,最佳实践是让 Apache 充当反向代理,将请求转发到运行在 localhost 的 Node.js 服务(如端口 3000)。这样既能利用 Apache 的成熟生态(虚拟主机、TLS、压缩、缓存等),又能让 Node.js 专注于业务逻辑与长连接场景(如 WebSocket)。核心思路是启用 Apache 的 mod_proxy、mod_proxy_http,必要时配合 mod_proxy_wstunnel、mod_headers、mod_rewrite 等模块完成转发与协议升级。
安装与准备
安装 Apache 与常用模块
sudo apt update && sudo apt install apache2sudo a2enmod proxy proxy_http proxy_wstunnel headers rewrite安装并启动 Node.js 应用
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -sudo apt-get install -y nodejsnode -v、npm -vsudo npm install -g pm2pm2 start npm --name "myapp" -- run startpm2 list、pm2 restart myapp、pm2 save && sudo pm2 startup(设置开机自启)配置 Apache 反向代理
创建站点配置
sudo nano /etc/apache2/sites-available/nodeapp.conf<VirtualHost *:80>
ServerName yourdomain.com
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
ErrorLog ${APACHE_LOG_DIR}/nodeapp_error.log
CustomLog ${APACHE_LOG_DIR}/nodeapp_access.log combined
</VirtualHost>
sudo a2ensite nodeapp.confsudo a2dissite 000-default.confsudo apache2ctl configtest && sudo systemctl reload apache2启用 HTTPS(推荐)
sudo apt install certbot python3-certbot-apachesudo certbot --apache -d yourdomain.comWebSocket 与常见场景
WebSocket 代理示例
# WebSocket
ProxyPass /ws/ ws://127.0.0.1:3000/
ProxyPassReverse /ws/ ws://127.0.0.1:3000/
静态资源与路径前缀
Alias /static /var/www/myapp/static
<Directory /var/www/myapp/static>
Require all granted
</Directory>
ProxyPass /api/ http://127.0.0.1:3000/api/
ProxyPassReverse /api/ http://127.0.0.1:3000/api/
排错与优化
curl -I http://127.0.0.1:3000sudo apache2ctl configtesttail -f ${APACHE_LOG_DIR}/nodeapp_error.log