342 lines
8.6 KiB
Bash
342 lines
8.6 KiB
Bash
#!/bin/bash
|
|
|
|
# Ubuntu环境下Nginx多客户端配置快速部署脚本
|
|
# 使用方法: chmod +x ubuntu-nginx-setup.sh && ./ubuntu-nginx-setup.sh
|
|
|
|
set -e # 遇到错误立即退出
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 日志函数
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# 检查是否为root用户
|
|
check_root() {
|
|
if [[ $EUID -eq 0 ]]; then
|
|
log_warning "检测到root用户,建议使用sudo执行此脚本"
|
|
fi
|
|
}
|
|
|
|
# 检查系统要求
|
|
check_requirements() {
|
|
log_info "检查系统要求..."
|
|
|
|
# 检查操作系统
|
|
if [[ ! -f /etc/os-release ]]; then
|
|
log_error "无法检测操作系统版本"
|
|
exit 1
|
|
fi
|
|
|
|
. /etc/os-release
|
|
log_info "操作系统: $PRETTY_NAME"
|
|
|
|
# 检查网络连接
|
|
if ! ping -c 1 172.16.0.34 &> /dev/null; then
|
|
log_warning "无法连接到开发服务器 172.16.0.34,请确保网络连接正常"
|
|
fi
|
|
|
|
log_success "系统要求检查完成"
|
|
}
|
|
|
|
# 安装Nginx
|
|
install_nginx() {
|
|
log_info "检查Nginx安装状态..."
|
|
|
|
if command -v nginx &> /dev/null; then
|
|
NGINX_VERSION=$(nginx -v 2>&1 | cut -d' ' -f3 | cut -d'/' -f2)
|
|
log_info "Nginx已安装,版本: $NGINX_VERSION"
|
|
return 0
|
|
fi
|
|
|
|
log_info "安装Nginx..."
|
|
sudo apt update
|
|
sudo apt install -y nginx
|
|
|
|
# 启动并启用Nginx服务
|
|
sudo systemctl start nginx
|
|
sudo systemctl enable nginx
|
|
|
|
log_success "Nginx安装完成"
|
|
}
|
|
|
|
# 备份原始配置
|
|
backup_config() {
|
|
log_info "备份原始Nginx配置..."
|
|
|
|
BACKUP_DIR="/etc/nginx/backup-$(date +%Y%m%d-%H%M%S)"
|
|
sudo mkdir -p "$BACKUP_DIR"
|
|
|
|
# 备份主要配置文件
|
|
if [[ -f /etc/nginx/nginx.conf ]]; then
|
|
sudo cp /etc/nginx/nginx.conf "$BACKUP_DIR/"
|
|
fi
|
|
|
|
if [[ -f /etc/nginx/sites-available/default ]]; then
|
|
sudo cp /etc/nginx/sites-available/default "$BACKUP_DIR/"
|
|
fi
|
|
|
|
# 备份现有的conf.d配置
|
|
if [[ -d /etc/nginx/conf.d ]]; then
|
|
sudo cp -r /etc/nginx/conf.d "$BACKUP_DIR/"
|
|
fi
|
|
|
|
log_success "配置已备份到: $BACKUP_DIR"
|
|
}
|
|
|
|
# 创建多客户端配置
|
|
create_multi_client_config() {
|
|
log_info "创建多客户端Nginx配置..."
|
|
|
|
# 确保conf.d目录存在
|
|
sudo mkdir -p /etc/nginx/conf.d
|
|
|
|
# 检查配置文件是否存在
|
|
if [[ ! -f "nginx-ubuntu-optimized.conf" ]]; then
|
|
log_error "找不到nginx-ubuntu-optimized.conf文件,请确保文件在当前目录"
|
|
exit 1
|
|
fi
|
|
|
|
# 复制配置文件
|
|
sudo cp nginx-ubuntu-optimized.conf /etc/nginx/conf.d/multi-client.conf
|
|
|
|
# 设置正确的权限
|
|
sudo chown root:root /etc/nginx/conf.d/multi-client.conf
|
|
sudo chmod 644 /etc/nginx/conf.d/multi-client.conf
|
|
|
|
log_success "多客户端配置已创建"
|
|
}
|
|
|
|
# 创建日志目录
|
|
setup_logging() {
|
|
log_info "设置日志目录..."
|
|
|
|
# 创建客户端日志目录
|
|
sudo mkdir -p /var/log/nginx/clients
|
|
|
|
# 设置权限
|
|
sudo chown -R www-data:www-data /var/log/nginx
|
|
sudo chmod -R 755 /var/log/nginx
|
|
|
|
# 创建日志轮转配置
|
|
sudo tee /etc/logrotate.d/nginx-clients > /dev/null <<EOF
|
|
/var/log/nginx/client-*-access.log {
|
|
daily
|
|
missingok
|
|
rotate 52
|
|
compress
|
|
delaycompress
|
|
notifempty
|
|
create 644 www-data www-data
|
|
postrotate
|
|
systemctl reload nginx
|
|
endscript
|
|
}
|
|
|
|
/var/log/nginx/client-*-error.log {
|
|
daily
|
|
missingok
|
|
rotate 52
|
|
compress
|
|
delaycompress
|
|
notifempty
|
|
create 644 www-data www-data
|
|
postrotate
|
|
systemctl reload nginx
|
|
endscript
|
|
}
|
|
EOF
|
|
|
|
log_success "日志配置完成"
|
|
}
|
|
|
|
# 配置防火墙
|
|
setup_firewall() {
|
|
log_info "配置防火墙规则..."
|
|
|
|
# 检查ufw是否安装
|
|
if command -v ufw &> /dev/null; then
|
|
# 允许Nginx端口
|
|
sudo ufw allow 5174/tcp comment "Nginx Client A"
|
|
sudo ufw allow 5175/tcp comment "Nginx Client B"
|
|
sudo ufw allow 5176/tcp comment "Nginx Client C"
|
|
sudo ufw allow 5177/tcp comment "Nginx Client D"
|
|
|
|
log_success "防火墙规则已配置"
|
|
else
|
|
log_warning "ufw未安装,跳过防火墙配置"
|
|
fi
|
|
}
|
|
|
|
# 验证配置
|
|
validate_config() {
|
|
log_info "验证Nginx配置..."
|
|
|
|
# 测试配置语法
|
|
if sudo nginx -t; then
|
|
log_success "Nginx配置语法正确"
|
|
else
|
|
log_error "Nginx配置语法错误,请检查配置文件"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 重启Nginx服务
|
|
restart_nginx() {
|
|
log_info "重启Nginx服务..."
|
|
|
|
sudo systemctl reload nginx
|
|
|
|
# 检查服务状态
|
|
if sudo systemctl is-active --quiet nginx; then
|
|
log_success "Nginx服务运行正常"
|
|
else
|
|
log_error "Nginx服务启动失败"
|
|
sudo systemctl status nginx
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 测试端口监听
|
|
test_ports() {
|
|
log_info "测试端口监听状态..."
|
|
|
|
PORTS=(5174 5175 5176 5177)
|
|
|
|
for port in "${PORTS[@]}"; do
|
|
if ss -tuln | grep -q ":$port "; then
|
|
log_success "端口 $port 监听正常"
|
|
else
|
|
log_error "端口 $port 未监听"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# 测试健康检查
|
|
test_health_checks() {
|
|
log_info "测试健康检查端点..."
|
|
|
|
PORTS=(5174 5175 5176 5177)
|
|
CLIENTS=("Client A" "Client B" "Client C" "Client D")
|
|
|
|
for i in "${!PORTS[@]}"; do
|
|
port=${PORTS[$i]}
|
|
client=${CLIENTS[$i]}
|
|
|
|
if curl -s "http://localhost:$port/health" | grep -q "OK"; then
|
|
log_success "$client (端口 $port) 健康检查通过"
|
|
else
|
|
log_warning "$client (端口 $port) 健康检查失败"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# 显示测试命令
|
|
show_test_commands() {
|
|
log_info "测试命令示例:"
|
|
|
|
echo -e "\n${YELLOW}1. 健康检查:${NC}"
|
|
echo " curl http://localhost:5174/health"
|
|
echo " curl http://localhost:5175/health"
|
|
echo " curl http://localhost:5176/health"
|
|
echo " curl http://localhost:5177/health"
|
|
|
|
echo -e "\n${YELLOW}2. 测试代理功能:${NC}"
|
|
echo " curl -v http://localhost:5174/ 2>&1 | grep 'X-Client-ID'"
|
|
echo " curl -v http://localhost:5175/ 2>&1 | grep 'X-Client-ID'"
|
|
|
|
echo -e "\n${YELLOW}3. 监控日志:${NC}"
|
|
echo " sudo tail -f /var/log/nginx/client-a-access.log"
|
|
echo " sudo tail -f /var/log/nginx/client-*-error.log"
|
|
|
|
echo -e "\n${YELLOW}4. 浏览器测试:${NC}"
|
|
echo " http://$(hostname -I | awk '{print $1}'):5174"
|
|
echo " http://$(hostname -I | awk '{print $1}'):5175"
|
|
echo " http://$(hostname -I | awk '{print $1}'):5176"
|
|
echo " http://$(hostname -I | awk '{print $1}'):5177"
|
|
|
|
echo -e "\n${YELLOW}5. 环境变量测试:${NC}"
|
|
echo " CLIENT_ID=client-a npm run dev"
|
|
echo " CLIENT_ID=client-b npm run dev"
|
|
}
|
|
|
|
# 显示管理命令
|
|
show_management_commands() {
|
|
log_info "管理命令:"
|
|
|
|
echo -e "\n${YELLOW}Nginx服务管理:${NC}"
|
|
echo " sudo systemctl start nginx # 启动服务"
|
|
echo " sudo systemctl stop nginx # 停止服务"
|
|
echo " sudo systemctl restart nginx # 重启服务"
|
|
echo " sudo systemctl reload nginx # 重新加载配置"
|
|
echo " sudo systemctl status nginx # 查看状态"
|
|
|
|
echo -e "\n${YELLOW}配置管理:${NC}"
|
|
echo " sudo nginx -t # 测试配置"
|
|
echo " sudo nginx -s reload # 重新加载"
|
|
|
|
echo -e "\n${YELLOW}日志查看:${NC}"
|
|
echo " sudo tail -f /var/log/nginx/error.log"
|
|
echo " sudo tail -f /var/log/nginx/access.log"
|
|
|
|
echo -e "\n${YELLOW}端口检查:${NC}"
|
|
echo " sudo ss -tuln | grep :517"
|
|
echo " sudo lsof -i :5174"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
echo -e "${GREEN}======================================${NC}"
|
|
echo -e "${GREEN} Ubuntu Nginx多客户端配置部署脚本 ${NC}"
|
|
echo -e "${GREEN}======================================${NC}"
|
|
echo
|
|
|
|
check_root
|
|
check_requirements
|
|
install_nginx
|
|
backup_config
|
|
create_multi_client_config
|
|
setup_logging
|
|
setup_firewall
|
|
validate_config
|
|
restart_nginx
|
|
|
|
echo
|
|
log_success "多客户端Nginx配置部署完成!"
|
|
echo
|
|
|
|
test_ports
|
|
test_health_checks
|
|
|
|
echo
|
|
show_test_commands
|
|
show_management_commands
|
|
|
|
echo
|
|
log_info "部署完成!现在可以开始测试多客户端功能。"
|
|
log_info "请确保开发服务器在 172.16.0.34:5173 上运行。"
|
|
echo
|
|
}
|
|
|
|
# 脚本入口
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
main "$@"
|
|
fi |