一、常见 HTTP 状态码
1. 403 Forbidden
触发条件:URL 路径能匹配 Nginx 配置中的 location,但找不到具体网页文件。
核心原因:权限问题或目标文件缺失。
2. 404 Not Found
触发条件:URL 路径在 Nginx 配置中找不到匹配的 location。
核心原因:路径配置错误或资源未部署。
3. 301 Moved Permanently
含义:永久重定向,页面地址永久变更。
案例:网站升级迁移(www.old.com → www.new.com),可通过 F12 查看状态码。
4. 302 Found
含义:临时重定向,地址暂时变更,下次仍可使用旧地址。
案例:官网维护时临时跳转至维护页面(www.505.com→ www.1009.com)。
5. 503 Service Unavailable
含义:服务器繁忙,无法处理请求。
核心:需排查后端服务器负载、宕机或配置异常等问题。
二、Nginx 反向代理
1. 核心原理
客户端请求先发送至 Nginx,再由 Nginx 转发给后端应用服务器(如 Tomcat、Spring Boot)。客户端仅感知 Nginx,无需知晓后端真实服务节点。
2. 配置方式
(1)单后端服务器
在 server 块的 location 中直接配置 proxy_pass:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.1.130; # 转发至后端服务器
proxy_set_header Host $host; # 保留原始的 Host 头
proxy_set_header X-Real-IP $remote_addr; # 获取客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
(2)多后端服务器
先定义 upstream 地址池,再通过 proxy_pass 关联:
提示:在 Nginx 负载均衡配置中,"不要把本机的 IP 地址放入地址池" 是针对特定场景的建议,核心原因是避免不必要的网络环路、资源浪费或故障排查困难。
避免网络环路(针对单服务器部署场景)
如果 Nginx 服务器和后端应用服务器是同一台机器 (即 Nginx 和后端服务部署在本机),此时若将本机 IP(如 127.0.0.1 或本机内网 IP)加入 upstream 地址池,可能导致:
Nginx 接收请求后,又将请求转发回本机的应用服务(如 Tomcat),形成 "Nginx → 本机应用 → Nginx" 的潜在环路(尤其在配置错误时)。
虽然正常情况下不会死循环,但会增加本机网络栈的处理开销(请求绕路),降低性能。
http {
# 定义后端服务器地址池
upstream backend {
#提示,不要把本机的IP地址放入地址池
# 后端服务器IP
server 192.168.10.130;
server 192.168.10.131;
}
server {
location / {
proxy_pass http://backend; # 关联地址池
}
}
}
三、Nginx 负载均衡
1. 核心价值
提高性能:分担单台服务器压力,提升并发处理能力。
高可用性:某台服务器宕机时,自动转发至正常节点。
可扩展性:灵活添加或移除后端服务器,无需修改核心配置。
2. 常见负载均衡策略
(1)轮询(Round Robin,RR)
轮询算法是 Nginx 的默认分流算法。它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量。
数据流向:每个请求依次被分配到下一个服务器。假设有三台服务器(Server A、Server B、ServerC),第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推。
特点:默认策略,请求按顺序依次分配给后端服务器,均匀分布流量,无视服务器的当前负载和响应时间。
配置示例:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
(2)加权轮询(Weighted Round Robin,WRR)
加权轮询算法允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况。
数据流向:根据服务器设置的权重值分配请求。假设 Server A 权重为 3,Server B 权重为 1,则 4 个请求中,3 个会被分配到 Server A,1 个会被分配到 Server B。
特点:为服务器设置权重(weight),权重越高接收请求越多,适配性能不均衡场景。
配置示例:
upstream backend {
server backend1.example.com weight=3; # 接收3/6的请求
server backend2.example.com weight=1; # 接收1/6的请求
server backend3.example.com weight=2; # 接收2/6的请求
}
(3)IP 哈希(IP Hash)
IP 哈希算法通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器。适用于需要将特定客户端的请求固定在同一台服务器上的场景。
数据流向:每个客户端的 IP 地址被哈希计算,然后根据哈希值将请求固定分配到某一台服务器。假设客户端 X 的哈希值指向 Server A,客户端 Y 的哈希值指向 Server B,则无论多少次请求,X 的请求总是流向 Server A,Y 的请求总是流向 Server B。
特点:通过客户端 IP 哈希计算,固定将请求分配给同一台服务器,实现会话保持。
配置示例:
upstream backend {
ip_hash; # 启用IP哈希策略
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
(4)最小连接数(Least Connection,LC)
最少连接数算法将请求分配给当前活动连接数最少的服务器。这种算法适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载。
数据流向:每个请求被分配到当前连接数最少的服务器。例如,Server A 有 2 个连接,Server B 有 5 个连接,新的请求会被分配到 Server A。
特点:根据后端服务器当前连接数分配请求,连接数越少优先接收请求。
配置示例:
upstream backend {
least_conn; # 启用最小连接数
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
查看连接数命令:
[root@nginx conf]# netstat -natp | grep -i established | grep nginx | awk 'NR>=2{print}' | wc -l
3. 部署实战(Nginx+Httpd)
(1)环境规划
Nginx 服务器:192.168.10.130
Httpd 服务器 1:192.168.253.129
Httpd 服务器 2:192.168.253.130
(2)Httpd 服务器配置(两台均执行)
yum install -y httpd # 安装Httpd
vim /var/www/html/index.html # 编辑测试页面
服务器1写入:this is test01
服务器2写入:this is test02
systemctl start httpd # 启动服务
(3)Nginx 服务器配置
vim /usr/local/nginx/conf/nginx.conf
http{
......
#地址池
upstream backend {
server 192.168.253.129;
server 192.168.253.130;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://backend;
}
}
......
}
(4)验证命令
nginx -t # 校验配置
systemctl start nginx # 启动Nginx
curl 192.168.10.130 # 多次执行,交替返回test01和test02
四、常用命令与工具
查看 Nginx 已建立连接数:
netstat -natp | grep -i established | grep nginx | awk 'NR>=2{print}' | wc -l
-
重启 Nginx:
systemctl restart nginx -
核心术语:负载均衡(load balance/LB)、代理(proxy)