一、Nginx 核心功能
1. 核心角色
Nginx 兼具 Web 服务器、反向代理服务器和负载均衡(LB)功能,是实现 "动静分离" 架构的核心中间件。
2. 动静分离工作流程
接收用户 URL 请求后,Nginx 先区分资源类型。
静态资源(html、png、css 等):Nginx 直接读取本地文件并返回给用户。
动态资源(jsp、php 等):Nginx 转发给后端服务器(如 Tomcat)处理,后端处理完成后通过 Nginx 响应给用户。
3. 负载均衡作用
Nginx 会将动态请求均衡分发到多个后端服务器,避免单台服务器负载过高,提升系统可用性。
二、Nginx location 配置
1. 匹配类型与修饰符
| 匹配类型 | 修饰符 | 说明 |
|---|---|---|
| 精准匹配 | = | 普通字符完全匹配,优先级最高 |
| 前缀匹配 | ^~ | 普通字符前缀匹配,成功后不再匹配其他正则 |
| 正则匹配 | ~ | 区分大小写的正则匹配 |
| 正则匹配 | ~* | 不区分大小写的正则匹配 |
| 取非匹配 | !~ | 区分大小写的正则取非 |
| 取非匹配 | !~* | 不区分大小写的正则取非 |
| 一般匹配 | 无 | 前缀匹配,遵循最长前缀原则 |
| 通用匹配 | / | 匹配所有未被其他规则匹配的请求,优先级最低 |
2. 优先级顺序
-
精准匹配(=)
-
前缀匹配(^~)
-
正则匹配(~ 或~*,按配置文件顺序)
-
不带修饰符的一般前缀匹配
-
通用匹配(/)
3. 经典示例
精准匹配:location = / { ... } 仅匹配根路径 /,不匹配 /data 等子路径。
正则匹配:location ~* \.(gif|jpg|jpeg)$ { ... } 匹配所有图片格式请求。
优先级验证:location ^~ /images/ { ... } 优先级高于图片正则匹配,访问 /images/example.jpg 会触发前缀匹配规则。
三、Nginx 常用功能配置
1. URL 重写(rewrite)
核心作用是重写用户访问的 URL 路径,常见场景为域名跳转。
需求:旧域名 www.xy101.com 跳转到新域名 www.xy102.com 并保留参数。
配置示例:在 server 块中添加
rewrite /(.*)$ ``http://www.xy102.com/$1`` permanent;
permanent 表示永久重定向。
2. 反向代理与负载均衡配置
定义后端服务器集群:通过 upstream 模块配置,weight 参数指定权重(权重越高,被分配概率越大)。
配置示例:
upstream tomcatserver {
server 192.168.10.137:8080 weight=1;
server 192.168.10.130:8080 weight=1;
server 192.168.10.130:8081 weight=1;
}
动态请求转发:通过 location ~ .*\.jsp$ { proxy_pass http://tomcatserver; } 将 JSP 请求转发到后端 Tomcat 集群。
3. 静态资源配置
指定静态资源目录:location ~ .*\.(gif|jpg|jpeg|png|css)$ { root /usr/local/nginx/html/img; expires 10d; }。
expires 10d 表示设置资源缓存有效期为 10 天,提升访问速度。
四、Tomcat 核心知识
1. 本质与核心职责
Tomcat 是轻量级 Web 应用服务器,核心是 Servlet 容器,主要职责包括:
接收 HTTP 请求(内置简单 HTTP 服务器)。
按 URL 映射分发请求到对应 Web 应用。
执行 Servlet/JSP 并生成响应,返回给客户端。
支持 Servlet、JSP、Spring MVC、Spring Boot(war 部署)等 Java 应用。
2. 核心工作流程
-
启动:加载 server.xml 配置,初始化 Connector、Service、Engine 等组件,创建 Servlet 容器。
-
接收请求:Connector 监听端口(如 8080),封装请求为 Request 对象。
-
请求分发:Mapper 通过 URL 找到对应 Web 应用(Context)和 Servlet(Wrapper)。
-
执行 Servlet:调用 Servlet 的 service () 方法,处理业务逻辑并返回 Response 对象。
-
响应客户端:将 Response 转换为 HTTP 报文,通过 Socket 返回给浏览器。
3. 核心配置文件
| 配置文件 | 作用 |
|---|---|
| conf/server.xml | 主配置文件,定义端口、协议、Engine、Host 等核心组件 |
| conf/web.xml | 全局 Web 应用默认配置(如 MIME 映射、默认 Servlet) |
| context.xml | Web 应用级配置(如数据源、Session 配置) |
| tomcat-users.xml | 用户、角色及安全配置,用于管理后台登录 |
| 应用内 WEB-INF/web.xml | 单个 Web 应用的 Servlet、Filter、Listener 配置 |
五、Nginx + Tomcat 部署实战
1. 部署计划
Nginx 服务器:192.168.10.137:80(处理静态请求、反向代理与负载均衡)。
Tomcat 服务器 1:192.168.10.130:8080(动态应用 1)。
Tomcat 服务器 2:192.168.10.130:8081(动态应用 2,避免端口冲突)。
2. 部署步骤
-
环境准备:关闭防火墙(systemctl stop firewalld),禁用 SELinux(setenforce 0)。
systemctl stop firewalld setenforce 0 -
安装 JDK:配置 JAVA_HOME 等环境变量,通过 java -version 验证。
首先下载 然后再 上传 并且解压(解压完之后配置环境变量即可) tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/ vim /etc/profile 这是配置JDK 现在系统基本自带openJDK 在最后面加入 export JAVA_HOME=/usr/local1/jdk1.8.0_91 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH

刷新环境
source /etc/profile #刷新
验证开发环境是否安装成功
java -version

-
安装 Tomcat:解压安装包,测试是否安装成功。
#先下载安装包 然后再 上传 tar zxvf apache-tomcat-8.5.16.tar.gz #修改服务名字 mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat #启动tomcat /usr/local/tomcat/bin/shutdown.sh # 关闭 /usr/local/tomcat/bin/startup.sh # 启动 #查看端口 netstat -ntap | grep 8080
-
部署负载均衡和反向代理:在两台 Tomcat 中创建测试 JSP 页面,配置 Context 指向应用目录。
规划部署负载均衡和反向代理服务器
Nginx 服务器:192.168.10.137:80 Tomcat服务器1:192.168.10.130:8080 Tomcat服务器2:192.168.10.130:8081 部署Nginx服务器负载均衡 systemctl start nginx.service systemctl enable nginx.servic 部署后端2台Tomcat应用服务器 /usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh netstat -ntap | grep 8080 第二台直接复制 cp -r /usr/local/tomcat /usr/local/tomcat1动静分离配置
第一台Tomcat server配置 创建页面 mkdir /usr/local/tomcat/webapps/test vim /usr/local/tomcat/webapps/test/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test1 page</title> #指定为 test1 页面 </head> <body> <% out.println("动态页面 1,http://www.test1.com");%> </body> </html> 修改server.xml配置文件,第一份端口不需要改动,按原端口执行 vim /usr/local/tomcat/conf/server.xml #由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"> </Context> </Host> 开启tomcat /usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh 第二台Tomcat server配置 mkdir /usr/local/tomcat1/webapps/test vim /usr/local/tomcat1/webapps/test/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test2 page</title> #指定为 test2 页面 </head> <body> <% out.println("动态页面 2,http://www.test2.com");%> </body> </html> vim /usr/local/tomcat1/conf/server.xml 更改相应端口,避免与第一台服务器端口冲突 更改端口如下 调整Server,HTTP和AJP端口: xml <Server port="8006" shutdown="SHUTDOWN"> <!-- 8005 → 8006 --> <Connector port="8081" protocol="HTTP/1.1" <!-- 8080 → 8081 --> <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> <!-- 8009 → 8010 --> #删除前面的 HOST 配置 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/omcat1/webapps/test" path="" reloadable="true" /> </Host> /usr/local/tomcat/tomcat1/bin/shutdown.sh /usr/local/tomcat/tomcat1/bin/startup.sh -
配置 Nginx:准备静态页面和图片,配置 upstream 与 location 规则,实现动静分离和负载均衡。
#准备静态页面和静态图片 echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html mkdir /usr/local/nginx/html/img cp /root/tu.jpg /usr/local/nginx/html/img #nginx配置文件 vim /usr/local/nginx/conf/nginx.conf http { ...... #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大 upstream tomcatserver { server 192.168.10.137:8080 weight=1; server 192.168.10.130:8080 weight=1; server 192.168.10.130:8081 weight=1; } server { listen 80; server_name localhost; charset utf-8; #access_log logs/host.access.log main; location / { root html; index index.html; } #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理 location ~ .*\.jsp$ { proxy_pass http://tomcatserver; #设置后端的Web服务器可以获取远程客户端的真实IP ##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令 设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都 来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。 proxy_set_header HOST $host; ##把$remote_addr赋值给X-Real-IP,来获取源IP proxy_set_header X-Real-IP $remote_addr; ##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #配置Nginx处理静态图片请求 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ { root /usr/local/nginx/html/img; expires 10d; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
3. 测试效果
静态资源:访问 http://192.168.10.137/ 可查看静态页面,访问 http://192.168.10.137/img/tu.jpg可查看静态图片。
负载均衡:多次访问 http://192.168.10.137/index.jsp,会交替显示两台 Tomcat 的动态页面。
六、数据流向总结
客户端 → Nginx(80/443 端口)→ 匹配 location 规则:
静态请求:Nginx 直接读取本地资源并响应。
动态请求:通过 proxy_pass 转发到 upstream 定义的 Tomcat 集群 → 后端 Tomcat 处理请求 → 结果经 Nginx 返回给客户端。
页面,访问 http://192.168.10.137/img/tu.jpg 可查看静态图片。
负载均衡:多次访问 http://192.168.10.137/index.jsp,会交替显示两台 Tomcat 的动态页面。
六、数据流向总结
客户端 → Nginx(80/443 端口)→ 匹配 location 规则:
静态请求:Nginx 直接读取本地资源并响应。
动态请求:通过 proxy_pass 转发到 upstream 定义的 Tomcat 集群 → 后端 Tomcat 处理请求 → 结果经 Nginx 返回给客户端。