Files
leaudit-platform-frontend/UBUNTU-NGINX-TEST-GUIDE.md
T

9.1 KiB
Raw Blame History

Ubuntu环境下Nginx多客户端测试指南

概述

本指南详细说明如何在Ubuntu环境中配置和测试Nginx反向代理多客户端功能,实现根据不同端口动态切换API配置的能力。

架构说明

客户端访问端口     Nginx代理      开发服务器
5174 (client-a) ──→ 反向代理 ──→ 172.16.0.34:5173
5175 (client-b) ──→ 反向代理 ──→ 172.16.0.34:5173  
5176 (client-c) ──→ 反向代理 ──→ 172.16.0.34:5173
5177 (client-d) ──→ 反向代理 ──→ 172.16.0.34:5173

每个端口通过 X-Client-ID 头部传递客户端标识,应用根据此标识动态选择对应的API配置。

环境要求

系统要求

  • Ubuntu 18.04+ 或其他Linux发行版
  • Nginx 1.18+
  • Node.js 18+
  • 网络访问权限到 172.16.0.34:5173

端口要求

  • 5174-5177Nginx监听端口
  • 5173:开发服务器端口(需要在172.16.0.34上运行)

安装和配置步骤

1. 安装Nginx

# 更新包管理器
sudo apt update

# 安装Nginx
sudo apt install nginx -y

# 检查Nginx版本
nginx -v

# 启动Nginx服务
sudo systemctl start nginx
sudo systemctl enable nginx

2. 配置Nginx

2.1 备份原配置

# 备份默认配置
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup

2.2 创建多客户端配置

# 创建配置目录
sudo mkdir -p /etc/nginx/conf.d

# 复制优化后的配置文件
sudo cp nginx-ubuntu-optimized.conf /etc/nginx/conf.d/multi-client.conf

# 或者直接创建配置文件
sudo nano /etc/nginx/conf.d/multi-client.conf
# 然后粘贴 nginx-ubuntu-optimized.conf 的内容

2.3 创建日志目录

# 创建客户端专用日志目录
sudo mkdir -p /var/log/nginx/clients

# 设置权限
sudo chown -R www-data:www-data /var/log/nginx/clients
sudo chmod -R 755 /var/log/nginx/clients

2.4 修改主配置文件

# 编辑主配置文件
sudo nano /etc/nginx/nginx.conf

确保包含以下配置:

