You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:06:04