Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中。负载均衡是指将接收到的网络请求分配到多个后端服务器上,这样可以提高网站的处理能力,避免单个服务器过载,同时也提高了网站的可用性和可靠性。
1.轮询:每个请求会按时间顺序逐一分配到不同的后端服务器
参数 | 备注 |
---|---|
fail_timeout | 与max_fails结合使用。 |
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了 |
fail_time | 服务器会被认为停机的时间长度,默认为10s |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里 |
down | 标记服务器永久停机了,用于明确排除故障或维护中的服务器,避免无效请求 |
注意:
upstream backend {
server backend1.example.com fail_timeout=60s max_fails=2;
server backend2.example.com fail_timeout=60s max_fails=2;
}
max_fails=2; 表示如果在 fail_timeout 时间段内,Nginx 向某一个上游服务器发起请求失败次数达到 2 次,则认为该服务器不可用。
fail_timeout=60s; 有两个作用:首先,它定义了上述 max_fails 中提到的时间窗口长度,在这个例子中是 60 秒;其次,一旦某个上游服务器被认为不可用,Nginx 将会在接下来的 60 秒内不再向这台服务器转发任何请求。
这种配置有助于提高服务的可靠性,通过自动禁用那些看起来已经失效的服务器,并在一段时间后重新尝试连接它们,从而避免将客户端请求发送到不健康的服务器上。
在这个配置中,如果 backend1.example.com 在 60 秒内连续失败 2 次请求,Nginx 会暂时停止向它转发请求 60 秒,并仅将请求转发给 backend2.example.com。同样地,对于 backend2.example.com 也会应用相同的规则。这样的设置可以确保即使有一个服务器出现问题,用户仍然能够被导向到另一个可用的服务器。
2.权重:通过
weight
参数为服务器分配权重(weight=1
为默认值),权重越高分配的请求越多
注意:
upstream backend {
server 192.168.1.1:80 weight=10; # 高性能服务器,处理更多请求
server 192.168.1.2:80 weight=5; # 低性能服务器,处理较少请求
}
3.IP哈希:根据客户端 IP 地址进行哈希计算,确保同一 IP 的请求始终转发到同一台服务器
注意:
upstream backend {
ip_hash; # 启用 IP 哈希策略
server 192.168.1.1:80;
server 192.168.1.2:80;
}
------------------------------------------------------
upstream fileserver {
ip_hash;
server 192.19.31.91:32100 fail_timeout=60s max_fails=2;
server 192.19.31.92:32100 fail_timeout=60s max_fails=2;
keepalive 100;
}
4.最少连接数:将请求转发给当前连接数最少的服务器,适应流量波动
注意:
upstream backend {
least_conn; # 启用最少连接策略
server 192.168.1.1:80;
server 192.168.1.2:80;
}
加权最少连接数:在最少连接的基础上,通过
weight
参数为服务器设置处理能力权重,均衡更精准
- 公式:
(当前连接数) / (weight)
,值越小的服务器优先分配请求。
注意:
upstream backend {
least_conn;
server 192.168.1.1:80 weight=10; # 高配服务器,权重更高,允许处理更多连接
server 192.168.1.2:80 weight=5; # 低配服务器,权重较低,保护其负载
}
5.fair(公平策略):将请求转发给响应速度最快的服务器,优化用户体验
注意:
原理(非官方标准策略,需 upstream_fair模块)
6.URL哈希:对请求的 URL 进行哈希计算,相同 URL 的请求始终转发到同一台服务器(常用于缓存场景)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取
注意:
upstream backend {
hash $request_uri consistent; # 对 URL 哈希,`consistent` 启用一致性哈希(减少服务器变动时的哈希重分布)
server 192.168.1.1:80;
server 192.168.1.2:80;
}
通过合理选择负载均衡策略,Nginx 可高效分配流量,提升后端服务的可用性和性能
策略 | 核心逻辑 | 优势场景 | 缺点 |
---|---|---|---|
轮询 | 顺序分配 | 服务器性能一致 | 不考虑负载状态 |
加权轮询 | 按权重分配 | 服务器性能不同 | 静态配置,不动态调整 |
最少连接 | 连接数最少优先 | 长连接或请求耗时不均 | 未考虑服务器性能差异 |
加权最少连接 | 连接数与权重结合 | 性能差异化且需动态均衡 | 配置较复杂 |
IP 哈希 | 客户端 IP 绑定 | 会话保持 | 服务器故障时会话可能丢失 |
URL 哈希 | URL 绑定服务器 | 资源缓存加速 | 需额外模块,仅适用特定场景 |
nginx -t 检查配置文件是否有语法错误
nginx -s reload 热加载,重新加载配置文件
nginx -s stop 快速关闭
nginx -s quit 等待工作进程处理完成后关闭
[Unit]
Description=Nginx Web Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #修改nginx目录
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
KillMode=process
Restart=always
RestartSec=5s
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
启动安装(开机自启动)nginx
sudo systemctl daemon-reload //重新加载systemd服务
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
systemctl status nginx.service
systemctl restart nginx.service
2.2 nginx默认配置详解
user nginx; # Nginx 工作进程运行的用户(默认:nginx,可改为其他用户)
worker_processes auto; # 工作进程数,通常设为 CPU 核心数(默认:1,建议设为 auto 或实际核心数)
error_log /var/log/nginx/error.log; #错误日志
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024; # 定义每个工作进程的最大连接数。此处设置为 1024,表示每个进程最多处理 1024 个并发连接
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定义日志格式 main,用于记录访问日志
#$remote_addr:客户端 IP 地址
# $time_local:请求时间。
#$request`:客户端请求的原始行(如 `GET /index.HTML HTTP/1.1)
#$status:响应状态码(如 200、404)
#$body_bytes_sent:发送给客户端的字节数(不包括响应头)
#$http_referer:请求来源页面
#$http_user_agent:客户端浏览器标识
#$http_x_forwarded_for:代理链中的客户端 IP(用于反向代理场景)
access_log /var/log/nginx/access.log main;
sendfile on; #启用高效文件传输模式(直接从磁盘发送文件到网络)
tcp_nopush on; #优化 TCP 数据传输(结合使用可减少延迟)
tcp_nodelay on; #优化 TCP 数据传输(结合使用可减少延迟)
keepalive_timeout 65; #设置客户端连接保持时间(单位:秒),减少 TCP 握手开销
types_hash_max_size 2048; #定义 MIME 类型哈希表的大小,避免哈希冲突
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #加载 /etc/nginx/conf.d/ 目录下的所有 .conf文件。通常用于组织多个虚拟主机或模块化配置
#作用:定义监听 80 端口的 HTTP 服务器
server {
listen 80 default_server; #监听 IPv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用)
listen [::]:80 default_server; #监听 IPv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用)
server_name _; # _ 表示通配符,匹配所有未指定的域名
root /usr/share/nginx/html; #设置网站根目录,静态文件(如 `index.html`)需放在此目录下
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; # 加载默认服务器的额外配置文件(通常用于覆盖或扩展默认配置)
#作用:定义根路径 `/` 的处理规则。当前为空,表示使用默认行为(返回 `root` 目录下的文件)。
#扩展建议:可在此添加代理、重定向或静态文件处理逻辑
location / {
}
# 定义 404 错误页面为 `/404.html`。`location = /40x.html` 表示精确匹配 `/40x.html` 路径(需确保文件存在)
error_page 404 /404.html;
location = /40x.html {
}
# 定义 5xx 错误页面为 `/50x.html`(如服务器内部错误、网关错误等)。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# 启用 HTTPS 服务(注释掉的部分需要取消注释并配置)
#关键配置
#listen 443 ssl http2; 监听 443 端口并启用 SSL/TLS 和 HTTP/2。
#ssl_certificate 和 ssl_certificate_key指定 SSL 证书和私钥路径。
#ssl_ciphers: 定义加密套件(PROFILE=SYSTEM 表示使用系统默认配置)。
#ssl_prefer_server_ciphers on; 优先使用服务器端的加密套件
#TLS 服务器配置(注释部分)
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
部分详细参数
upstream backend {
server 192.168.1.1:80 weight=10; # 高性能服务器,处理更多请求
server 192.168.1.2:80 weight=5; # 低性能服务器,处理较少请求
}
0