nginx 和 tomcat 都是现代 web 应用架构中常用的组件,它们在一起通常用于高性能的 web 服务、负载均衡和反向代理等场景中。虽然它们的功能有所重叠,但它们各自有不同的核心职责,并且可以通过紧密合作来优化系统的性能和扩展性。
1.nginx的作用
nginx(engine-x)是一个高性能的 web 服务器 和 反向代理服务器,常用于处理 http 请求、负载均衡和静态资源服务等。
- 反向代理:nginx 可以作为 反向代理 服务器,接收客户端的请求并将它们转发给后端应用(如 tomcat)。这使得 nginx 成为客户端和应用服务器之间的中介,增强了系统的安全性、扩展性和稳定性。
- 负载均衡:nginx 提供了内建的负载均衡功能,能够将请求分发到多台 tomcat 服务器上。常用的负载均衡算法包括轮询、ip 哈希、最少连接等。通过负载均衡,可以使得多个 tomcat 实例共同承担负载,提高系统的吞吐量和容错能力。
- 静态资源服务:nginx 对静态文件的处理非常高效(如图片、css、js 文件)。它能够快速响应静态资源请求,减轻 tomcat 服务器的压力。静态资源的请求可以直接由 nginx 处理,无需经过 tomcat,从而提升性能。
- ssl 终端:nginx 可以处理 ssl 加密和解密工作,减少 tomcat 的加密负担,使得 tomcat 专注于处理业务逻辑。
- 请求缓存:nginx 支持请求缓存功能,可以缓存部分内容,减轻后端 tomcat 的负载。
- 反向代理 + web 层安全性:nginx 作为反向代理可以隐藏 tomcat 的真实地址,提高安全性。并且它能有效地限制某些 http 请求,防止恶意攻击(如 ddos 攻击)。
nginx配置负载均衡
http { upstream tomcat_backend { server 127.0.0.1:8080; # tomcat 服务器 1 server 127.0.0.1:8081; # tomcat 服务器 2 server 127.0.0.1:8082; # tomcat 服务器 3 } server { listen 80; server_name example.com; 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; proxy_set_header x-forwarded-proto $scheme; proxy_redirect off; } } }
upstream tomcat_backend
:定义了一个名为tomcat_backend
的后端服务器池,包含多个 tomcat 实例(不同的端口或机器)。proxy_pass http://tomcat_backend;
:nginx 会将请求转发到定义的负载均衡池,自动选择一个 tomcat 实例来处理请求。
nginx 连接池
配置 nginx 以减少与 tomcat 之间的连接开销,可以提高性能。
http { upstream tomcat_backend { server 127.0.0.1:8080; server 127.0.0.1:8081; keepalive 32; # 配置持久连接 } }
nginx 反向代理缓存
对于某些动态内容,nginx 也可以缓存,减少 tomcat 的处理压力。
location /api/ { proxy_cache my_cache; proxy_cache_valid 200 1h; # 缓存 1 小时 proxy_pass http://tomcat_backend; }
2.tomcat的作用
tomcat 是一个 java servlet 容器 和 web 服务器,主要负责处理动态请求,特别是 java web 应用(如基于 servlet 和 jsp 技术的应用)。
tomcat 主要的职责是:
- 处理动态请求:tomcat 负责解析、处理和响应客户端的动态请求。这些请求通常是由 java web 应用生成的,例如 java servlet 或 jsp 页面。tomcat 运行 java 应用程序,执行后端的业务逻辑,并生成动态网页内容。
- 支持 java ee 标准:tomcat 是 java ee 规范(servlet 和 jsp)的实现,能够执行基于 java 技术的 web 应用(如 spring mvc、struts 等框架编写的应用)。
- servlet 容器:tomcat 实现了 servlet 容器的功能,支持 servlet 的生命周期管理、请求分发等。它是 java web 应用的核心服务器组件。
- jsp 支持:tomcat 还支持 jsp(java server pages),使得 java web 开发者能够通过 java 代码和 html 代码的结合来动态生成 web 页面。
- 会话管理:tomcat 提供了 http 会话管理功能,处理用户会话的创建、管理和销毁。
tomcat 作为 java web 应用的容器,处理动态请求(如 servlet 或 jsp)。下面是 tomcat 配置的基本示例,假设我们正在使用 tomcat 作为后端服务器,处理 java 动态请求。
通常,tomcat 的配置文件是 server.xml
,可以配置 tomcat 监听的端口和其他设置。默认情况下,tomcat 监听 8080 端口,但可以根据需要调整。
<server port="8005" shutdown="shutdown"> <service name="catalina"> <connector port="8080" protocol="http/1.1" connectiontimeout="20000" redirectport="8443" /> <engine name="catalina" defaulthost="localhost"> <host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true"> <!-- 配置应用 --> </host> </engine> </service> </server>
port="8080"
:配置 tomcat 默认监听 8080 端口。connectiontimeout="20000"
:设置连接超时为 20 秒。redirectport="8443"
:如果启用了 https,会将 http 请求重定向到 8443 端口。
3.nginx与tomcat的作用
在常见的 web 应用架构中,nginx 和 tomcat 作为前端和后端的协作组件,共同组成 web 系统的两大核心。
它们的合作关系一般如下:
- 客户端请求到 nginx:当客户端(浏览器)发送请求时,首先经过 nginx。nginx 负责解析请求并做负载均衡、ssl 终端处理、静态资源处理等工作。
- nginx 反向代理请求给 tomcat:对于动态请求(如访问 java web 应用),nginx 会将请求转发给 tomcat。nginx 充当反向代理服务器,tomcat 作为后端应用服务器处理请求,并生成响应数据。
- tomcat 返回响应给 nginx:tomcat 处理完请求后,将响应结果(如 html、json 或其他格式的内容)返回给 nginx。
- nginx 返回响应给客户端:nginx 最后将 tomcat 返回的响应转发给客户端,完成整个请求-响应流程。
这种架构能够使得系统在高并发和大流量情况下具备高可用性、可扩展性和稳定性。
nginx 作为前端的反向代理和负载均衡器,能够有效分流请求、加速静态内容的加载,而 tomcat 专注于处理复杂的 java 动态请求和业务逻辑。
4.常见的前后端架构
(1)单一 tomcat 后端:适用于小型系统或开发阶段。
nginx 作为前端接收请求,转发给 tomcat,tomcat 直接处理并返回响应。
[客户端] --> [nginx] --> [tomcat]
(2)多台 tomcat 后端(负载均衡):适用于高并发、高可用的系统。
nginx 作为负载均衡器,将请求分发到多台 tomcat 上,tomcat 之间可以使用负载均衡算法进行流量分配。
[客户端] --> [nginx (负载均衡)] --> [tomcat 1] --> [tomcat 2] --> [tomcat 3]
(3)静态资源和动态请求分离:nginx 直接处理静态资源请求,而动态请求(例如 jsp 或 servlet)由 tomcat 处理。
通过配置 nginx,静态文件(如图片、css、javascript)可以直接由 nginx 提供,而动态内容(如用户登录信息、数据查询等)通过 nginx 转发到 tomcat。
[客户端] --> [nginx (静态文件)] --> [tomcat (动态请求)]
总结
- nginx:适用于高并发、高性能场景,负责处理 http 请求、反向代理、负载均衡、ssl 加解密、静态资源服务等工作。
- tomcat:专注于运行 java web 应用,处理动态请求(如 servlet、jsp 等),是 java web 应用的容器和服务器。
nginx 和 tomcat 结合使用 能够:
- 提升系统的吞吐量和并发处理能力。
- 通过负载均衡和反向代理提高系统的稳定性和可用性。
- 降低数据库和后端服务的压力,优化响应时间。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论