Nginx配置反向代理
nginx反向代理和负载均衡是常用的功能,首先,nginx反向代理配置通常在server块中定义,而负载均衡则在http块中定义upstream。
bash
反向代理配置示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 超时设置
proxy_connect_timeout 30s; # 连接后端超时时间
proxy_send_timeout 60s; # 发送请求超时时间
proxy_read_timeout 60s; # 读取响应超时时间
# 错误处理
proxy_intercept_errors on;
error_page 500 502 503 504 /50x.html;
}
反向代理常用参数:
bash
proxy_pass:指定后端服务器的地址,可以是IP、域名或upstream块名称。
proxy_set_header:设置传递给后端服务器的请求头。常用的有:
Host:设置主机头为客户端请求的主机。
X-Real-IP:将客户端的真实IP传递给后端服务器。
X-Forwarded-For:记录客户端IP和代理IP的列表。
X-Forwarded-Proto:客户端请求的协议(http或https)。
负载均衡upstream定义
1.基本定义格式
http {
# upstream 块定义
upstream 后端组名称 {
# 负载均衡算法
[负载均衡算法指令];
# 后端服务器列表
server 地址 [参数];
server 地址 [参数];
# 连接控制参数
[连接控制参数];
}
server {
location / {
proxy_pass http://后端组名称;
}
}
}
2.负载均衡算法详解
轮询算法 (Round Robin) - 默认
upstream backend {
# 默认就是轮询算法,无需显式指定
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
加权轮询算法 (Weighted Round Robin)
upstream backend {
# 根据权重分配请求
server 192.168.1.101:8080 weight=5; # 50% 的请求
server 192.168.1.102:8080 weight=3; # 30% 的请求
server 192.168.1.103:8080 weight=2; # 20% 的请求
# 适用于服务器性能不同的场景
}
IP 哈希算法 (IP Hash)
upstream backend {
ip_hash; # 基于客户端IP的哈希算法
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
# 特点:
# 1. 同一客户端IP总是访问同一台后端服务器
# 2. 解决session保持问题
# 3. 适用于有状态的应用
# 4. 后端服务器宕机会自动重新哈希
}
最少连接算法 (Least Connections)
upstream backend {
least_conn; # 最少连接数优先
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080 weight=3;
server 192.168.1.103:8080 weight=2;
# 特点:
# 1. 将请求发送到当前连接数最少的服务器
# 2. 考虑权重设置
# 3. 适用于长连接场景
}
3.基本服务器参数
健康检查参数
upstream backend {
# max_fails: 最大失败次数
# fail_timeout: 失败超时时间
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
# 说明:
# 1. 在fail_timeout时间内,失败max_fails次,标记为不可用
# 2. 标记为不可用后,fail_timeout时间内不分配请求
# 3. fail_timeout后自动恢复
# 示例:
# 30秒内失败3次,标记为不可用,30秒后恢复
}
服务器状态参数
upstream backend {
# backup: 备份服务器
server 192.168.1.101:8080;
server 192.168.1.102:8080 backup; # 备份服务器
# down: 永久不可用
server 192.168.1.103:8080 down; # 永久下线
# 说明:
# 1. backup服务器只在其他服务器都不可用时才使用
# 2. down标记的服务器不参与负载均衡
# 3. 常用于维护或故障服务器
}
连接限制参数
upstream backend {
# max_conns: 最大连接数限制
server 192.168.1.101:8080 max_conns=100;
# 说明:
# 1. 限制到该服务器的最大并发连接数
# 2. 超过限制的连接会排队等待
# 3. 0表示无限制
# 4. 在Nginx 1.11.5+版本中可用
# 注意:默认连接限制不包含排队连接
}
解析参数
upstream backend {
# resolve: 动态DNS解析
server backend.example.com:8080 resolve;
# 说明:
# 1. 定期解析域名,支持DNS记录变化
# 2. 需要resolver指令配合
# 3. 在Nginx 1.5.12+版本中可用
# 配合resolver使用
resolver 8.8.8.8 8.8.4.4 valid=30s;
}
4.连接控制参数
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
# keepalive: 空闲连接池大小
keepalive 32; # 每个worker保持32个空闲连接
# keepalive_requests: 每个连接最大请求数
keepalive_requests 1000; # 每个连接处理1000个请求后关闭
# keepalive_timeout: 连接空闲超时时间
keepalive_timeout 60s; # 空闲60秒后关闭
# 说明:
# 1. 提高性能,减少TCP握手开销
# 2. 适用于HTTP/1.1
# 3. 需要proxy_http_version 1.1和proxy_set_header Connection "";
}
完整的配置案例
bash
# 全局配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
# 基础配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# 性能优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100;
client_max_body_size 100m;
# 负载均衡配置
upstream backend_cluster {
# 负载均衡算法
least_conn;
# 服务器定义
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.103:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.104:8080 backup; # 备份服务器
# 连接保持
keepalive 32;
keepalive_requests 1000;
keepalive_timeout 60s;
}
# 服务器配置
server {
listen 80;
server_name www.example.com;
# SSL配置(如果需要)
# listen 443 ssl http2;
# ssl_certificate /path/to/cert.pem;
# ssl_certificate_key /path/to/key.pem;
# 根路径代理
location / {
# 代理设置
proxy_pass http://backend_cluster;
# 请求头设置
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区设置
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
proxy_temp_file_write_size 8k;
# 错误处理
proxy_intercept_errors on;
error_page 500 502 503 504 /50x.html;
}
# 静态文件处理
location /static/ {
alias /var/www/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
}