原创

docker nginx 的配置

温馨提示:
本文最后更新于 2025年09月26日,已超过 260 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

自身

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
}


负载均衡

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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;
    types_hash_max_size 2048;

    # 定义后端服务器负载均衡
    upstream backend {
        server 123.207.64.127:38085;
        server 123.207.64.127:8443;
    }

    # 示例 server 块,使用 upstream
    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;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

负载均衡调优 .conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  10240;
    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;
  access_log off;
    keepalive_timeout  65;
    types_hash_max_size 2048;

    # 定义后端服务器负载均衡
upstream backend {
    server 10.206.16.12:9002;
    server 10.206.16.12:9003;
    server 10.206.16.12:9004;
    server 10.206.16.12:9005;
    server 10.206.16.12:9006;
    server 10.206.16.12:9007;
    server 10.206.16.12:9008;
    server 10.206.16.12:9009;
    server 10.206.16.12:9010;
    server 10.206.16.12:9011;
    server 10.206.16.12:9012;
}

    # 示例 server 块,使用 upstream
    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;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

 ./start-nginx.sh 

#!/bin/bash

# 默认路径
DEFAULT_NGINX_CONF_PATH="/etc/nginx"
DEFAULT_NGINX_HTML_PATH="/var/www/html"
DEFAULT_NGINX_LOG_PATH="/var/log/nginx"

# 显示使用帮助
show_help() {
    echo "Usage: $0 [OPTIONS]"
    echo "Options:"
    echo "  -c, --conf-path PATH    Nginx 配置文件根路径 (默认: $DEFAULT_NGINX_CONF_PATH)"
    echo "  -w, --web-path PATH     Nginx 网站文件路径 (默认: $DEFAULT_NGINX_HTML_PATH)"
    echo "  -p, --port PORT         对外暴露的HTTP端口号 (默认: 80)"
    echo "  -s, --https-port PORT   对外暴露的HTTPS端口号 (默认: 443)"
    echo "  -n, --container-name NAME  容器名称 (默认: nginx-container)"
    echo "  --help                  显示此帮助信息"
    echo ""
    echo "说明:"
    echo "  所有 nginx 配置文件都将放在 conf-path 路径下,包括:"
    echo "  - 主配置文件: conf-path/nginx.conf"
    echo "  - MIME类型: conf-path/mime.types"
    echo "  - 网站配置: conf-path/conf.d/"
    echo "  - SSL证书: conf-path/ssl/"
    echo ""
    echo "示例:"
    echo "  $0"
    echo "  $0 -c /custom/nginx -w /var/www/my-site"
    echo "  $0 -p 8080 -s 8443"
    echo "  $0 --conf-path /etc/my-nginx --web-path /var/www/html --port 8080 --container-name my-nginx"
}

# 初始化变量
NGINX_CONF_PATH=""
NGINX_HTML_PATH=""
CONTAINER_NAME="nginx-container"
HTTP_PORT="80"
HTTPS_PORT="443"

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -c|--conf-path)
            NGINX_CONF_PATH="$2"
            shift 2
            ;;
        -w|--web-path)
            NGINX_HTML_PATH="$2"
            shift 2
            ;;
        -p|--port)
            HTTP_PORT="$2"
            shift 2
            ;;
        -s|--https-port)
            HTTPS_PORT="$2"
            shift 2
            ;;
        -n|--container-name)
            CONTAINER_NAME="$2"
            shift 2
            ;;
        --help)
            show_help
            exit 0
            ;;
        *)
            echo "未知参数: $1"
            show_help
            exit 1
            ;;
    esac
done

# 设置默认值
NGINX_CONF_PATH=${NGINX_CONF_PATH:-$DEFAULT_NGINX_CONF_PATH}
NGINX_HTML_PATH=${NGINX_HTML_PATH:-$DEFAULT_NGINX_HTML_PATH}
NGINX_LOG_PATH="$NGINX_CONF_PATH/logs"

# 检查是否已安装 Docker
if ! command -v docker &> /dev/null; then
    echo "错误: 未检测到 Docker,请先安装 Docker"
    exit 1
fi

# 检查 Docker 是否正在运行
if ! docker info &> /dev/null; then
    echo "错误: Docker 服务未运行,请启动 Docker 服务"
    exit 1
