9.1 KiB
9.1 KiB
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-5177:Nginx监听端口
- 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. 浏览器测试
在浏览器中访问:
- 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. 环境变量测试
# 设置客户端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
故障排除
常见问题
- 端口被占用
# 检查端口占用
sudo lsof -i :5174
# 杀死占用进程
sudo kill -9 <PID>
- 权限问题
# 检查Nginx用户权限
sudo chown -R www-data:www-data /var/log/nginx/
sudo chmod -R 755 /var/log/nginx/
- 配置语法错误
# 详细检查配置
sudo nginx -t -c /etc/nginx/nginx.conf
- 网络连接问题
# 测试到开发服务器的连接
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多客户端反向代理功能。关键点包括:
- 客户端标识传递:通过
X-Client-ID头部 - 端口映射:5174-5177映射到不同客户端
- 配置动态切换:应用根据客户端ID选择对应配置
- 日志分离:每个客户端独立的访问和错误日志
- 健康检查:每个端口提供独立的健康检查端点
这个方案为生产环境的多客户端部署提供了完整的测试基础。