一、 nginx 简介
Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,在同类型的网页服务器中表现优异,常用于处理高并发场景。
1. 核心功能
高性能
- 采用事件驱动的异步非阻塞架构(epoll/kqueue),单进程可处理数万并发连接,资源消耗极低。
- 静态文件处理速度极快,适合作为静态资源服务器。
反向代理与负载均衡
- 支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议的代理转发。
- 提供多种负载均衡算法(轮询、IP 哈希、加权负载等),可自动检测后端服务器健康状态。
高可用性
- 支持热部署,更新配置无需重启服务。
- 通过
keepalive
机制减少连接开销,提升稳定性。模块化设计
- 支持丰富的第三方模块(如缓存、压缩、认证等),可扩展性强。
2. 典型应用场景
Web 服务器
- 直接托管静态网站(HTML、CSS、JS、图片等)。
- 通过
fastcgi
模块支持 PHP 等动态语言(需配合后端服务)。反向代理与负载均衡
- 作为前端代理服务器,隐藏真实后端服务器,提升安全性。
- 分摊流量到多个后端服务器,避免单点故障。
HTTP 终端代理
- 集中处理 SSL/TLS 加密,降低后端服务器负载。
API 网关
- 实现请求路由、限流、鉴权等功能。
3. 对比 apache
特性 Nginx Apache 架构 事件驱动(异步非阻塞) 多进程 / 线程(同步阻塞) 并发处理 高(单进程数万连接) 中等(受进程 / 线程数限制) 资源消耗 低 高 模块扩展 需编译时添加 运行时动态加载 配置复杂度 简洁(基于块结构) 灵活但复杂
4.适用场景
- 高并发场景:如电商大促、流量突发的网站。
- 微服务架构:作为 API 网关或服务间的负载均衡器。
- 静态资源服务:托管前端项目、CDN 节点等。
5. 基础配置示例
以下是一个简单的 Nginx 配置文件片段,展示了静态网站托管和反向代理的基本配置:
# 全局配置 worker_processes auto; error_log /var/log/nginx/error.log warn; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; # 静态网站配置 server { listen 80; server_name example.com; root /var/www/html; index index.html; location / { try_files $uri $uri/ =404; } } # 反向代理配置 server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_server:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
二、 tomcat 简介
Apache Tomcat 是一个开源的 Servlet 容器,由 Apache 软件基金会开发和维护。它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL) 和 WebSocket 等技术规范,是运行 Java Web 应用程序的核心平台。
1. 核心功能
轻量级
- 相比完整的 Java EE 应用服务器(如 WebLogic、WebSphere),Tomcat 体积小、启动快,适合开发和测试环境。
开源免费
- 基于 Apache License 2.0 发布,可自由使用和修改。
扩展性强
- 支持各种插件和连接器(如 APR、NIO2),可通过修改配置文件灵活调整。
与 Apache HTTP Server 集成
- 可作为后端 Servlet 容器,与 Apache HTTP Server 配合实现负载均衡。
2. 基本架构
Tomcat 的核心组件包括:
- Server:代表整个 Servlet 容器,包含多个 Service
- Service:连接 Connector 和 Container
- Connector:负责接收客户端请求(如 HTTP、HTTPS)
- Container:处理请求的核心组件,包含 Engine、Host、Context 等
- Web 应用:部署在 Context 中的 WAR 或目录
3. 典型应用场景
Java Web 应用部署
- 运行基于 Spring、Spring Boot、Struts 等框架开发的 Web 应用。
微服务架构
- 作为轻量级服务容器,部署独立的微服务实例。
开发测试环境
- 快速启动和调试 Web 应用,支持热部署。
与其他服务器配合
- 作为应用服务器,与 Nginx/Apache HTTP Server 配合实现动静分离。
4. 配置示例
以下是一个简化的server.xml
配置片段,展示了基本的 HTTP 连接器和虚拟主机配置:
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Service name="Catalina"> <!-- HTTP连接器 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- 引擎 --> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- 虚拟主机 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
5. 与 nginx 的协作模式
在生产环境中,Tomcat 通常与 Nginx 配合使用:
Nginx 作为反向代理
server { listen 80; server_name example.com; location / { proxy_pass http://tomcat_server:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
动静分离
- Nginx 处理静态资源(HTML、CSS、JS、图片)
- Tomcat 处理动态请求(Servlet、JSP)
负载均衡
- Nginx 通过 upstream 模块将请求分发到多个 Tomcat 实例:
upstream tomcat_cluster { server tomcat1:8080; server tomcat2:8080; } server { listen 80; location / { proxy_pass http://tomcat_cluster; } }
6. 性能优化建议
(1) 调整 JVM 参数
修改catalina.sh
或setenv.sh
,设置合适的堆内存和垃圾回收器:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
(2) 优化连接器
在server.xml
中调整 HTTP 连接器参数:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" maxThreads="200" acceptCount="100" />
(3) 禁用不必要的服务
注释掉server.xml
中不需要的组件(如 AJP 连接器)。
(4) 使用 APR 连接器
对于高并发场景,启用 APR(Apache Portable Runtime)以提升性能:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" />
三、 实验步骤
1. 实验环境
部署nginx+tomcat负载均衡需要以下设备
tomcat1 服务器 | 192.168.10.102 |
tomcat2 服务器 | 192.168.10.103 |
nginx 服务器 | 192.168.10.101 |
2. 准备 tomcat 网站
##两台tomcat服务器配置一致 [root@localhost /]# dnf -y install java //安装实验需要的环境 [root@localhost /]# mkdir -p /web/webapp1 [root@localhost webapp1]# ls index.jsp ##第一台tomcat服务器 [root@localhost webapp1]# cat index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test2 page</title> </head> <body> <% out.println("动态页面 1,http://www.test2.com");%> </body> <body> <div>动态页面的图片 1</div><br><img src="logo.png"> </body> </html> ##第二台tomcat服务器 [root@localhost webapp1]# cat index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test2 page</title> </head> <body> <% out.println("动态页面 2,http://www.test2.com");%> </body> <body> <div>动态页面的图片 2</div><br><img src="logo.png"> ##为了方便验证两台服务器页面可以不一致 </body> </html>
3. 修改 nginx 的配置文件
[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf ##这个要写在http部分 upstream my_tomcat { server 192.168.10.102:8080 weight=1; server 192.168.10.103:8080 weight=2; } ##新添加的localtion部分 location ~ .*\.jsp$ { proxy_set_header HOST $host; proxy_pass http://my_tomcat; } ##检查配置文件是否有误 [root@nginx /]# nginx -t ##重载nginx服务 [root@nginx /]# nginx -s reload
4. 修改 tomcat 的配置文件
##两台服务器都要配置 [root@localhost /]# vim /usr/local/tomcat/conf/server.xml <Context docBase="/web/webapp1" path="" reloadable="false"> ##在150行添加 </Context> docBase ##指定网页的路径 path="" ##定义 Web 应用的访问路径(上下文路径) reloadabel ##控制 Tomcat 是否自动检测应用文件的修改并重新加载应用 false(默认值) ##不自动重新加载,修改文件后需手动重启 Tomcat 或应用。 true ##开启自动重新加载 ##重启两台服务器,使配置文件生效 [root@localhost /]# /usr/local/tomcat/bin/shutdown.sh [root@localhost /]# /usr/local/tomcat/bin/startup.sh