动静分离是提高Web应用性能的常用策略,通过让Nginx处理静态内容,Apache/Tomcat处理动态内容,可以显著提升服务器性能。以下是具体配置方法:
客户端 → Nginx(静态请求) → Apache(动态请求)
server {
listen 80;
server_name example.com;
# 静态资源处理
location ~* \.(jpg|jpeg|gif|png|css|js|ico|html|txt)$ {
root /var/www/html;
expires 30d;
access_log off;
}
# 动态请求转发到Apache
location / {
proxy_pass http://127.0.0.1:8080; # Apache监听端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
确保Apache监听与Nginx不同的端口(如8080):
Listen 8080
客户端 → Nginx(静态请求) → Tomcat(动态请求)
server {
listen 80;
server_name example.com;
# 静态资源处理
location ~* \.(jpg|jpeg|gif|png|css|js|ico|html|txt)$ {
root /var/www/html;
expires 30d;
access_log off;
}
# 动态请求转发到Tomcat
location / {
proxy_pass http://127.0.0.1:8080; # Tomcat默认端口
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 port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
proxyName="example.com"
proxyPort="80"/>
# 静态资源缓存
location ~* \.(jpg|jpeg|gif|png|css|js|ico|html|txt)$ {
root /var/www/html;
expires max;
add_header Cache-Control "public";
access_log off;
}
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_proxied any;
upstream backend {
server 127.0.0.1:8080 weight=5; # Apache/Tomcat
server 192.168.1.100:8080; # 其他服务器
keepalive 32;
}
server {
# ...其他配置...
location / {
proxy_pass http://backend;
# ...其他proxy设置...
}
}
检查Nginx配置语法:
nginx -t
重启Nginx服务:
systemctl restart nginx
测试静态资源是否由Nginx直接提供
问题1:静态资源返回404 - 检查Nginx配置中的root路径是否正确 - 确保静态文件存在于指定目录 - 检查文件权限
问题2:动态请求未被转发 - 检查proxy_pass地址是否正确 - 确认后端服务(Apache/Tomcat)正在运行 - 检查防火墙设置,确保端口可访问
问题3:CSS/JS加载但样式不生效 - 检查资源路径是否正确(相对/绝对路径) - 确保Content-Type头设置正确
通过以上配置,您可以实现高效的动静分离架构,充分发挥Nginx处理静态资源的高性能优势,同时保留Apache/Tomcat处理动态请求的能力。