你的网站能承受大量访问吗?用Nginx负载均衡解决这个问题

更新日期: 2025-12-02 阅读: 12 标签: 负载均衡

一台服务器崩溃,所有用户都访问不了网站
别着急!今天教你用Nginx做负载均衡,轻松建立高可用的网站架构!


为什么需要负载均衡?

想象一下:你开了一家很火的奶茶店,突然在抖音上爆红,门口排起长队。但店里只有一个窗口、一个员工。结果会怎样?顾客等得不耐烦,转身就走,还给你差评:"服务太差!"

线上系统也一样:

  • 单台服务器承受不了大量同时访问?

  • 服务器故障,整个网站打不开?

  • 用户体验差,用户来了又走?

解决方案就是:负载均衡!

Nginx是实现这个目标的"神器"——轻量、高效、配置简单,被全球很多大公司广泛使用。


Nginx负载均衡的5种方法

Nginx通过upstream模块,把用户请求智能地分发给多个后端服务器。下面这5种方法,总有一种适合你。

1. 轮询(默认方法)——最公平的"排队机制"

请求按顺序轮流分配给每台服务器,简单有效。

upstream backend {
    server 192.168.1.10;
    server 192.168.1.11;
}

适合:后端服务器性能差不多的场景。

2. 加权轮询——"能者多劳"

性能好的服务器多干活!通过weight设置权重。

upstream backend {
    server 192.168.1.10 weight=3;  # 处理3份请求
    server 192.168.1.11 weight=1;  # 处理1份请求
}

适合:服务器配置不一样时,合理利用资源。

3. 最少连接——"谁闲谁上"

把请求交给当前连接数最少的服务器,更智能。

upstream backend {
    least_conn;
    server 192.168.1.10;
    server 192.168.1.11;
}

适合:长连接、处理时间不均匀的服务(比如文件上传、视频转码)。

4. IP哈希——"老客户认门"

同一个用户IP,始终访问同一台服务器,天然支持会话保持!

upstream backend {
    ip_hash;
    server 192.168.1.10;
    server 192.168.1.11;
}

注意:不能和weight或least_conn同时用。
适合:没有共享Session存储的传统Web应用。

5. 健康检查——自动"踢掉"故障服务器

虽然开源版Nginx不支持主动探测,但可以用max_fails + fail_timeout实现基本容错:

server 192.168.1.10 max_fails=3 fail_timeout=30s;

意思是:如果连续失败3次,30秒内不再分配请求给它。
小技巧:配合脚本或Consul,可以实现更强大的自动剔除和恢复功能!


实战:3分钟建立一个高可用Web服务

假设你有两台应用服务器(192.168.1.10和192.168.1.11),现在用Nginx做负载均衡:

upstream myapp {
    server 192.168.1.10 weight=2 max_fails=3 fail_timeout=30s;
    server 192.168.1.11 weight=1 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://myapp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

保存配置,重新加载Nginx:

nginx -t && nginx -s reload

完成!现在你的网站不仅更快,而且一台服务器坏了也不怕!


完整配置示例

1. 基础负载均衡配置

http {
    upstream backend {
        # 后端服务器列表
        server 10.0.0.1:8080;
        server 10.0.0.2:8080;
        server 10.0.0.3:8080 backup;  # 备用服务器
    }
    
    server {
        listen 80;
        
        location / {
            proxy_pass http://backend;
            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 5s;
            proxy_read_timeout 60s;
            proxy_send_timeout 60s;
        }
    }
}

2. 带健康检查的高级配置

upstream backend {
    zone backend_zone 64k;
    
    server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.3:8080 max_fails=3 fail_timeout=30s;
    
    # 会话保持(需要Nginx Plus)
    # sticky cookie srv_id expires=1h domain=.example.com path=/;
}

# 健康检查(需要Nginx Plus)
# match server_ok {
#     status 200-399;
#     header Content-Type = text/html;
#     body ~ "Welcome";
# }
# 
# server {
#     location / {
#         proxy_pass http://backend;
#         health_check match=server_ok;
#     }
# }


常见问题解决方案

1. Session共享问题

如果应用需要保持用户登录状态,可以用Redis共享Session。

配置示例:

# 使用ip_hash保持会话
upstream backend {
    ip_hash;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
}

或者使用专门的会话存储:

# Python Flask示例
from flask import Flask, session
from flask_session import Session
import redis

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.from_url('redis://localhost:6379')
Session(app)

2. 静态文件优化

server {
    listen 80;
    
    # 静态文件直接由Nginx处理
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        
        # 如果本地没有,再转发到后端
        try_files $uri @backend;
    }
    
    location @backend {
        proxy_pass http://backend;
        # ... 其他proxy配置
    }
    
    location / {
        proxy_pass http://backend;
        # ... 其他proxy配置
    }
}

