Nginx实战:状态码、反向代理原理与负载均衡实战详解

一、常见 HTTP 状态码

1. 403 Forbidden

触发条件:URL 路径能匹配 Nginx 配置中的 location,但找不到具体网页文件。

核心原因:权限问题或目标文件缺失。

2. 404 Not Found

触发条件:URL 路径在 Nginx 配置中找不到匹配的 location。

核心原因:路径配置错误或资源未部署。

3. 301 Moved Permanently

含义:永久重定向,页面地址永久变更。

案例:网站升级迁移(www.old.comwww.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
  1. 重启 Nginx:systemctl restart nginx

  2. 核心术语:负载均衡(load balance/LB)、代理(proxy)

相关推荐
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
ping某4 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化