这个配置显示 404 错误的主要原因是 静态文件冲突 和 代理配置问题。以下是分析和解决方案:
问题分析
1. 静态文件冲突
root /var/www/html;
location / {
try_files $uri $uri/ =404; # 先查找静态文件,找不到才返回404
proxy_pass http://127.0.0.1:8080;
}
问题:Nginx 会先尝试在 /var/www/html 目录下查找文件,如果找不到才代理到 Java 应用。
2. Java 应用路径不匹配
Java 应用可能期望在根路径 / 访问,但静态文件干扰了请求转发。
解决方案
方案1:直接代理所有请求(推荐)
server {
listen 80;
server_name _;
# 移除静态文件根目录
# root /var/www/html;
location / {
# 直接代理到 Java 应用,不检查静态文件
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时控制
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 等保要求:安全头部
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
}
# 等保要求:禁止敏感文件访问
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
方案2:保留静态文件服务(如果需要)
server {
listen 80;
server_name _;
root /var/www/html;
location / {
# 优先尝试静态文件,不存在则代理到 Java 应用
try_files $uri @java_app;
}
location @java_app {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 静态资源安全配置
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
调试步骤
1. 检查 Java 应用状态
# 检查应用是否在运行
ps aux | grep phoneCard-admin.jar
# 检查端口监听
netstat -tlnp | grep 8080
# 直接测试应用
curl http://127.0.0.1:8080
2. 检查 Nginx 错误日志
tail -f /var/log/nginx/error.log
3. 重新加载 Nginx 配置
# 测试配置语法
sudo nginx -t
# 重新加载配置
sudo systemctl reload nginx
# 或
sudo nginx -s reload
完整的简化配置(推荐使用)
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
location ~ /\. {
deny all;
}
}
使用方案1的简化配置应该能解决 404 问题。如果仍有问题,请检查 Java 应用是否正常运行在 8080 端口。