3. 限流配置

防止单个用户占用过多资源:

http {
    # 定义限流区域
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    
    server {
        location / {
            # 限制每秒10个请求
            limit_req zone=one burst=20 nodelay;
            
            proxy_pass http://backend;
        }
        
        location /api/ {
            # API接口更严格的限流
            limit_req zone=one burst=5;
            
            proxy_pass http://backend;
        }
    }
}


监控和维护

1. 状态监控

启用Nginx状态模块:

server {
    listen 8081;
    server_name localhost;
    
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

访问 http://localhost:8081/nginx_status 可以看到:

text
Active connections: 3 
server accepts handled requests
 100 100 200 
Reading: 0 Writing: 1 Waiting: 2

2. 日志配置

http {
    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;
    error_log /var/log/nginx/error.log warn;
}

3. 自动化脚本示例

健康检查脚本:

#!/bin/bash
# check_backend_health.sh

BACKENDS=("10.0.0.1:8080" "10.0.0.2:8080" "10.0.0.3:8080")
NGINX_CONF="/etc/nginx/nginx.conf"

for backend in "${BACKENDS[@]}"; do
    IP=${backend%:*}
    PORT=${backend#*:}
    
    # 检查服务是否正常
    if ! nc -z $IP $PORT; then
        echo "$(date): $backend 服务异常"
        # 自动从Nginx配置中移除故障服务器
        sed -i "/$IP:$PORT/s/^/#/" $NGINX_CONF
    else
        # 如果之前被注释了,现在恢复
        sed -i "/#.*$IP:$PORT/s/^#//" $NGINX_CONF
    fi
done

# 重新加载配置
nginx -t && nginx -s reload


性能优化建议

  1. 连接池配置

upstream backend {
    server 10.0.0.1:8080;
    
    # 连接池设置
    keepalive 32;  # 保持的连接数
    keepalive_timeout 60s;
    keepalive_requests 100;
}
  1. 缓冲区优化

location / {
    proxy_pass http://backend;
    
    # 缓冲区优化
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
    proxy_busy_buffers_size 8k;
}


写在最后

别看Nginx只是一个"反向代理",它其实是现代Web架构的基础。花10分钟配置负载均衡,可能就避免了半夜三更的"服务器崩溃危机"。稳定,才是最重要的速度保证。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13257

nginx负载均衡配置

本章给大家带来nginx负载均衡的相关配置讲解,首先大家先看下面的示意图:如上图所示;当客户端发起http请求时,先经过nginx服务器处理并重新分发请求;并下发给不同的服务器,从而实现nginx的负载均衡的简单应用。

Nginx 负载均衡原理解读

负载均衡在服务端开发中算是一个比较重要的特性。因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以分发给后台服务端(backend servers

常用负载均衡器介绍

为了保证Web应用程序的高可用性和性能,通常会使用多个应用服务器,然后使用负载均衡器接收用户的请求,将请求导向后端的应用服务器。目前有许多流行的软件可以起到负载均衡器的作用

nginx配置http负载均衡

nginx配置负载均衡需要有两个关键配置:在upstream中配置具体负载均衡信息,通过proxy_pass 来引用已经配置好的负载均衡信息

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!