1. 项目概述:全栈网站部署实战
三年前接手公司官网重构项目时,我踩遍了从服务器配置到持续部署的所有坑。如今这套经过实战检验的部署方案,已稳定运行了200+天无故障。不同于常见的单技术栈教程,本文将分享融合Next.js前端、.NET后端与MySQL数据库的混合部署方案,特别针对中小型项目在阿里云ECS上的优化配置。
2. 技术栈选型解析
2.1 前端方案:Next.js的优势
选择Next.js而非纯React主要基于三点考量:
- SSR优化SEO:官网对搜索引擎可见性要求高,实测Next.js的SSR使百度收录速度提升40%
- 开箱即用:内置路由、API路由等功能,减少样板代码
- 资源优化:自动实现的图片懒加载使首屏加载时间从3.2s降至1.8s
关键配置示例(next.config.js):
module.exports = { images: { domains: ['cdn.yourdomain.com'], deviceSizes: [640, 750, 828, 1080], }, async headers() { return [ { source: '/(.*)', headers: [ { key: 'X-Content-Type-Options', value: 'nosniff' } ] } ] } }2.2 后端方案:.NET Core的抉择
选用.NET Core 6.0 LTS版本因其:
- 跨平台特性完美适配Linux服务器
- 高性能的Kestrel web服务器
- 与MySQL的EF Core集成成熟
内存优化技巧:
services.AddDbContext<AppDbContext>(options => options.UseMySql(Configuration.GetConnectionString("Default"), new MySqlServerVersion(new Version(8, 0, 27)), o => o.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null) ));2.3 数据库:MySQL实战配置
阿里云RDS MySQL 8.0的优化要点:
- 连接池配置:
SET GLOBAL thread_pool_size = 16; SET GLOBAL thread_cache_size = 50;- 定期维护脚本:
#!/bin/bash mysqlcheck -uadmin -p$PASSWORD --optimize --all-databases mysqldump -uadmin -p$PASSWORD --all-databases | gzip > /backups/db_$(date +%F).sql.gz3. 阿里云环境配置
3.1 ECS选型指南
根据流量预估选择配置:
- 2-5万PV/日:ecs.c6.large(2vCPU 4GB)
- 5-20万PV/日:ecs.g6.xlarge(4vCPU 16GB)
安全组必须开放端口:
| 端口 | 协议 | 用途 | 源IP限制 |
|---|---|---|---|
| 443 | TCP | HTTPS | 0.0.0.0/0 |
| 80 | TCP | HTTP重定向 | 0.0.0.0/0 |
| 5000 | TCP | .NET应用 | 负载均衡内网IP |
| 3000 | TCP | Next.js服务 | 负载均衡内网IP |
3.2 负载均衡设置
七层负载均衡关键配置:
- 健康检查路径:
- 前端:/api/health
- 后端:/healthz
- 会话保持:基于Cookie的植入方式
- 带宽峰值:按实际流量设置弹性带宽
4. 部署流水线搭建
4.1 CI/CD架构
graph LR A[Git Push] --> B[GitHub Actions] B --> C{分支判断} C -->|main| D[构建Docker镜像] C -->|dev| E[部署测试环境] D --> F[推送阿里云镜像仓库] F --> G[ECS滚动更新]4.2 关键脚本示例
前端部署脚本(deploy-frontend.sh):
#!/bin/bash docker pull registry.cn-hangzhou.aliyuncs.com/yourrepo/frontend:latest docker stop frontend || true docker rm frontend || true docker run -d \ --name frontend \ --network host \ -e NODE_ENV=production \ -v /etc/ssl:/etc/ssl \ registry.cn-hangzhou.aliyuncs.com/yourrepo/frontend:latest.NET应用Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY . . RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:6.0 WORKDIR /app COPY --from=build /app . ENV ASPNETCORE_URLS=http://+:5000 EXPOSE 5000 ENTRYPOINT ["dotnet", "YourApp.dll"]5. 监控与运维实战
5.1 监控体系搭建
- 基础监控:阿里云云监控
- CPU使用率>80%持续5分钟告警
- 内存使用率>90%告警
- 业务监控:
- Prometheus监控接口响应时间
- 自定义指标(如订单创建成功率)
5.2 日志收集方案
ELK栈配置要点:
# filebeat.yml 关键配置 filebeat.inputs: - type: log paths: - /var/log/nginx/access.log fields: type: nginx-access output.logstash: hosts: ["your-logstash:5044"]6. 安全加固措施
6.1 必做安全配置
- SSH加固:
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config echo "AllowUsers deploy" >> /etc/ssh/sshd_config systemctl restart sshd - 防火墙策略:
ufw allow proto tcp from 阿里云负载均衡IP to any port 5000 ufw enable
6.2 证书管理
使用acme.sh自动续期:
acme.sh --issue -d yourdomain.com --nginx \ --key-file /etc/ssl/private/key.pem \ --fullchain-file /etc/ssl/certs/cert.pem \ --reloadcmd "systemctl reload nginx"7. 性能优化实录
7.1 Next.js优化成果
优化措施:
- 启用SWC编译:构建时间减少65%
- 动态导入非关键组件
- 使用next/image优化图片
优化前后对比:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| LCP | 2.8s | 1.2s |
| TTI | 3.1s | 1.5s |
| 包体积 | 1.4MB | 820KB |
7.2 .NET内存泄漏排查
典型问题:未释放的DbContext 解决方案:
// 错误示例 public async Task<List<Product>> GetProducts() { var context = new AppDbContext(); // 未释放 return await context.Products.ToListAsync(); } // 正确写法 public async Task<List<Product>> GetProducts() { using var context = new AppDbContext(); return await context.Products.AsNoTracking().ToListAsync(); }8. 成本控制技巧
8.1 资源调度方案
- 开发环境:20:00-8:00自动关机
- 测试环境:周末自动释放ECS
- 使用抢占式实例处理后台任务
8.2 存储优化
- OSS生命周期规则:
- 30天后转为低频访问
- 180天后归档存储
- RDS自动备份保留策略:
SET GLOBAL expire_logs_days = 7;
这套方案经过三次618大促考验,最高承载过单日50万PV流量。关键点在于:混合技术栈的合理分工、阿里云服务的深度优化、以及自动化运维体系的建立。对于刚接触全栈部署的开发者,建议先从单一技术栈开始,逐步扩展复杂度。