在 Java Web 项目中,Tomcat 通常作为应用服务器(处理 JSP / Servlet / Spring 等 Java 请求),而 Nginx 作为反向代理服务器(处理静态资源、负载均衡、HTTPS 等)。下面从架构、配置、常见用法三个方面说明如何集成。
客户端
↓
Nginx(80 / 443)
↓ 反向代理
Tomcat(8080)
conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Tomcat 不需要直接对外网开放 8080。
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
✅ 此时访问 http://www.example.com 等价于 http://localhost:8080
location ~* \.(js|css|png|jpg|gif|ico|html)$ {
root /opt/tomcat/webapps/ROOT;
expires 30d;
}
动态请求仍然转发 Tomcat:
location / {
proxy_pass http://127.0.0.1:8080;
}
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
location / {
root /opt/tomcat/webapps/ROOT;
index index.html;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Forwarded-Proto https;
}
}
Tomcat 中可通过:
request.getScheme(); // https
正确识别协议。
在 server.xml 中启用:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto" />
否则 Java 中拿到的 IP 永远是 127.0.0.1
upstream tomcat_cluster {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
location / {
proxy_pass http://tomcat_cluster;
}
}
❌ Tomcat 和 Nginx 同时监听 80
✅ 只让 Nginx 监听 80/443
❌ Java 中 request.getRemoteAddr() 是 127.0.0.1
✅ 使用 X-Forwarded-For
❌ 静态资源走 Tomcat
✅ 静态资源交给 Nginx
Nginx 负责“门面”,Tomcat 负责“业务”
如果你愿意,我可以:
你现在是 传统 Tomcat 项目 还是 Spring Boot?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。