fi

echo "=================================="
echo "开始部署 Nginx 容器"
echo "=================================="
echo "配置根路径: $NGINX_CONF_PATH"
echo "网站文件路径: $NGINX_HTML_PATH"
echo "日志文件路径: $NGINX_LOG_PATH"
echo "HTTP对外端口: $HTTP_PORT"
echo "HTTPS对外端口: $HTTPS_PORT"
echo "容器名称: $CONTAINER_NAME"
echo "=================================="

# 创建必要的目录
echo "创建 nginx 相关目录..."
mkdir -p "$NGINX_CONF_PATH"
mkdir -p "$NGINX_CONF_PATH/conf.d"
mkdir -p "$NGINX_CONF_PATH/ssl"
mkdir -p "$NGINX_HTML_PATH"
mkdir -p "$NGINX_LOG_PATH"

# 创建 MIME 类型文件
echo "创建 MIME 类型配置文件..."
cat > "$NGINX_CONF_PATH/mime.types" << 'EOF'
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;

    application/font-woff                            woff;
    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.wap.wmlc                         wmlc;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}
EOF

# 创建主配置文件
echo "创建主配置文件..."
cat > "$NGINX_CONF_PATH/nginx.conf" << EOF
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
}
EOF

# 创建默认网站配置
echo "创建默认网站配置..."
cat > "$NGINX_CONF_PATH/conf.d/default.conf" << EOF
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
EOF

