反向代理是指代理服务器接收客户端请求,然后将请求转发给内部服务器,并将内部服务器的响应返回给客户端。客户端并不知道真正处理请求的是哪台服务器。
动静分离是指将动态内容(如JSP、Servlet等)和静态资源(如HTML、CSS、JS、图片等)分开处理,通常静态资源由Web服务器(如Nginx)直接处理,动态内容则转发给应用服务器(如Tomcat)处理。
编辑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";
}
}
}
确保Tomcat可以正常处理动态请求,通常不需要额外配置。但可以考虑:
server.xml
中的Connector
配置:<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
proxyName="yourdomain.com"
proxyPort="80"/>
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();
}
将静态资源(HTML、CSS、JS、图片等)放在Nginx配置中指定的静态文件目录(如/path/to/static/files
)中。
sudo nginx -s reload # 重新加载配置
sudo systemctl restart tomcat # 重启Tomcat
测试静态资源访问:
http://yourdomain.com/style.css
)测试动态请求:
http://yourdomain.com/app
)可以配置多个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;
}
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;
}
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天
}
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;
502 Bad Gateway错误
静态资源404错误
获取不到真实客户端IP
X-Real-IP
和X-Forwarded-For
头部WebSocket无法连接
通过以上配置,您可以实现Nginx作为反向代理服务器处理静态资源,并将动态请求转发给Tomcat处理的动静分离架构,从而提高网站性能和安全性。