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

AWS EC2实例上Nginx代理Tomcat时静态资源(CSS/JS/PNG)404错误求助

解决Nginx代理Tomcat时静态资源404的问题

我仔细看了你的配置,发现两个核心问题导致静态资源加载失败:

问题1:同一个Location块同时使用alias和proxy_pass

你的/admin/admin-portal配置里同时包含了本地文件映射(alias)和反向代理(proxy_pass),这两个指令不能共存于同一个location,会让Nginx的请求处理逻辑混乱,要么错误地去本地找文件,要么错误地转发请求。

问题2:正则匹配的Location优先级高于前缀匹配

你配置的location ~ \.css和location ~ \.js会匹配所有.css/.js请求,包括/admin/admin-portal下的资源。由于正则匹配的优先级比前缀匹配高,这些请求会进入这两个location块,而块里没有指定正确的资源路径,导致Nginx用全局的root(/var/lib/tomcat9/webapps/ROOT)去查找,自然找不到Tomcat目录下的资源。


修复方案

我推荐你直接把所有/admin/admin-portal下的请求都代理到Tomcat,这样Tomcat会统一处理静态和动态资源,避免权限和路径问题。具体修改如下:

1. 修正/etc/nginx/conf.d/application.conf的配置

把原来的location /admin/admin-portal块替换成:

location ^~ /admin/admin-portal {
    # 重写路径,去掉/admin/admin-portal前缀,转发给Tomcat
    rewrite ^/admin/admin-portal/(.*)$ /$1 break;
    
    # 设置转发的头信息,让Tomcat能获取真实客户端IP等信息
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 代理到本地Tomcat的8080端口
    proxy_pass http://localhost:8080/;
}
  • 用^~前缀确保这个location的优先级高于正则匹配的.css/.js块,让/admin/admin-portal下的所有请求都走代理。
  • 移除了冲突的alias指令,所有请求直接转发给Tomcat处理。

2. 重启Nginx服务使配置生效

sudo systemctl restart nginx

3. 验证Tomcat状态

确保Tomcat服务正常运行,静态资源确实存在于/opt/tomcat/webapps/ROOT/目录下:

sudo systemctl status tomcat9
ls -l /opt/tomcat/webapps/ROOT/css/ # 替换成你实际的静态资源路径

备选方案:让Nginx直接提供Tomcat的静态资源

如果你更倾向于Nginx直接处理静态资源(性能更好),可以按以下步骤操作:

  1. 调整Tomcat静态资源目录的权限,让Nginx的www-data用户能读取:
sudo chmod -R 755 /opt/tomcat/webapps/ROOT/
sudo chown -R tomcat:www-data /opt/tomcat/webapps/ROOT/
  1. 修改Nginx配置,分离静态资源和动态请求:
# 处理/admin/admin-portal下的静态资源
location ^~ /admin/admin-portal/(css|js|img|fonts)/ {
    alias /opt/tomcat/webapps/ROOT/$1/;
    expires 30d; # 设置缓存,提升性能
}

# 处理/admin/admin-portal下的动态请求
location ^~ /admin/admin-portal {
    rewrite ^/admin/admin-portal/(.*)$ /$1 break;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:8080/;
}

这个方案让Nginx直接提供静态资源,动态请求转发给Tomcat,兼顾性能和功能。


内容的提问来源于stack exchange,提问作者Dinesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:57:41