Nginx与Tomcat构建动静分离部署方案
概述
在企业级Web应用部署中,将静态资源与动态请求分离是优化性能的重要手段。本文介绍如何通过Nginx处理静态文件请求,Tomcat处理动态业务逻辑,实现高效的动静分离架构。
部署环境
本次部署涉及两台服务器:
- 应用服务器(192.168.1.110):部署Tomcat,运行动态应用
- 静态资源服务器(192.168.1.191):部署Nginx,处理静态文件
第一步:安装配置Tomcat
在应用服务器(192.168.1.110)上安装Tomcat实例。需要配置以下参数:
- 修改服务端口号避免冲突
- 配置jvmRoute用于负载均衡
- 设置Context path
- 调整JVM启动内存参数
在Tomcat的webapps目录下创建www目录,用于存放需要分离的静态文件:
mkdir -p /opt/tomcat8/webapps/www
第二步:配置Rsync同步静态文件
被备份端配置(应用服务器)
安装Rsync服务:
apt-get update
apt-get install gcc make
tar -zxvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/usr/local/rsync && make && make install
创建必要的目录:
mkdir -p /usr/local/rsync/{log,pid,conf,password}
配置文件/usr/local/rsync/conf/rsyncd.conf:
use chroot = no
max connections = 10
pid file = /usr/local/rsync/pid/rsyncd.pid
log file = /usr/local/rsync/log/rsyncd.log
[static_files]
uid = root
gid = root
path = /opt/tomcat8/webapps/www
comment = static backup
read only = no
list = yes
hosts allow = 192.168.1.191/24
auth users = bakuser
secrets file = /usr/local/rsync/password/rsync.pass
创建密码文件:
echo "bakuser:SecurePwd123" > /usr/local/rsync/password/rsync.pass
chmod 600 /usr/local/rsync/password/rsync.pass
启动Rsync守护进程:
/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/conf/rsyncd.conf
验证服务运行状态:
ps -ef | grep rsync
备份端配置(Nginx服务器)
同样安装Rsync后,创建密码文件(仅包含密码):
mkdir -p /usr/local/rsync/password
echo "SecurePwd123" > /usr/local/rsync/password/rsync.pass
chmod 600 /usr/local/rsync/password/rsync.pass
创建静态文件存放目录:
mkdir -p /var/www/staticapp
测试同步功能:
rsync -vzrtopg --progress --password-file=/usr/local/rsync/password/rsync.pass \
bakuser@192.168.1.110::static_files /var/www/staticapp
配置定时同步任务
创建同步脚本/usr/local/rsync/bin/sync_static.sh:
#!/bin/bash
/usr/bin/rsync -vzrtopg --progress --password-file=/usr/local/rsync/password/rsync.pass \
bakuser@192.168.1.110::static_files /var/www/staticapp
设置执行权限并配置Cron定时任务:
chmod +x /usr/local/rsync/bin/sync_static.sh
#每5分钟执行一次同步
*/5 * * * * /bin/sh /usr/local/rsync/bin/sync_static.sh
第三步:部署Web应用
将应用包解压到Tomcat的webapps目录:
cd /opt/tomcat8/webapps
unzip cms-web-app.zip
rm cms-web-app.zip
启动Tomcat并查看日志:
cd /opt/tomcat8/bin
./startup.sh
tail -f ../logs/catalina.out
第四步:配置Nginx反向代理
创建配置文件目录:
mkdir -p /etc/nginx/conf.d/appconfig
配置静态域名(static.example.com)
#/etc/nginx/conf.d/appconfig/static.conf
server {
listen 80;
server_name static.example.com;
root /var/www/staticapp;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 404 500 502 503 504 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
}
配置样式资源域名(styles.example.com)
#/etc/nginx/conf.d/appconfig/styles.conf
server {
listen 80;
server_name styles.example.com;
root /var/www/staticapp/assets;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
expires 30d;
add_header Cache-Control "public, immutable";
}
配置动态应用域名(api.example.com)
#/etc/nginx/conf.d/appconfig/api.conf
upstream tomcat_backend {
server 192.168.1.110:8080 weight=20 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name api.example.com;
root /var/www/html;
index index.html index.htm;
client_max_body_size 300m;
client_body_buffer_size 128k;
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 32 64k;
proxy_busy_buffers_size 128k;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
location / {
proxy_pass http://tomcat_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
加载配置
在Nginx主配置文件中引入子配置:
vim /etc/nginx/nginx.conf
#在http块中添加:
include /etc/nginx/conf.d/appconfig/*.conf;
重启Nginx服务:
service nginx restart
总结
通过以上配置,实现了以下架构:
- Nginx作为前端入口,处理静态资源请求
- 动态请求通过反向代理分发到Tomcat处理
- 静态文件通过Rsync定时同步到Nginx服务器
- 有效降低了Tomcat的并发压力,提升了系统整体性能