最近在帮客户部署一套Java Web应用时,遇到了一个典型场景:需要将Nginx作为前端反向代理,将请求转发到后端的Tomcat容器。这种架构在传统服务器上部署时,往往需要手动配置Nginx和Tomcat的对接参数,过程繁琐且容易出错。而通过Docker容器化部署,可以大幅简化这个流程。
这个方案的核心价值在于:
首先确保宿主机已安装Docker环境。推荐使用以下版本组合:
bash复制# 检查Docker版本
docker --version
# 输出示例:Docker version 20.10.17, build 100c701
注意:生产环境建议使用Docker CE稳定版,避免使用edge版本
对于这个方案,我们需要两个核心镜像:
bash复制# 拉取镜像
docker pull nginx:1.23-alpine
docker pull tomcat:9.0-jdk17-openjdk-slim
推荐使用自定义bridge网络,相比默认bridge提供更好的容器间通信:
bash复制# 创建自定义网络
docker network create web-net
为便于管理,采用以下命名约定:
bash复制docker run -d \
--name app-server \
--network web-net \
-p 8080:8080 \
-v /path/to/webapps:/usr/local/tomcat/webapps \
tomcat:9.0-jdk17-openjdk-slim
关键参数说明:
-v 挂载:将宿主机webapps目录映射到容器,便于部署WAR包--network:加入自定义网络,确保与Nginx容器互通访问 http://localhost:8080 应看到Tomcat默认页。如需部署应用:
bash复制# 示例:部署demo.war
cp demo.war /path/to/webapps/
# Tomcat会自动解压部署
创建 nginx.conf 文件:
nginx复制upstream tomcat {
server app-server:8080;
}
server {
listen 80;
location / {
proxy_pass http://tomcat;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* \.(jpg|png|css|js)$ {
root /var/www/static;
expires 30d;
}
}
配置亮点:
bash复制docker run -d \
--name web-proxy \
--network web-net \
-p 80:80 \
-v /path/to/nginx.conf:/etc/nginx/nginx.conf \
-v /path/to/static:/var/www/static \
nginx:1.23-alpine
在Nginx配置中添加以下proxy参数:
nginx复制proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
为upstream添加健康检查:
nginx复制upstream tomcat {
server app-server:8080 max_fails=3 fail_timeout=30s;
check interval=5000 rise=2 fall=3 timeout=1000;
}
可能原因及解决方案:
bash复制docker logs app-server
bash复制docker exec -it web-proxy ping app-server
bash复制docker inspect app-server | grep -A 10 "Ports"
检查步骤:
bash复制docker exec web-proxy ls /var/www/static
bash复制chmod -R 755 /path/to/static
对于生产环境,建议使用Docker Compose管理多容器:
yaml复制version: '3.8'
services:
nginx:
image: nginx:1.23-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./static:/var/www/static
networks:
- web-net
depends_on:
- tomcat
tomcat:
image: tomcat:9.0-jdk17-openjdk-slim
ports:
- "8080:8080"
volumes:
- ./webapps:/usr/local/tomcat/webapps
networks:
- web-net
networks:
web-net:
driver: bridge
启动命令:
bash复制docker-compose up -d
bash复制# 查看Nginx访问日志
docker logs -f web-proxy
# 查看Tomcat应用日志
docker exec app-server tail -f /usr/local/tomcat/logs/catalina.out
bash复制# 查看容器资源占用
docker stats web-proxy app-server
bash复制docker run --cap-drop ALL --cap-add NET_BIND_SERVICE ...
bash复制docker pull nginx:1.23-alpine
docker pull tomcat:9.0-jdk17-openjdk-slim
nginx复制server {
listen 443 ssl;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
}
在实际部署中,我发现通过将Nginx的access_log和error_log挂载到宿主机特定目录,可以更方便地进行日志分析和归档。另外,对于高并发场景,建议在Nginx配置中适当调整worker_processes和worker_connections参数,通常设置为CPU核心数的1-2倍效果最佳。