Nginx 反向代理与负载均衡配置 反向代理与负载均衡配置参数

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";
        }
}
相关推荐
oMcLin2 小时前
CentOS 7.6 磁盘空间不足导致服务崩溃:如何有效清理日志文件和临时文件
linux·运维·centos
筑梦之路2 小时前
Jenkins 构建部署多模块Java应用流水线参考——筑梦之路
java·运维·jenkins
金牌归来发现妻女流落街头2 小时前
【线程池 + Socket 服务器】
java·运维·服务器·多线程
大模型铲屎官2 小时前
【操作系统-Day 47】揭秘Linux文件系统基石:图解索引分配(inode)与多级索引
linux·运维·服务器·人工智能·python·操作系统·计算机组成原理
乾元2 小时前
Network-as-Code:把 HCIE / CCIE 实验脚本转为企业级 CI 工程化流程
运维·网络·人工智能·安全·web安全·ai·架构
拾光Ծ2 小时前
Linux 进程控制:进程终止与等待・waitpid 选项参数与状态解析(告别僵尸进程)
linux·运维·服务器·进程控制
2501_930799242 小时前
vllm部署时的nginx 配置
运维·nginx·vllm
linux修理工2 小时前
ubuntu 2204 tsinghua
linux·运维·ubuntu
琥珀.2 小时前
查看linux下java服务进程是否正常
java·linux·运维