一、环境准备与架构规划
1.1 服务器基础环境
生产环境建议采用Linux发行版(如CentOS 8/Ubuntu 22.04),需提前配置:
- 基础组件:
curl wget git unzip等工具链 - 安全加固:关闭不必要的端口,配置SSH密钥登录
- 资源监控:安装
htop、nmon等系统监控工具
1.2 技术栈选型
| 组件类型 | 推荐方案 | 适用场景 |
|---|---|---|
| Web服务器 | Nginx 1.20+ | 高并发静态资源/反向代理 |
| 后端运行时 | Node.js 18+/OpenJDK 17 | JavaScript/Java服务 |
| 进程管理 | PM2 5.x/systemd | 后端服务守护 |
| 安全防护 | Cloudflare免费套餐 | DDoS防护/WAF/CDN加速 |
1.3 网络拓扑设计
典型部署架构包含三层:
- 用户层:浏览器 → CDN节点(边缘缓存)
- 代理层:Nginx(负载均衡/SSL终止)
- 应用层:Node.js/Java服务 + 数据库集群
二、前端部署实战
2.1 构建优化策略
以Vue 3项目为例:
# 生产环境构建(启用路由懒加载)VUE_APP_ENV=production npm run build# 构建分析(需安装webpack-bundle-analyzer)npm run build -- --report
关键优化点:
- 代码分割:配置
splitChunks实现公共依赖提取 - 资源压缩:启用
compression-webpack-plugin生成gz文件 - 路由模式:使用history模式需配合Nginx的try_files配置
2.2 自动化部署方案
推荐使用rsync替代scp实现增量同步:
rsync -avz --delete --progress \--exclude='*.map' \dist/ root@your_server:/data/code_html/
部署后执行:
# 清除OPcache(PHP项目适用)curl http://your_server/opcache_reset.php# 触发CDN缓存刷新(通过Cloudflare API)curl -X POST "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/purge_cache" \-H "Authorization: Bearer {API_TOKEN}" \-H "Content-Type: application/json" \--data '{"files": ["https://example.com/"]}'
2.3 Nginx静态托管配置
server {listen 80;server_name example.com;# 静态资源托管root /data/code_html;index index.html;# 前端路由支持location / {try_files $uri $uri/ /index.html;}# 缓存策略location ~* \.(js|css|png|jpg|jpeg|svg|ico|webp)$ {expires 1y;add_header Cache-Control "public, no-transform";access_log off;}# 禁止访问敏感文件location ~ /(\.git|\.env|README\.md|LICENSE) {deny all;return 403;}}
三、后端服务部署
3.1 Node.js服务管理
生产环境推荐使用PM2的集群模式:
# 安装PM2npm install -g pm2# 启动应用(根据CPU核心数自动扩展)pm2 start app.js -i max --name "api-service"# 配置开机自启pm2 startuppm2 save# 日志管理pm2 logs --lines 100pm2 flush # 清空日志
3.2 Java服务部署方案
对于Spring Boot应用:
# 使用systemd管理(推荐)cat > /etc/systemd/system/springboot.service <<EOF[Unit]Description=Spring Boot ApplicationAfter=syslog.target network.target[Service]User=appuserWorkingDirectory=/data/code_serverExecStart=/usr/bin/java -jar -Xms512m -Xmx1024m app.jarSuccessExitStatus=143Restart=always[Install]WantedBy=multi-user.targetEOF# 启用服务systemctl daemon-reloadsystemctl start springbootsystemctl enable springboot
3.3 多环境配置管理
建议采用环境变量分离配置:
# .env.production示例DB_HOST=prod-db.example.comDB_PORT=3306JWT_SECRET=$(openssl rand -base64 32)
应用启动时加载:
# Node.js示例require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` });# Java示例(Spring Boot)java -jar -Dspring.profiles.active=prod app.jar
四、Nginx核心配置解析
4.1 反向代理配置
upstream node_backend {server 127.0.0.1:3001;keepalive 32;}upstream java_backend {server 127.0.0.1:8080;keepalive 32;}server {listen 443 ssl http2;server_name api.example.com;# SSL配置(使用Let's Encrypt证书)ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;include /etc/nginx/ssl_params.conf; # 包含SSL优化配置# API代理配置location /node-api/ {proxy_pass http://node_backend/api/;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_connect_timeout 60s;proxy_read_timeout 300s;proxy_send_timeout 300s;}# Java服务代理location /java-api/ {proxy_pass http://java_backend/api/;# 同上配置...}}
4.2 高级功能实现
4.2.1 跨域处理
map $http_origin $cors_origin {default "";~*^https?://(localhost|example\.com|test\.example\.com)$ $http_origin;}server {# ...其他配置...location /api/ {if ($cors_origin = "") {return 403;}add_header Access-Control-Allow-Origin $cors_origin;add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";add_header Access-Control-Allow-Headers "Authorization, Content-Type";if ($request_method = 'OPTIONS') {add_header Access-Control-Max-Age 1728000;return 204;}proxy_pass http://backend;}}
4.2.2 限流配置
# 安装ngx_http_limit_req_module模块limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;server {# ...其他配置...location /rate-limited/ {limit_req zone=api_limit burst=20 nodelay;proxy_pass http://backend;}}
五、Cloudflare集成方案
5.1 安全防护配置
-
SSL/TLS设置:
- 启用”Full (Strict)”加密模式
- 配置HSTS头(max-age=31536000)
-
WAF规则组:
- 启用OWASP核心规则集
- 自定义规则屏蔽恶意IP
-
速率限制:
# 通过API创建速率限制规则curl -X POST "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/rate_limits" \-H "Authorization: Bearer {API_TOKEN}" \-H "Content-Type: application/json" \--data '{"threshold": 1000,"period": 60,"match": {"request": {"methods": ["GET"],"url_pattern": "*.example.com*"}},"action": {"mode": "simulate"}}'
5.2 性能优化技巧
-
Cache Key配置:
- 启用”Cache Everything”缓存静态资源
- 自定义缓存规则排除API端点
-
Argo智能路由:
- 启用后平均降低30%的延迟
- 需在”Traffic”选项卡中激活
-
HTTP/3支持:
- 在”SSL/TLS”设置中启用QUIC协议
- 现代浏览器可获得20-30%的连接速度提升
六、监控与运维体系
6.1 日志集中管理
# 使用rsyslog收集Nginx日志cat > /etc/rsyslog.d/nginx.conf <<EOF$ModLoad imfile$InputFileName /var/log/nginx/access.log$InputFileTag nginx-access:$InputFileStateFile stat-nginx-access$InputFileSeverity info$InputFileFacility local7$InputRunFileMonitor$InputFileName /var/log/nginx/error.log$InputFileTag nginx-error:$InputFileStateFile stat-nginx-error$InputFileSeverity error$InputFileFacility local7$InputRunFileMonitorEOF# 重启服务systemctl restart rsyslog
6.2 告警规则配置
推荐使用Prometheus+Grafana监控方案:
# Nginx监控配置示例- alert: NginxHigh5xxErrorRateexpr: rate(nginx_http_responses_total{status=~"5.."}[1m]) / rate(nginx_http_responses_total[1m]) > 0.05for: 2mlabels:severity: criticalannotations:summary: "Nginx 5xx错误率过高 ({{ $value }}%)"description: "过去2分钟内5xx错误率超过阈值"
七、常见问题解决方案
7.1 502 Bad Gateway排查
- 检查后端服务是否运行:
systemctl status springboot - 查看Nginx错误日志:
tail -f /var/log/nginx/error.log - 测试端口连通性:
telnet 127.0.0.1 8080 - 检查防火墙规则:
iptables -L -n
7.2 跨域问题处理
- 确认请求头包含
Origin字段 - 检查服务器响应头是否包含
Access-Control-Allow-Origin - 对于复杂请求(带自定义头),需先发送OPTIONS预检请求
7.3 SSL证书续期
# 使用Certbot自动续期0 3 * * * /usr/bin/certbot renew --quiet --no-self-upgrade \--post-hook "systemctl reload nginx"
本文提供的部署方案经过生产环境验证,可支撑百万级日活应用运行。实际部署时建议先在测试环境验证所有配置,再逐步迁移到生产环境。对于超大规模应用,可考虑使用Kubernetes进行容器化部署,配合服务网格实现更精细的流量管理。