实用脚本能自动配置Nginx反向代理吗?

wen 实用脚本 3

本文目录导读:

实用脚本能自动配置Nginx反向代理吗?

  1. Bash脚本自动配置Nginx反向代理
  2. Python脚本(支持批量配置)
  3. 批量配置文件示例 (proxies.json)
  4. 高级配置脚本(带SSL和监控)
  5. 使用说明

是的,可以编写脚本自动配置Nginx反向代理,以下是几种实用的脚本方案:

Bash脚本自动配置Nginx反向代理

#!/bin/bash
# Nginx反向代理自动配置脚本
# 使用方法: ./nginx-proxy.sh 域名 后端地址 端口
DOMAIN=$1
BACKEND_URL=$2
BACKEND_PORT=$3
# 检查参数
if [ -z "$DOMAIN" ] || [ -z "$BACKEND_URL" ]; then
    echo "使用方法: $0 <域名> <后端地址> [端口]"
    echo "示例: $0 example.com 192.168.1.100 8080"
    exit 1
fi
# 设置端口
PORT=${BACKEND_PORT:-80}
# 创建配置文件
CONFIG_FILE="/etc/nginx/sites-available/$DOMAIN"
cat > $CONFIG_FILE << EOF
server {
    listen 80;
    server_name $DOMAIN;
    location / {
        proxy_pass http://$BACKEND_URL:$PORT;
        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;
        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade \$http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    # 安全头
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";
}
EOF
# 启用网站
ln -sf $CONFIG_FILE /etc/nginx/sites-enabled/ 2>/dev/null
# 检查配置并重启
nginx -t && systemctl reload nginx
echo "✅ 反向代理配置完成!"
echo "域名: $DOMAIN → 后端: $BACKEND_URL:$PORT"

Python脚本(支持批量配置)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import json
import subprocess
def create_nginx_proxy(domain, backend_url, backend_port=80, ssl=False):
    """创建Nginx反向代理配置"""
    config = f"""
server {{
    listen {"443 ssl" if ssl else "80"};
    server_name {domain};
    location / {{
        proxy_pass http://{backend_url}:{backend_port};
        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;
    }}
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {{
        expires 1y;
        add_header Cache-Control "public, immutable";
    }}
}}
"""
    if ssl:
        config = config.replace("listen 443 ssl;", 
            f"listen 443 ssl;\n    ssl_certificate /etc/nginx/ssl/{domain}.pem;\n    ssl_certificate_key /etc/nginx/ssl/{domain}.key;")
    # 写入配置
    config_path = f"/etc/nginx/sites-available/{domain}"
    with open(config_path, 'w') as f:
        f.write(config)
    # 创建符号链接
    enabled_path = f"/etc/nginx/sites-enabled/{domain}"
    if not os.path.exists(enabled_path):
        os.symlink(config_path, enabled_path)
    return config_path
def batch_configure(config_file="proxies.json"):
    """批量配置多个反向代理"""
    with open(config_file, 'r') as f:
        proxies = json.load(f)
    for proxy in proxies:
        print(f"配置 {proxy['domain']}...")
        create_nginx_proxy(
            proxy['domain'],
            proxy['backend'],
            proxy.get('port', 80),
            proxy.get('ssl', False)
        )
    # 重启Nginx
    subprocess.run(["nginx", "-t"], check=True)
    subprocess.run(["systemctl", "reload", "nginx"], check=True)
    print("✅ 所有反向代理配置完成!")
if __name__ == "__main__":
    # 单个配置
    if len(sys.argv) >= 3:
        create_nginx_proxy(
            sys.argv[1], 
            sys.argv[2], 
            int(sys.argv[3]) if len(sys.argv) > 3 else 80
        )
    else:
        # 批量配置
        batch_configure()

批量配置文件示例 (proxies.json)

[
    {
        "domain": "app.example.com",
        "backend": "192.168.1.10",
        "port": 3000,
        "ssl": false
    },
    {
        "domain": "api.example.com",
        "backend": "192.168.1.20",
        "port": 8080,
        "ssl": true
    },
    {
        "domain": "admin.example.com",
        "backend": "localhost",
        "port": 9000,
        "ssl": false
    }
]

高级配置脚本(带SSL和监控)

#!/bin/bash
# 高级反向代理配置脚本
# 支持SSL、WebSocket、负载均衡等
init_ssl() {
    local domain=$1
    # 使用Let's Encrypt自动获取SSL证书
    certbot --nginx -d $domain --non-interactive --agree-tos -m admin@$domain
}
config_advanced() {
    local domain=$1
    shift
    local backends=("$@")
    cat > /etc/nginx/sites-available/$domain << 'EOF'
upstream backend_$domain {
    least_conn;  # 最少连接数负载均衡
EOF
    for backend in "${backends[@]}"; do
        echo "    server $backend;" >> /etc/nginx/sites-available/$domain
    done
    cat >> /etc/nginx/sites-available/$domain << 'EOF'
}
server {
    listen 80;
    server_name $domain;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl http2;
    server_name $domain;
    ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
    # 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://backend_$domain;
        # ... 其他代理设置
    }
}
EOF
}
# 监控脚本
monitor_nginx() {
    while true; do
        if systemctl is-active --quiet nginx; then
            echo "Nginx运行正常 - $(date)"
        else
            echo "❌ Nginx异常,尝试重启..."
            systemctl restart nginx
        fi
        sleep 60
    done
}

使用说明

  1. 基本使用

    # 给脚本执行权限
    chmod +x nginx-proxy.sh
    # 运行脚本
    sudo ./nginx-proxy.sh myapp.example.com 192.168.1.100 3000
  2. 批量配置

    # 编辑proxies.json配置文件
    python3 nginx-proxy.py  # 自动读取配置文件
  3. 自动化部署

    # 结合CI/CD使用
    ssh server "bash -s" < nginx-proxy.sh app.domain.com 10.0.0.1 8080

这些脚本可以:

  • ✅ 自动创建Nginx配置
  • ✅ 支持SSL证书
  • ✅ 批量配置多个代理
  • ✅ WebSocket支持
  • ✅ 自动重载Nginx
  • ✅ 错误检查和回滚

根据你的需求选择合适的脚本,建议先在测试环境验证!

抱歉,评论功能暂时关闭!