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)

相关推荐
hero_heart2 小时前
ubuntu 密码重置(不用系统盘)
linux·运维·ubuntu
v***43172 小时前
Nginx WebSocket 长连接及数据容量配置
运维·websocket·nginx
2301_816073832 小时前
SELinux 学习笔记
linux·运维·前端
归叶再无青3 小时前
nginx从入门到实践全指南
运维·nginx·bash
爱喝水的鱼丶3 小时前
SAP-ABAP:SAP概述:数据处理的系统、应用与产品
运维·学习·sap·abap·1024程序员节
A***27953 小时前
后端服务限流配置,Spring Cloud Gateway
java·运维·数据库
n***26563 小时前
Nginx反向代理出现502 Bad Gateway问题的解决方案
运维·nginx·gateway
ITVV3 小时前
Docker 安装配置
运维·docker·容器
圣诞节不感冒4 小时前
nginx动态域名解析(利用变量触发域名动态解析)
运维·nginx