本文目录导读:

我来介绍几种自动更新Nginx配置的脚本方案:
基础Shell脚本方案
动态配置文件生成脚本
#!/bin/bash
# update_nginx_config.sh
# 配置变量
SITES_ENABLED="/etc/nginx/sites-enabled"
NGINX_CONF_DIR="/etc/nginx/conf.d"
BACKUP_DIR="/var/backups/nginx"
TEMPLATE_DIR="/etc/nginx/templates"
# 创建备份
backup_config() {
local timestamp=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
tar -czf "$BACKUP_DIR/nginx_backup_$timestamp.tar.gz" $SITES_ENABLED $NGINX_CONF_DIR
echo "备份完成:$BACKUP_DIR/nginx_backup_$timestamp.tar.gz"
}
# 从模板生成配置
generate_from_template() {
local domain=$1
local port=$2
local template="$TEMPLATE_DIR/site.conf.template"
# 替换模板变量
sed -e "s/{{DOMAIN}}/$domain/g" \
-e "s/{{PORT}}/$port/g" \
"$template" > "$SITES_ENABLED/$domain.conf"
echo "已生成配置:$domain.conf"
}
# 更新配置
update_config() {
local config_file=$1
# 检查配置语法
nginx -t -c /etc/nginx/nginx.conf
if [ $? -eq 0 ]; then
# 重新加载
nginx -s reload
echo "Nginx配置已重新加载"
else
echo "配置语法错误,回滚更改"
# 从备份恢复
latest_backup=$(ls -t $BACKUP_DIR/*.tar.gz | head -1)
tar -xzf "$latest_backup" -C /
fi
}
# 主函数
main() {
backup_config
# 从数据源获取配置(示例从JSON文件读取)
if [ -f "/tmp/new_config.json" ]; then
while IFS= read -r config; do
domain=$(echo $config | jq -r '.domain')
port=$(echo $config | jq -r '.port')
generate_from_template $domain $port
done < <(cat /tmp/new_config.json | jq -c '.[]')
fi
update_config
}
main
使用Python的高级自动化脚本
#!/usr/bin/env python3
# nginx_config_manager.py
import os
import json
import subprocess
import shutil
import logging
from datetime import datetime
from jinja2 import Environment, FileSystemLoader
class NginxConfigManager:
def __init__(self):
self.nginx_conf_dir = '/etc/nginx'
self.sites_dir = '/etc/nginx/sites-enabled'
self.template_dir = '/etc/nginx/templates'
self.backup_dir = '/var/backups/nginx'
self.logger = self.setup_logging()
def setup_logging(self):
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('/var/log/nginx_auto_update.log'),
logging.StreamHandler()
]
)
return logging.getLogger(__name__)
def backup_config(self):
"""备份当前配置"""
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_file = f"{self.backup_dir}/nginx_backup_{timestamp}.tar.gz"
os.makedirs(self.backup_dir, exist_ok=True)
# 备份配置目录
subprocess.run(['tar', '-czf', backup_file, '-C', '/etc', 'nginx'], check=True)
self.logger.info(f"配置备份完成: {backup_file}")
return backup_file
def generate_config_from_template(self, data):
"""使用Jinja2模板生成配置"""
env = Environment(loader=FileSystemLoader(self.template_dir))
template = env.get_template('site.conf.j2')
for site in data['sites']:
config_content = template.render(site)
config_file = f"{self.sites_dir}/{site['domain']}.conf"
with open(config_file, 'w') as f:
f.write(config_content)
self.logger.info(f"生成配置: {config_file}")
def validate_and_reload(self):
"""验证配置并重新加载"""
# 测试配置语法
result = subprocess.run(['nginx', '-t'], capture_output=True, text=True)
if result.returncode != 0:
self.logger.error(f"配置语法错误: {result.stderr}")
return False
# 重新加载Nginx
result = subprocess.run(['nginx', '-s', 'reload'], capture_output=True)
if result.returncode == 0:
self.logger.info("Nginx配置已成功重新加载")
return True
else:
self.logger.error("重新加载Nginx失败")
return False
def rollback(self):
"""回滚配置"""
backups = sorted(os.listdir(self.backup_dir), reverse=True)
if backups:
latest_backup = f"{self.backup_dir}/{backups[0]}"
subprocess.run(['tar', '-xzf', latest_backup, '-C', '/etc'], check=True)
self.logger.info(f"已回滚到备份: {latest_backup}")
self.validate_and_reload()
def update_from_api(self, api_url, api_key):
"""从API获取配置信息并更新"""
import requests
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get(api_url, headers=headers)
if response.status_code == 200:
config_data = response.json()
self.process_config_update(config_data)
else:
self.logger.error(f"API请求失败: {response.status_code}")
def process_config_update(self, config_data):
"""处理配置更新"""
try:
# 备份当前配置
backup_file = self.backup_config()
# 生成新配置
self.generate_config_from_template(config_data)
# 验证并重新加载
if not self.validate_and_reload():
# 如果验证失败,回滚
self.rollback()
self.logger.warning("配置更新失败,已自动回滚")
else:
self.logger.info("配置更新成功")
except Exception as e:
self.logger.error(f"配置更新过程中发生错误: {str(e)}")
self.rollback()
# 使用示例
if __name__ == "__main__":
manager = NginxConfigManager()
# 示例配置数据
config_data = {
"sites": [
{
"domain": "example.com",
"ssl_cert": "/etc/ssl/certs/example.crt",
"ssl_key": "/etc/ssl/private/example.key",
"proxy_pass": "http://localhost:8080"
}
]
}
# 更新配置
manager.process_config_update(config_data)
Jinja2模板示例
# /etc/nginx/templates/site.conf.j2
server {
listen 80;
server_name {{ domain }};
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name {{ domain }};
ssl_certificate {{ ssl_cert }};
ssl_certificate_key {{ ssl_key }};
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass {{ proxy_pass }};
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;
}
}
使用cron定时更新
# 添加到crontab (每5分钟检查一次更新) */5 * * * * /usr/local/bin/nginx_auto_update.sh # 或使用systemd timer # /etc/systemd/system/nginx-config-update.service [Unit] Description=Nginx Config Auto Update Service [Service] Type=oneshot ExecStart=/usr/local/bin/nginx_auto_update.sh User=root # /etc/systemd/system/nginx-config-update.timer [Unit] Description=Run nginx config update every 5 minutes [Timer] OnCalendar=*:0/5 Persistent=true [Install] WantedBy=timers.target
配置更新的安全措施
#!/bin/bash
# safe_nginx_update.sh
# 创建临时目录
TEMP_DIR=$(mktemp -d)
# 导出当前配置
cp -r /etc/nginx/* $TEMP_DIR/
# 应用新配置
# ... 这里放置更新逻辑 ...
# 使用临时配置测试
nginx -c $TEMP_DIR/nginx.conf -t
if [ $? -eq 0 ]; then
# 复制到实际位置
cp -r $TEMP_DIR/* /etc/nginx/
nginx -s reload
echo "安全更新完成"
else
echo "配置错误,保留原配置"
fi
# 清理临时目录
rm -rf $TEMP_DIR
使用建议
- 版本控制:使用Git管理配置模板
- 测试环境:先在测试环境验证
- 监控告警:添加配置错误的告警机制
- 原子操作:确保配置更新过程中的原子性
- 权限控制:限制脚本执行权限
这些脚本可以根据你的具体需求进行定制,实现配置的自动化管理。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播