本文目录导读:

是的,可以编写脚本自动配置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
}
使用说明
-
基本使用:
# 给脚本执行权限 chmod +x nginx-proxy.sh # 运行脚本 sudo ./nginx-proxy.sh myapp.example.com 192.168.1.100 3000
-
批量配置:
# 编辑proxies.json配置文件 python3 nginx-proxy.py # 自动读取配置文件
-
自动化部署:
# 结合CI/CD使用 ssh server "bash -s" < nginx-proxy.sh app.domain.com 10.0.0.1 8080
这些脚本可以:
- ✅ 自动创建Nginx配置
- ✅ 支持SSL证书
- ✅ 批量配置多个代理
- ✅ WebSocket支持
- ✅ 自动重载Nginx
- ✅ 错误检查和回滚
根据你的需求选择合适的脚本,建议先在测试环境验证!