菜单

Loen
发布于 2025-11-07 / 7 阅读
0
0

我的老baby深夜遇到的问题

这个配置显示 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 端口。


评论