部署时Apache反向代理Node.js返回404错误,如何排查配置问题?
问题排查与解决方案
核心错误点
<Location>指令参数使用错误<Location>用于匹配用户请求的URL路径,而非服务器本地文件系统路径。你当前配置的<Location /home/example/domains/api.example.com/public_html>意味着只有当用户访问http://api.example.com/home/example/domains/api.example.com/public_html路径时才会触发转发规则,正常访问根路径/时Apache会直接到DocumentRoot目录下查找静态文件,找不到就返回404。- Apache版本权限语法不兼容
你配置的<Proxy *>块中使用的Order deny,allow是Apache 2.2版本的权限控制语法,如果你使用的是2.4及以上版本的Apache,该规则不会生效,可能导致权限拦截返回403/404错误。 - 代理模块未启用的潜在问题
反向代理依赖proxy和proxy_http两个Apache模块,若未启用,所有代理配置都不会生效。
修复后的配置示例
<VirtualHost WW.XX.YY.ZZ:80> SuexecUserGroup "#1004" "#1004" ServerName api.example.com ServerAlias www.api.example.com ServerAlias mail.api.example.com ServerAlias webmail.api.example.com ServerAlias admin.api.example.com DocumentRoot /home/example/domains/api.example.com/public_html ErrorLog /var/log/virtualmin/api.example.com_error_log CustomLog /var/log/virtualmin/api.example.com_access_log combined ScriptAlias /cgi-bin/ /home/example/domains/api.example.com/cgi-bin/ ScriptAlias /awstats/ /home/example/domains/api.example.com/cgi-bin/ DirectoryIndex index.html index.htm index.php index.php4 index.php5 ProxyRequests Off ProxyPreserveHost On ProxyVia Full # 排除不需要转发的内置路径,规则顺序要放在转发规则前面 ProxyPass /cgi-bin ! ProxyPass /awstats ! <Proxy *> # 兼容Apache 2.2/2.4版本的权限配置 Require all granted Order deny,allow Allow from all </Proxy> # 匹配所有根路径下的请求转发到Node.js服务 <Location /> ProxyPass http://localhost:8080/ ProxyPassReverse http://localhost:8080/ </Location> </VirtualHost>
生效操作步骤
- 启用Apache代理模块:
- Debian/Ubuntu系统执行命令:
a2enmod proxy proxy_http - CentOS/RHEL系统需要在
httpd.conf中确认以下两行没有被注释:LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
- Debian/Ubuntu系统执行命令:
- 重启Apache服务使配置生效。
内容的提问来源于stack exchange,提问作者Paul Serre
相关产品推荐
相关产品推荐

