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

422 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```bash
# 更新包管理器
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 备份原配置
```bash
# 备份默认配置
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 创建多客户端配置
```bash
# 创建配置目录
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 创建日志目录
```bash
# 创建客户端专用日志目录
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 修改主配置文件
```bash
# 编辑主配置文件
sudo nano /etc/nginx/nginx.conf
```
确保包含以下配置:
```nginx
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. 验证配置
```bash
# 测试Nginx配置语法
sudo nginx -t
# 如果配置正确,重新加载Nginx
sudo systemctl reload nginx
# 检查Nginx状态
sudo systemctl status nginx
```
### 4. 防火墙配置
```bash
# 允许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
需要在开发环境配置中添加第四个客户端:
```typescript
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. 添加客户端检测逻辑
在应用中添加根据请求头自动检测客户端的逻辑:
```typescript
// 在服务器端或中间件中
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机器上启动开发服务器:
```bash
# 在项目目录中
npm run dev
# 或
pnpm dev
# 确保服务运行在5173端口
```
### 2. 测试Nginx代理
```bash
# 测试各个端口的健康检查
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. 验证客户端标识传递
```bash
# 检查请求头传递
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. 浏览器测试
在浏览器中访问:
- http://172.16.0.34:5174 (Client A)
- http://172.16.0.34:5175 (Client B)
- http://172.16.0.34:5176 (Client C)
- http://172.16.0.34:5177 (Client D)
### 5. 环境变量测试
```bash
# 设置客户端ID环境变量测试
export CLIENT_ID=client-a
npm run dev
# 或在启动时指定
CLIENT_ID=client-b npm run dev
```
## 监控和调试
### 1. 日志监控
```bash
# 实时监控所有客户端日志
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. 性能监控
```bash
# 检查Nginx进程状态
sudo systemctl status nginx
# 查看端口监听状态
sudo netstat -tlnp | grep nginx
# 检查连接数
sudo ss -tuln | grep :517
```
### 3. 调试工具
```bash
# 使用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. **端口被占用**
```bash
# 检查端口占用
sudo lsof -i :5174
# 杀死占用进程
sudo kill -9 <PID>
```
2. **权限问题**
```bash
# 检查Nginx用户权限
sudo chown -R www-data:www-data /var/log/nginx/
sudo chmod -R 755 /var/log/nginx/
```
3. **配置语法错误**
```bash
# 详细检查配置
sudo nginx -t -c /etc/nginx/nginx.conf
```
4. **网络连接问题**
```bash
# 测试到开发服务器的连接
telnet 172.16.0.34 5173
# 或使用nc
nc -zv 172.16.0.34 5173
```
### 日志分析
```bash
# 分析访问模式
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优化
```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. 系统优化
```bash
# 增加文件描述符限制
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
# 隐藏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配置
```nginx
# 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. 监控集成
```bash
# 集成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. **健康检查**:每个端口提供独立的健康检查端点
这个方案为生产环境的多客户端部署提供了完整的测试基础。