从 Nginx 配置到高可用架构
一、基础核心:Nginx 配置与 IP 地址分配
(一)IP 地址分配基础
IP 地址作为网络设备的唯一标识,绝对不允许重复。 配置过程中2 台虚拟机 IP 均为 192.168.110.128 的冲突问题,这也印证了 DHCP 协议的重要性 ——DHCP 作为 IP 地址自动分配服务,能避免手动配置导致的冲突,其核心原理是通过服务器动态分配 IP、子网掩码、网关等网络参数,简化网络管理。
在 Linux 系统中,网络服务的管理需注意:
systemctl stop NetworkManager:停止 NetworkManager 服务(负责网卡发现与 IP 管理)systemctl restart network:重启网络服务,使网卡(如 ens33)配置生效
(二)Nginx 配置文件核心框架
Nginx 的配置文件(nginx.conf)采用分层结构,核心分为四大块:
- 全局配置:设置 Nginx 运行的全局参数(如工作进程数、日志路径等)
- http 块:配置 HTTP 协议相关参数,可包含多个 server 块
- server 块:匹配用户访问的入口(如域名、端口),一个 http 块可配置多个 server 块(多站点部署)
- location 块:URL 路径匹配规则,核心作用是精准定位用户请求的资源文件
(三)location 匹配规则详解
location 的核心价值在于避免 Nginx 遍历整个站点目录查找资源,提升访问效率(对比 Apache 的低效遍历机制)。其匹配规则按优先级从高到低排序如下:
| 匹配符号 | 匹配类型 | 说明 | 示例 |
|---|---|---|---|
| = | 精确匹配 | 完全匹配 URL 路径,优先级最高 | location = /index.html {} 仅匹配http://xxx.com/index.html |
| ^~ | 前缀匹配 | 优先于正则匹配,匹配 URL 前缀 | location ^~ /abc/ {} 匹配http://xxx.com/abc/123等路径 |
| ~ | 区分大小写正则匹配 | 按正则表达式匹配,区分大小写 | location ~ \.jsp$ {} 仅匹配后缀为.jsp 的 URL(大写.JSP 不匹配) |
| ~* | 不区分大小写正则匹配 | 正则匹配,忽略大小写 | location ~* \.jpg$ {} 匹配.jpg、.JPG 等后缀 |
| / | 普通前缀匹配 | 默认匹配规则,优先级最低 | location / {} 匹配所有未被其他规则匹配的 URL |
关键原则:匹配越精确,优先级越高;Nginx 会自上而下读取配置文件中的 location 规则,一旦匹配成功则停止后续匹配。
二、核心应用:反向代理与负载均衡
(一)反向代理原理与配置
反向代理是 Nginx 的核心功能之一,其本质是客户端通过访问 Nginx 服务器,由 Nginx 转发请求至后端服务器(如 Tomcat、httpd),并将结果返回给客户端,实现后端服务的隐藏与保护。
1. 单后端服务反向代理配置
例如,将所有.jsp 后缀的请求转发至 Tomcat 服务器:
nginx
http {
upstream tomcat_server { # 定义后端服务器地址池
server 192.168.110.152:8080;
server 192.168.110.129:8080;
}
server {
listen 80;
server_name localhost;
location ~* \.jsp$ { # 匹配动态请求
proxy_pass http://tomcat_server; # 转发至后端地址池
}
}
}
2. 前端静态资源与后端动态请求分离
前端开发者将页面文件(HTML、CSS、JS)打包后,解压至 Nginx 的站点目录,通过 location 匹配静态资源路径,动态请求则转发至后端:
nginx
location ^~ /author/workbench/ {
root /usr/share/nginx/html; # 静态资源目录
index test.html; # 默认首页
}
location ~* \.jsp$ {
proxy_pass http://tomcat_server; # 动态请求转发
}
http://你的域名/author/workbench/test.html→ 匹配第一个location,Nginx 直接从/usr/share/nginx/html/author/workbench/目录找到test.html返回,全程不经过 Tomcat;http://你的域名/user/login.jsp→ 匹配第二个location,Nginx 把这个请求转发给 Tomcat,Tomcat 处理登录逻辑后,把结果返回给 Nginx,再由 Nginx 传给用户。
(二)负载均衡算法详解
当后端存在多台服务器时,Nginx 通过负载均衡算法分发请求,提升系统并发处理能力。Nginx 支持 4 种核心负载均衡算法:
| 算法类型 | 特性 | 适用场景 |
|---|---|---|
| 轮循(默认)rr | 请求按顺序依次分发至后端服务器,所有服务器权重相同 | 后端服务器配置一致、性能相当的场景 |
| 加权轮循 wrr | 为后端服务器设置权重(weight),权重越高,接收请求越多 | 后端服务器性能差异较大的场景 |
| IP Hash | 根据客户端 IP 地址哈希计算,固定将请求分发至同一台后端服务器 | 需要保持会话一致性的场景(如登录状态) |
| 最小连接 lc | 优先将请求分发至当前连接数最少的后端服务器 | 后端服务器负载不均的场景 |
负载均衡配置示例(加权轮循):
nginx
http {
upstream backend {
server 192.168.110.129 weight=5; # 权重5,接收请求比例更高
server 192.168.110.152 weight=3; # 权重3
}
server {
listen 80;
location / {
proxy_pass http://backend; # 转发至后端地址池
}
}
}
三、安全加固:HTTPS 部署与 DNS 解析
企业级 Web 服务必须使用 HTTPS 协议(SSL/TLS 加密),避免数据传输过程中被窃取或篡改。HTTPS 部署的核心是 SSL 证书申请与 Nginx 配置。
(一)SSL 证书申请渠道
- 云服务商申请(推荐):阿里云、华为云、腾讯云等提供免费 DV 证书(域名验证型),支持自动解析与绑定,流程简便。
- 运营商申请:需完成域名备案,适用于企业级 EV 证书(增强验证型,显示企业名称)。
- 测试环境:可使用自签名证书(不推荐生产环境,浏览器会提示不安全)。
(二)HTTPS 部署完整流程
-
域名准备:注册域名(如www
.qaq.net),并将域名与云服务器 ECS 的 IP 绑定(DNS 解析)。- A 记录:将域名解析为 IP(正向解析)
- CNAME 记录:为域名设置别名(如
www.qaq.net别名指向主域名) - 验证解析:使用
nslookup www.qaq.net命令查看解析结果
-
证书下载与配置:从云服务商下载证书文件(通常包含.pem 和.key 文件),修改 Nginx 配置:
nginx
http {
# HTTP请求强制跳转HTTPS(301永久重定向)
server {
listen 80;
server_name www.qaq.net;
return 301 https://$host$request_uri;
}
# HTTPS配置
server {
listen 443 ssl;
server_name www.qaq.net;
# 证书文件路径
ssl_certificate /etc/nginx/cert/qaq.pem;
ssl_certificate_key /etc/nginx/cert/qaq.key;
# SSL优化参数
ssl_protocols TLSv1.2 TLSv1.3; # 支持的TLS版本
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; # 加密套件
ssl_session_timeout 10m; # 会话超时时间
# 业务配置
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
- 验证生效:重启 Nginx 服务(
systemctl restart nginx),访问https://www.qaq.net,浏览器地址栏显示小锁图标即表示配置成功。
四、后端联动:Tomcat 应用服务器部署
Tomcat 作为 Java 应用服务器,需依赖 JDK 运行环境,主要用于部署 Java Web 项目(.jar 或.war 包)。
(一)Java 项目部署两种方式
-
传统部署(基于 Tomcat):
- 开发人员通过 Maven 打包项目:
mvn package --clean,生成.war 或.jar 包 - 将打包文件放入 Tomcat 的
webapps/目录 - 修改 Tomcat 配置文件
server.xml(如端口、虚拟主机) - 重启 Tomcat:
bin/startup.sh(Linux)或bin\startup.bat(Windows)
- 开发人员通过 Maven 打包项目:
-
简化部署(直接运行 Jar 包):
- 开发人员打包生成.jar 包(含内置 Tomcat)
- 服务器安装 JDK 环境(配置 JAVA_HOME)
- 直接运行命令:
java -jar xxx.jar - 验证服务:
netstat -natulp | grep java查看 8080 端口是否监听
(二)Nginx 反向代理 Tomcat 配置
通过 Nginx 转发动态请求至 Tomcat,实现静态资源与动态请求分离:
nginx
http {
upstream tomcat_server {
server 192.168.110.152:8080;
server 192.168.110.129:8080;
}
server {
listen 80;
server_name localhost;
# 静态资源匹配
location ~* \.(html|css|js|jpg|png)$ {
root /usr/share/nginx/html;
expires 30d; # 静态资源缓存30天
}
# 动态请求转发至Tomcat
location ~* \.jsp$ {
proxy_pass http://tomcat_server;
proxy_set_header Host $host; # 传递客户端Host信息
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
}
}
}
五、高可用架构:Keepalived 与集群部署
单点故障是 Web 服务的致命隐患,通过 Keepalived 实现 Nginx 高可用,确保服务持续可用。
(一)高可用核心指标
系统可用性通过以下公式计算:可用性
- MTBF(Mean Time Between Failure):平均故障间隔时间(系统正常运行的平均时长)
- MTTR(Mean Time To Recovery):平均恢复时间(故障发生到恢复正常的时间)
常见可用性等级:
- 99.9%(三个 9):年停机时间约 8.76 小时
- 99.99%(四个 9):年停机时间约 52.6 分钟(企业主流标准)
- 99.999%(五个 9):年停机时间约 5.26 分钟(核心业务高标准)
(二)Nginx+Keepalived 高可用配置
架构组成:
- 主服务器(MASTER):Nginx(192.168.110.129)+ Keepalived
- 备用服务器(BACKUP):Nginx(192.168.110.133)+ Keepalived
- VIP(虚拟 IP):192.168.110.100(客户端统一访问入口)
Keepalived 配置文件核心区域:
nginx
# 1. 全局配置
global_defs {
router_id LVS_DEVEL # 路由标识(全局唯一)
}
# 2. VRRP热备组配置
vrrp_instance VI_1 {
state MASTER # 主服务器为MASTER,备用为BACKUP
interface ens33 # 绑定的网卡
virtual_router_id 51 # 热备组ID(主备必须一致)
priority 100 # 优先级(主服务器高于备用,如主100,备90)
advert_int 1 # 心跳检测间隔(1秒)
# 认证配置
authentication {
auth_type PASS
auth_pass 1111
}
# 3. VIP配置
virtual_ipaddress {
192.168.110.100 # 虚拟IP
}
}
# 4. 健康检测脚本(监控Nginx状态)
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 检测脚本路径
interval 2 # 检测间隔(2秒)
weight -20 # 检测失败时优先级降低20
}
健康检测脚本(check_nginx.sh):
bash
运行
#!/bin/bash
if [ $(ps -ef | grep nginx | grep -v grep | wc -l) -eq 0 ]; then
systemctl start nginx # 尝试启动Nginx
sleep 2
if [ $(ps -ef | grep nginx | grep -v grep | wc -l) -eq 0 ]; then
systemctl stop keepalived # 启动失败则停止Keepalived,触发VIP漂移
fi
fi
高可用逻辑:
- 主备服务器通过 VRRP 协议发送心跳包,确认对方状态。
- 主服务器故障时(Nginx 停止),健康检测脚本触发 Keepalived 停止。
- 备用服务器检测到主服务器心跳消失,优先级自动成为最高,VIP 漂移至备用服务器。
- 主服务器恢复后,通过优先级抢占 VIP,恢复主备状态。
六、实用工具与故障排查
(一)抓包工具使用
抓包工具用于分析网络请求细节,定位通信故障,常用工具包括:
- Fiddler/Wireshark:图形化工具,适合桌面环境,可查看请求头、请求体、状态码等。
- tcpdump:Linux 命令行工具,适合服务器环境,例如抓取 VIP(192.168.110.100)的数据包:
bash
运行
tcpdump -i ens33 host 192.168.110.100 # 抓取指定IP的数据包 tcpdump -i ens33 port 80 # 抓取80端口的HTTP请求
(二)Nginx 常见状态码与故障处理
| 状态码分类 | 含义 | 典型故障与处理 |
|---|---|---|
| 2xx(成功) | 请求正常处理 | 200 OK:正常响应;206 Partial Content:部分内容请求(如断点续传) |
| 3xx(重定向) | 请求需要进一步操作 | 301:永久重定向(HTTPS 跳转);302:临时重定向(临时跳转) |
| 4xx(客户端错误) | 客户端请求有误 | 404:资源不存在(检查 location 路径或文件是否存在);403:权限拒绝(调整目录权限为 755) |
| 5xx(服务器错误) | 后端服务故障 | 502:Bad Gateway(后端服务器 down 或配置错误,检查 upstream 地址);504:Gateway Timeout(后端响应超时,优化后端服务或调整 Nginx 超时参数) |
(三)Nginx 优化方向
Nginx 优化可从 4 个维度入手,提升性能与稳定性:
- 系统层面:优化文件描述符(
ulimit -n 65535)、内核参数(网络转发、TCP 连接优化)、防火墙规则(关闭不必要端口)。 - 服务层面:调整 Nginx 配置(工作进程数、连接数、缓存策略)、启用 Gzip 压缩、安装第三方模块(如限流模块)。
- 观测层面:配置访问日志与错误日志、搭建监控(Zabbix、Prometheus)、实现微服务链路追踪。
- 业务层面:与开发配合优化静态资源(压缩、CDN 加速)、动态请求限流、数据库查询优化。
七、面试高频问题汇总
-
Nginx 反向代理与负载均衡怎么做?反向代理通过
proxy_pass将请求转发至后端服务器;负载均衡通过upstream定义后端地址池,结合轮循、加权轮循等算法分发请求。 -
Nginx 的 SSL 加密配置流程?申请 SSL 证书→域名与 IP 绑定→修改 Nginx 配置(监听 443 端口、指定证书路径)→HTTP 强制跳转 HTTPS。
-
Nginx 与 HAProxy、LVS 的区别?
- Nginx:支持 HTTP/HTTPS 协议,功能丰富(反向代理、负载均衡、缓存、限流),适合中高并发(万级)。
- HAProxy:纯负载均衡器,支持 TCP/UDP 协议,并发性能优于 Nginx(十万级),无 Web 服务功能。
- LVS:工作在内核层,性能最强(百万级并发),仅支持负载均衡,配置复杂,需配合 Keepalived 实现高可用。
-
Nginx 如何限流?通过
limit_req_zone模块实现,例如限制同一 IP1 分钟内最多访问 5 次:nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/m; location / { limit_req zone=one burst=2 nodelay; } -
如何拒绝某一网段访问?使用
deny指令:location / { deny 192.168.110.0/24; allow all; }
更多推荐




所有评论(0)