# 创建默认首页文件 - 使用优化后的现代化页面
echo "创建默认首页文件..."
cat > "$NGINX_HTML_PATH/index.html" << EOF
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Welcome to Nginx</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            line-height: 1.6;
            color: #333;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 20px;
        }
        
        .container {
            background: rgba(255, 255, 255, 0.95);
            border-radius: 15px;
            box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
            padding: 40px;
            width: 100%;
            max-width: 800px;
            backdrop-filter: blur(10px);
        }
        
        .header {
            text-align: center;
            margin-bottom: 30px;
        }
        
        .logo {
            font-size: 3.5em;
            color: #009900;
            margin-bottom: 15px;
            font-weight: bold;
        }
        
        h1 {
            color: #2c3e50;
            margin-bottom: 10px;
            font-weight: 600;
        }
        
        .subtitle {
            color: #7f8c8d;
            font-size: 1.2em;
            margin-bottom: 30px;
        }
        
        .section {
            margin-bottom: 30px;
            padding: 20px;
            border-radius: 10px;
            background: #f8f9fa;
            border-left: 4px solid #667eea;
        }
        
        h2 {
            color: #2c3e50;
            margin-bottom: 15px;
            display: flex;
            align-items: center;
        }
        
        ul {
            list-style-type: none;
            padding-left: 0;
        }
        
        li {
            padding: 10px 0;
            border-bottom: 1px solid #eee;
        }
        
        li:last-child {
            border-bottom: none;
        }
        
        .config-label {
            font-weight: 600;
            color: #2c3e50;
            display: inline-block;
            width: 120px;
        }
        
        .config-value {
            color: #667eea;
            font-family: 'Courier New', monospace;
        }
        
        .links {
            display: flex;
            justify-content: space-around;
            flex-wrap: wrap;
            margin-top: 30px;
        }
        
        .link-card {
            background: #fff;
            border-radius: 10px;
            padding: 20px;
            text-align: center;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            flex: 1;
            margin: 0 10px;
            min-width: 120px;
        }
        
        .link-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
        }
        
        .link-card a {
            text-decoration: none;
            color: #667eea;
            font-weight: 600;
        }
        
        .footer {
            text-align: center;
            margin-top: 30px;
            color: #7f8c8d;
            font-size: 0.9em;
        }
        
        .status-indicator {
            display: inline-block;
            width: 12px;
            height: 12px;
            border-radius: 50%;
            background-color: #27ae60;
            margin-right: 8px;
            animation: pulse 2s infinite;
        }
        
        @keyframes pulse {
            0% { opacity: 1; }
            50% { opacity: 0.5; }
            100% { opacity: 1; }
        }
        
        @media (max-width: 768px) {
            .container {
                padding: 20px;
            }
            
            .links {
                flex-direction: column;
                align-items: center;
            }
            
            .link-card {
                margin: 10px 0;
                width: 100%;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <div class="logo">nginx</div>
            <h1>Welcome to Nginx!</h1>
            <p class="subtitle">高性能HTTP和反向代理服务器</p>
        </div>
        
        <div class="section">
            <h2>ℹ️ 服务器状态</h2>
            <p><span class="status-indicator"></span> Nginx 正在运行</p>
        </div>
        
        <div class="section">
            <h2>⚙️ 配置信息</h2>
            <ul>
                <li><span class="config-label">配置根路径:</span> <span class="config-value">$NGINX_CONF_PATH</span></li>
                <li><span class="config-label">网站文件路径:</span> <span class="config-value">$NGINX_HTML_PATH</span></li>
                <li><span class="config-label">日志文件路径:</span> <span class="config-value">$NGINX_LOG_PATH</span></li>
                <li><span class="config-label">HTTP端口:</span> <span class="config-value">$HTTP_PORT</span></li>
                <li><span class="config-label">HTTPS端口:</span> <span class="config-value">$HTTPS_PORT</span></li>
            </ul>
        </div>
        
        <div class="section">
            <h2>? 有用链接</h2>
            <div class="links">
                <div class="link-card">
                    <a href="http://nginx.org/" target="_blank">官方文档</a>
                </div>
                <div class="link-card">
                    <a href="http://nginx.com/" target="_blank">商业支持</a>
                </div>
                <div class="link-card">
                    <a href="https://github.com/nginx/nginx" target="_blank">源码</a>
                </div>
            </div>
        </div>
        
        <div class="footer">
            <p>Thank you for using nginx.</p>
            <p>nginx version: latest</p>
        </div>
    </div>
</body>
</html>
EOF

# 停止并删除已存在的同名容器
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
    echo "停止并删除已存在的容器: $CONTAINER_NAME"
    docker stop "$CONTAINER_NAME" >/dev/null 2>&1
    docker rm "$CONTAINER_NAME" >/dev/null 2>&1
fi

# 启动 nginx 容器
echo "启动 nginx 容器..."
docker run -d \
  --name "$CONTAINER_NAME" \
  --restart=always \
  -p "$HTTP_PORT:80" \
  -p "$HTTPS_PORT:443" \
  -v "$NGINX_CONF_PATH":/etc/nginx \
  -v "$NGINX_HTML_PATH":/var/www/html \
  -v "$NGINX_LOG_PATH":/var/log/nginx \
  nginx:latest

if [ $? -eq 0 ]; then
    echo ""
    echo "=================================="
    echo "Nginx 容器启动成功!"
    echo "=================================="
    echo "配置根路径: $NGINX_CONF_PATH"
    echo "网站文件路径: $NGINX_HTML_PATH"
    echo "日志文件路径: $NGINX_LOG_PATH"
    echo "HTTP对外端口: $HTTP_PORT"
    echo "HTTPS对外端口: $HTTPS_PORT"
    echo "容器名称: $CONTAINER_NAME"
    echo ""
    echo "目录结构:"
    echo "  $NGINX_CONF_PATH/"
    echo "    ├── nginx.conf          # 主配置文件"
    echo "    ├── mime.types          # MIME类型配置"
    echo "    ├── conf.d/             # 站点配置目录"
    echo "    │   └── default.conf    # 默认站点配置"
    echo "    ├── ssl/                # SSL证书目录"
    echo "    └── logs/               # 日志目录"
    echo ""
    echo "访问地址: http://localhost:$HTTP_PORT"
    echo "HTTPS地址: https://localhost:$HTTPS_PORT (需要配置证书)"
    echo "查看日志: docker logs $CONTAINER_NAME"
    echo "进入容器: docker exec -it $CONTAINER_NAME /bin/bash"
    echo "=================================="
else
    echo "错误: Nginx 容器启动失败"
    exit 1
fi


启动命令

 ./start-nginx.sh -c /mydata/nginx82  -w /mnt/data -p 82 -s 1443 -n static-nginx


主从 负载 nginx cn.sh

#!/bin/bash

# 颜色定义
declare -a colors=("red" "blue" "green" "orange" "purple" "cyan")

# HTML目录定义
HTML_DIR="html"

# 参数处理
if [ $# -gt 4 ]; then
  echo "Usage: $0 [cluster_size] [lb_cluster_size] [host_port] [config_dir]"
  echo "  cluster_size:     后端节点数量 (默认: 3)"
  echo "  lb_cluster_size:  负载均衡器数量 (最小: 1)"
  echo "  host_port:        暴露的主机端口 (默认: 8080)"
  echo "  config_dir:       配置文件存储目录 (默认: ./nginx-configs)"
  exit 1
fi

# 参数解析
CLUSTER_SIZE=${1:-3}
LB_CLUSTER_SIZE=${2:-2}
HOST_PORT=${3:-8080}
CONFIG_DIR=${4:-./nginx-configs}

# 参数验证
if ! [[ "$CLUSTER_SIZE" =~ ^[0-9]+$ ]] || [ "$CLUSTER_SIZE" -le 0 ]; then
  echo "Error: Cluster size must be a positive integer"
  exit 1
fi

if ! [[ "$LB_CLUSTER_SIZE" =~ ^[0-9]+$ ]] || [ "$LB_CLUSTER_SIZE" -lt 1 ]; then
  echo "Error: Load balancer cluster size must be at least 1"
  exit 1
fi

if ! [[ "$HOST_PORT" =~ ^[0-9]+$ ]] || [ "$HOST_PORT" -lt 1024 ] || [ "$HOST_PORT" -gt 65535 ]; then
  echo "Error: Port must be between 1024 and 65535"
  exit 1
fi

# 路径验证
if [ -e "$CONFIG_DIR" ] && [ ! -d "$CONFIG_DIR" ]; then
  echo "Error: Config path exists but is not a directory"
  exit 1
fi

# 网络配置(新增)
NETWORK_NAME=nginx-cluster

# 创建配置目录
mkdir -p "$CONFIG_DIR"
CONFIG_ROOT=$(cd "$CONFIG_DIR" && pwd)

# 文件定义
MAIN_CONF="nginx.conf"
LB_DIR="lb"

# 清理旧资源
docker rm -f nginx-node-* nginx-lb-* 2>/dev/null
docker network rm $NETWORK_NAME 2>/dev/null
rm -rf "$CONFIG_ROOT"
mkdir -p "$CONFIG_ROOT"

# 创建自定义网络(新增)
docker network create -d bridge --subnet=192.168.1.0/24 $NETWORK_NAME

# 生成主配置文件
cat <<'EOF' > "$CONFIG_ROOT/$MAIN_CONF"
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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;
    keepalive_timeout  65;

    # Gzip 设置
    gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
EOF

# 启动后端节点
for i in $(seq 1 $CLUSTER_SIZE); do
  # 创建节点目录结构
  NODE_DIR="$CONFIG_ROOT/node-$i"
  mkdir -p "$NODE_DIR/conf.d" "$NODE_DIR/$HTML_DIR"
  
  # 生成节点配置文件
  cat <<EOF > "$NODE_DIR/conf.d/default.conf"
server {
    listen 80;
    
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files \$uri \$uri/ =404;
    }
}
EOF

  # 生成节点页面
  cat <<EOF > "$NODE_DIR/$HTML_DIR/index.html"
<!DOCTYPE html>
<html>
<head><title>Node $i</title></head>
<body style="background-color:${colors[$((i-1))]}">
<h1>Node $i</h1>
<p>Backend Server</p>
<p>Container ID: Placeholder</p>
</body>
</html>
EOF

  # 启动容器(使用自定义网络)
  docker run -d \
    --name nginx-node-$i \
    --network $NETWORK_NAME \
    --ip 192.168.1.$((i+10)) \
    -v "$NODE_DIR/conf.d:/etc/nginx/conf.d" \
    -v "$NODE_DIR/$HTML_DIR:/usr/share/nginx/html" \
    -v "$CONFIG_ROOT/$MAIN_CONF:/etc/nginx/nginx.conf" \
    nginx:latest
done

# 创建负载均衡器配置
mkdir -p "$CONFIG_ROOT/$LB_DIR/conf.d"
LB_CONF="$CONFIG_ROOT/$LB_DIR/conf.d/default.conf"

# 生成负载均衡配置
cat <<EOF > $LB_CONF
upstream backend {
    least_conn;
$(for i in $(seq 1 $CLUSTER_SIZE); do echo "    server nginx-node-$i:80;"; done)
    keepalive 32;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        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_cache_bypass \$http_upgrade;
    }
    
    location /_status {
        stub_status on;
        access_log off;
        allow all;
    }
}
EOF

# 启动负载均衡器集群
for i in $(seq 1 $LB_CLUSTER_SIZE); do
  # 启动容器(使用自定义网络)
  docker run -d \
    --name nginx-lb-$i \
    --network $NETWORK_NAME \
    --ip 192.168.1.$((i+20)) \
    -p $((HOST_PORT+i-1)):80 \
    -v "$CONFIG_ROOT/lb/conf.d:/etc/nginx/conf.d" \
    -v "$CONFIG_ROOT/$MAIN_CONF:/etc/nginx/nginx.conf" \
    nginx:latest
done

# 等待容器初始化
sleep 3

# 更新页面中的容器ID
for i in $(seq 1 $CLUSTER_SIZE); do
  CONTAINER_ID=$(docker inspect --format='{{.Id}}' nginx-node-$i | cut -c1-12)
  sed -i "s/Placeholder/$CONTAINER_ID/" "$CONFIG_ROOT/node-$i/$HTML_DIR/index.html"
  docker cp "$CONFIG_ROOT/node-$i/$HTML_DIR/index.html" nginx-node-$i:/usr/share/nginx/html/index.html
done

# 输出信息
echo "✅ 基础负载均衡集群已启动"
echo "配置目录: $CONFIG_ROOT"
echo "后端集群规模: $CLUSTER_SIZE 节点"
echo "负载均衡器集群规模: $LB_CLUSTER_SIZE 实例"
echo "访问地址: http://$(hostname):$HOST_PORT (端口映射: $HOST_PORT->$((HOST_PORT+LB_CLUSTER_SIZE-1)))"
echo "节点样式:"
for i in $(seq 1 $CLUSTER_SIZE); do
  echo "Node $i -> 背景颜色: ${colors[$((i-1))]}"
done


启动命令

./cn.sh 1 1 1026 /data/configs

nginx 中的健康检查

upstream gateway_servers { server 192.168.1.201:8080 weight=5; # Spring Cloud Gateway 实例1 server 192.168.1.202:8080 weight=5; # 实例2 check interval=3000 rise=2 fall=3 timeout=1000; } 这句的含义: check interval=3000 rise=2 fall=3 timeout=1000;

解释:

这是 `nginx` 中用于配置 upstream 服务器健康检查的指令,具体含义如下:

- `interval=3000`: 健康检查间隔为 3000 毫秒(3 秒),即每 3 秒检查一次后端服务器状态

- `rise=2`: 服务器从不可用状态恢复到可用状态需要连续 2 次健康检查成功

- `fall=3`: 服务器从可用状态变为不可用状态需要连续 3 次健康检查失败

- `timeout=1000`: 每次健康检查的超时时间为 1000 毫秒(1 秒),超过此时间未响应则视为检查失败

该配置确保了对 `gateway_servers` 这个 upstream 中的 Spring Cloud Gateway 实例进行定期健康监测,自动剔除故障节点,保证服务的高可用性。


使用 Nginx Stream 模块(Nginx 1.9+ 支持)



# /etc/nginx/nginx.conf

stream {
    upstream mysql_backend {
        server 192.168.1.150:3306 max_fails=2 fail_timeout=10s;
        server 192.168.1.151:3306 max_fails=2 fail_timeout=10s;
    }

    upstream redis_backend {
        server 192.168.1.160:6379 weight=1;
        server 192.168.1.161:6379 weight=1;
    }

    # 转发 MySQL 流量
    server {
        listen 3307;
        proxy_pass mysql_backend;
        proxy_timeout 30s;
        proxy_responses 1;
    }

    # 转发 Redis 流量
    server {
        listen 6380;
        proxy_pass redis_backend;
    }
}<br style="box-sizing: border-box; padding: 0px; margin: 0px;"/>✅ 启动后:

外部连接 VIP:3307 → 自动转发到真实 MySQL 主从
连接 VIP:6380 → 访问 Redis 集群入口


正文到此结束