AWS EC2上配置Apache反向代理转发到NodeJS应用返回404如何解决
问题核心原因
你当前的404错误是因为HTTPS 443端口的请求没有被转发到NodeJS服务:你把443虚拟主机里的代理配置全注释了,HTTPS请求直接落到Apache默认站点目录/var/www/html,找不到对应路径自然返回404。另外80端口的代理配置完全冗余,因为你已经配置了80端口所有请求跳转到HTTPS,这部分配置不会生效。
调整步骤
第一步:修改/etc/httpd/conf/httpd.conf
删掉80端口虚拟主机里无效的代理配置,修改后内容如下:
Listen 80 <VirtualHost *:80> DocumentRoot "/var/www/html" ServerName "MyDOMAIN.net" ServerAlias "www.MyDOMAIN.net" RewriteEngine on RewriteCond %{SERVER_NAME} =MyDOMAIN.net [OR] RewriteCond %{SERVER_NAME} =www.MyDOMAIN.net RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
第二步:无需修改/etc/httpd/conf.d/ssl.conf
你已经添加的SSLProxyEngine on配置正确,保持不变即可。
第三步:修改/etc/httpd/conf/httpd-le-ssl.conf
取消代理配置的注释,同时删除冗余的DocumentRoot配置避免冲突,修改后内容如下:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName "MyDOMAIN.net" ServerAlias "www.MyDOMAIN.net" SSLEngine on ProxyPreserveHost On ProxyPass / https://localhost:3000/ ProxyPassReverse / https://localhost:3000/ # 若后续将NodeJS改为HTTP监听,可将上面两行的地址改为http://localhost:3000/ Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/MyDOMAIN.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/MyDOMAIN.net/privkey.pem </VirtualHost> </IfModule>
第四步:验证配置并重启服务
首先确认Apache必要模块已启用:
httpd -M | grep -E 'proxy|rewrite'
若输出中没有proxy_module、proxy_http_module、proxy_ssl_module、rewrite_module,先启用对应模块。
随后验证配置语法正确性:apachectl configtest
返回Syntax OK后重启Apache生效:systemctl restart httpd
可选优化(推荐)
NodeJS无需自行配置HTTPS证书,Apache已经完成SSL卸载,直接用HTTP监听3000端口可降低不必要的性能损耗,修改app.js代码如下:
const express = require('express') const logger = require('./middleware/logger') const app = express() const port = process.env.PORT || 3000 require('./startup/loggin')() require('./startup/routes')(app) require('./startup/database').connect() require('./startup/config')() require('./startup/validation')() app.listen(port, logger.log('info', `Listening to port ${port}...`))
修改后同步将httpd-le-ssl.conf里的代理地址改为http://localhost:3000/,重启Apache即可。
内容的提问来源于stack exchange,提问作者Shahriyar
相关产品推荐
相关产品推荐