http {
    # 包含多客户端配置
    include /etc/nginx/conf.d/*.conf;
    
    # 日志格式(如果主配置中没有)
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 其他配置...
}

3. 验证配置

# 测试Nginx配置语法
sudo nginx -t

# 如果配置正确,重新加载Nginx
sudo systemctl reload nginx

# 检查Nginx状态
sudo systemctl status nginx

4. 防火墙配置

# 允许Nginx端口通过防火墙
sudo ufw allow 5174
sudo ufw allow 5175
sudo ufw allow 5176
sudo ufw allow 5177

# 或者允许端口范围
sudo ufw allow 5174:5177/tcp

# 检查防火墙状态
sudo ufw status

应用配置修改

1. 修改api-config.ts

需要在开发环境配置中添加第四个客户端:

const getClientConfigs = (env: string): Record<string, Partial<ApiConfig>> => {
  if (env === 'development') {
    return {
      'client-a': {
        baseUrl: 'http://172.16.0.34:5174',
        uploadUrl: 'http://172.16.0.34:5174/admin/documents',
        // ... oauth配置
      },
      'client-b': {
        baseUrl: 'http://172.16.0.34:5175',
        uploadUrl: 'http://172.16.0.34:5175/admin/documents',
        // ... oauth配置
      },
      'client-c': {
        baseUrl: 'http://172.16.0.34:5176',
        uploadUrl: 'http://172.16.0.34:5176/admin/documents',
        // ... oauth配置
      },
      'client-d': {
        baseUrl: 'http://172.16.0.34:5177',
        uploadUrl: 'http://172.16.0.34:5177/admin/documents',
        // ... oauth配置
      }
    };
  }
  // ...
};

2. 添加客户端检测逻辑

在应用中添加根据请求头自动检测客户端的逻辑:

// 在服务器端或中间件中
const detectClientFromHeaders = (request: Request): string => {
  // 从Nginx传递的头部获取客户端ID
  const clientId = request.headers.get('X-Client-ID');
  const originalPort = request.headers.get('X-Original-Port');
  
  if (clientId) {
    return clientId;
  }
  
  // 根据端口映射客户端ID
  const portToClient: Record<string, string> = {
    '5174': 'client-a',
    '5175': 'client-b', 
    '5176': 'client-c',
    '5177': 'client-d'
  };
  
  return portToClient[originalPort || ''] || 'main';
};

测试步骤

1. 启动开发服务器

确保在172.16.0.34机器上启动开发服务器:

# 在项目目录中
npm run dev
# 或
pnpm dev
# 确保服务运行在5173端口

2. 测试Nginx代理

# 测试各个端口的健康检查
curl http://localhost:5174/health
curl http://localhost:5175/health
curl http://localhost:5176/health
curl http://localhost:5177/health

# 测试代理功能
curl -H "Accept: text/html" http://localhost:5174/
curl -H "Accept: text/html" http://localhost:5175/

3. 验证客户端标识传递

# 检查请求头传递
curl -v http://localhost:5174/api/test 2>&1 | grep "X-Client-ID"

# 查看Nginx访问日志
sudo tail -f /var/log/nginx/client-a-access.log
sudo tail -f /var/log/nginx/client-b-access.log

4. 浏览器测试

在浏览器中访问:

5. 环境变量测试

# 设置客户端ID环境变量测试
export CLIENT_ID=client-a
npm run dev

# 或在启动时指定
CLIENT_ID=client-b npm run dev

监控和调试

1. 日志监控

# 实时监控所有客户端日志
sudo tail -f /var/log/nginx/client-*-access.log

# 监控错误日志
sudo tail -f /var/log/nginx/client-*-error.log

# 监控Nginx主错误日志
sudo tail -f /var/log/nginx/error.log

2. 性能监控

# 检查Nginx进程状态
sudo systemctl status nginx

# 查看端口监听状态
sudo netstat -tlnp | grep nginx

# 检查连接数
sudo ss -tuln | grep :517

3. 调试工具

# 使用curl测试详细信息
curl -v -H "X-Test: true" http://localhost:5174/api/config

# 使用httpie(需要安装)
sudo apt install httpie
http GET localhost:5174/health X-Test:debug

故障排除

常见问题

  1. 端口被占用
# 检查端口占用
sudo lsof -i :5174
# 杀死占用进程
sudo kill -9 <PID>
  1. 权限问题
# 检查Nginx用户权限
sudo chown -R www-data:www-data /var/log/nginx/
sudo chmod -R 755 /var/log/nginx/
  1. 配置语法错误
# 详细检查配置
sudo nginx -t -c /etc/nginx/nginx.conf
  1. 网络连接问题
# 测试到开发服务器的连接
telnet 172.16.0.34 5173
# 或使用nc
nc -zv 172.16.0.34 5173

日志分析

# 分析访问模式
sudo awk '{print $1, $7, $9}' /var/log/nginx/client-a-access.log | sort | uniq -c

# 查找错误请求
sudo grep "50[0-9]" /var/log/nginx/client-*-access.log

# 统计客户端访问量
sudo grep -o 'client_id="[^"]*"' /var/log/nginx/client-*-access.log | sort | uniq -c

性能优化建议

1. Nginx优化

# 在http块中添加
worker_processes auto;
worker_connections 1024;

# 启用gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript;

# 缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g 
                 inactive=60m use_temp_path=off;

2. 系统优化

# 增加文件描述符限制
echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf

# 优化内核参数
echo "net.core.somaxconn = 65535" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

部署到生产环境

1. 安全加固

# 隐藏Nginx版本
server_tokens off;

# 限制请求大小
client_max_body_size 10M;

# 添加安全头部
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

2. SSL配置

# HTTPS配置示例
server {
    listen 443 ssl http2;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    
    # SSL优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
}

3. 监控集成

# 集成Prometheus监控
sudo apt install nginx-module-prometheus

# 或使用日志分析工具
sudo apt install goaccess
goaccess /var/log/nginx/client-a-access.log -o report.html --log-format=COMBINED

总结

通过以上配置,你可以在Ubuntu环境中成功测试Nginx多客户端反向代理功能。关键点包括:

  1. 客户端标识传递:通过 X-Client-ID 头部
  2. 端口映射5174-5177映射到不同客户端
  3. 配置动态切换:应用根据客户端ID选择对应配置
  4. 日志分离:每个客户端独立的访问和错误日志
  5. 健康检查:每个端口提供独立的健康检查端点

这个方案为生产环境的多客户端部署提供了完整的测试基础。