插件窝 干货文章 怎么实现nginx+tomcat的反向代理与动静分离

怎么实现nginx+tomcat的反向代理与动静分离

Tomcat Nginx 配置 静态 404    来源:    2025-04-21

Nginx + Tomcat 反向代理与动静分离实现方案

一、基本概念

1. 反向代理

反向代理是指代理服务器接收客户端请求,然后将请求转发给内部服务器,并将内部服务器的响应返回给客户端。客户端并不知道真正处理请求的是哪台服务器。

2. 动静分离

动静分离是指将动态内容(如JSP、Servlet等)和静态资源(如HTML、CSS、JS、图片等)分开处理,通常静态资源由Web服务器(如Nginx)直接处理,动态内容则转发给应用服务器(如Tomcat)处理。

二、实现步骤

1. 环境准备

  • 安装Nginx
  • 安装Tomcat
  • 确保两者可以正常运行

2. Nginx配置反向代理

编辑Nginx配置文件(通常位于/etc/nginx/nginx.conf/usr/local/nginx/conf/nginx.conf):

http {
    # 定义upstream,可以配置多个Tomcat实例实现负载均衡
    upstream tomcat_server {
        server 127.0.0.1:8080;  # Tomcat默认端口
        # server 192.168.1.2:8080 weight=2;  # 可以添加更多Tomcat实例
    }

    server {
        listen 80;
        server_name yourdomain.com;

        # 静态资源处理
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|ttf|svg)$ {
            root /path/to/static/files;  # 静态文件存放路径
            expires 30d;  # 缓存时间
        }

        # 动态请求转发到Tomcat
        location / {
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 可选:WebSocket支持
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

3. Tomcat配置

确保Tomcat可以正常处理动态请求,通常不需要额外配置。但可以考虑:

  1. 修改server.xml中的Connector配置:
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           proxyName="yourdomain.com" 
           proxyPort="80"/>
  1. 在应用中正确获取客户端真实IP(因为经过Nginx转发后,Tomcat看到的是Nginx的IP):
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
}

4. 静态资源部署

将静态资源(HTML、CSS、JS、图片等)放在Nginx配置中指定的静态文件目录(如/path/to/static/files)中。

5. 测试与验证

  1. 重启Nginx和Tomcat:
sudo nginx -s reload  # 重新加载配置
sudo systemctl restart tomcat  # 重启Tomcat
  1. 测试静态资源访问:

    • 直接访问静态资源URL(如http://yourdomain.com/style.css
    • 应该直接从Nginx返回,不经过Tomcat
  2. 测试动态请求:

    • 访问应用URL(如http://yourdomain.com/app
    • 请求应该被转发到Tomcat处理

三、高级配置选项

1. 负载均衡

可以配置多个Tomcat实例实现负载均衡:

upstream tomcat_servers {
    server 192.168.1.101:8080 weight=3;
    server 192.168.1.102:8080 weight=2;
    server 192.168.1.103:8080 weight=1;
}

2. 健康检查

upstream tomcat_servers {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;

    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

3. 缓存控制

location ~ .*\.(html|htm)$ {
    root /path/to/static/files;
    expires 1h;  # 缓存1小时
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    root /path/to/static/files;
    expires 30d;  # 缓存30天
}

location ~ .*\.(js|css)?$ {
    root /path/to/static/files;
    expires 7d;  # 缓存7天
}

4. Gzip压缩

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

四、常见问题解决

  1. 502 Bad Gateway错误

    • 检查Tomcat是否运行
    • 检查Nginx配置中的proxy_pass地址是否正确
    • 检查防火墙设置
  2. 静态资源404错误

    • 检查Nginx配置中的root路径是否正确
    • 检查文件权限
  3. 获取不到真实客户端IP

    • 确保Nginx配置了X-Real-IPX-Forwarded-For头部
    • 确保应用代码正确读取这些头部
  4. WebSocket无法连接

    • 确保添加了WebSocket特定的proxy设置

通过以上配置,您可以实现Nginx作为反向代理服务器处理静态资源,并将动态请求转发给Tomcat处理的动静分离架构,从而提高网站性能和安全性。