自建服务器部署小程序准备工作详解
自建服务器部署小程序准备工作详解
用公司自己的物理服务器来跑小程序后端,跟直接买云服务器相比,确实要多操不少心。网络怎么打通?安全防护怎么做?硬件坏了怎么办?这些问题在云服务器时代其实不用太操心,但自建服务器就得自己一个个解决。这篇文章就把整个流程掰开了揉碎了讲清楚,顺便把踩过的坑和经验都分享出来。
背景
小程序的运行原理
搞清楚小程序怎么跑起来的,才能明白为什么要准备那么多东西。小程序的运行其实分两块:
前端部分:跑在用户的微信里,负责页面展示和交互。这部分代码上传到微信公众平台就行,微信帮你分发。
后端部分:跑在你自己的服务器上,负责业务逻辑、数据存储、文件管理这些。这才是我们今天要重点聊的——怎么把后端服务部署到公司自己的服务器上。
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 用户手机 │ ──────► │ 微信服务器 │ ──────► │ 你的服务器 │
│ (微信客户端) │ │ (分发前端代码) │ │ (运行后端API) │
└─────────────┘ └─────────────┘ └─────────────┘
自建服务器和云服务器的核心区别
选择自建服务器,意味着你要承担更多的责任。先看看两者的主要差异:
| 对比项 | 云服务器 | 自建服务器 |
|---|---|---|
| 公网 IP | 云厂商自动分配,即买即用 | 需要向 ISP 申请,或通过 NAT 映射 |
| 带宽 | 随时可弹性调整 | 受限于公司出口带宽,调整周期长 |
| 域名备案 | 使用云厂商备案系统 | 需通过 ISP(宽带运营商)备案 |
| 网络安全 | 云厂商提供安全组/WAF/DDoS | 需自行搭建防火墙、WAF 等 |
| 硬件运维 | 云厂商负责 | 公司 IT 团队自行维护 |
| 高可用 | 云厂商提供 SLA 保障 | 需自行设计冗余方案 |
| 扩展性 | 弹性伸缩,分钟级 | 需采购硬件,周期长 |
为什么微信对服务器有要求
微信对后端服务器有几个硬性要求,不满足的话小程序根本跑不起来:
- 必须是已备案的域名——不能用 IP 地址直接访问
- 必须使用 HTTPS——不支持 HTTP 明文传输
- 域名需要在后台配置——只有配置过的域名才能被小程序访问
这些要求看起来麻烦,实际上是在保护用户数据安全。理解了这一点,后面做准备工作就不会觉得是在做无用功了。
问题
自建服务器的特殊挑战
用云服务器部署小程序,很多问题云厂商帮你解决了。但自建服务器不一样,你得自己搞定。常见的坑有这些:
网络方面的问题
- “服务器在公司内网,微信怎么访问到?”——需要申请公网 IP,配置端口映射
- “公司宽带的上行带宽够用吗?”——企业宽带上行通常比下行小很多,要仔细确认
- “备案怎么搞?跟云服务器备案一样吗?”——流程不太一样,需要通过 ISP 备案
安全方面的问题
- “云服务器有安全组,自建服务器怎么防护?”——需要自己配置防火墙、WAF
- “被 DDoS 攻击了怎么办?”——自建服务器很难独立应对,建议用云厂商高防 IP
- “服务器被入侵了谁负责?”——全部自己负责,需要配置入侵检测系统
运维方面的问题
- “服务器硬件坏了怎么办?”——需要准备备件,或者购买厂商维保服务
- “半夜服务器宕机了谁来处理?”——需要 7×24 小时值班或应急响应机制
- “数据丢了怎么恢复?”——需要自己配置备份策略,定期演练恢复
时间成本预估
自建服务器的准备工作比云服务器要多不少,时间成本也要高一些:
| 环节 | 耗时 | 备注 |
|---|---|---|
| 账号注册 | 1~2 小时 | 企业账号需要准备材料 |
| 域名注册 | 30 分钟 | 找个好记的名字就行 |
| 公网 IP 申请 | 3~7 个工作日 | 需要联系 ISP |
| ICP 备案 | 7~20 个工作日 | 最耗时的环节 |
| 服务器环境配置 | 4~8 小时 | 比云服务器复杂 |
| 网络配置(NAT/防火墙) | 2~4 小时 | 自建服务器特有 |
| 证书申请部署 | 30 分钟~1 天 | 免费证书很快 |
| 安全加固 | 4~8 小时 | 自建服务器特有 |
| 整体联调 | 4~8 小时 | 遇到问题可能会更久 |
建议:在开发的同时就开始申请公网 IP 和域名备案,这两样是最耗时的。
方案
架构方案选择
自建服务器部署小程序,有几种常见的架构方案:
方案一:纯自建(适合有运维团队的企业)
公网
│
┌───────────┴───────────┐
│ 公司出口路由器 │
│ (双ISP接入 + NAT) │
└───────────┬───────────┘
│
┌──────┴──────┐
│ 防火墙 │
└──────┬──────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Web 服务器 数据库服务器 备份服务器
(Nginx+App) (MySQL主) (MySQL从+文件备份)
优点:数据完全在自己掌控中,适合对数据安全要求高的企业。
缺点:需要专业的运维团队,成本高,DDoS 防护能力弱。
方案二:混合架构(推荐)
公网
│
┌───────────┴───────────┐
│ 云厂商网络 │
│ (DDoS防护 + CDN + WAF)│
└───────────┬───────────┘
│
┌───────────┴───────────┐
│ 云服务器(Nginx反代) │
│ 已备案域名 + SSL │
└───────────┬───────────┘
│
VPN/专线隧道
│
┌───────────┴───────────┐
│ 公司自建服务器 │
│ (核心业务逻辑+数据库) │
└───────────────────────┘
优点:
- 利用云厂商的备案、安全防护、CDN
- 核心数据留在公司内部
- 公网流量由云服务器承接,公司出口压力小
- 自建服务器无需公网 IP
缺点:增加一层网络跳转,延迟略增;需要额外的云服务器成本。
方案三:自建 + 高防 IP
公网
│
┌───────────┴───────────┐
│ 云厂商高防 IP │
│ (DDoS清洗 + 流量转发) │
└───────────┬───────────┘
│
┌───────────┴───────────┐
│ 公司自建服务器 │
│ (Web + 数据库 + 应用) │
└───────────────────────┘
适用场景:需要保护自建服务器免受 DDoS 攻击,但不想用云服务器做反代。
我的建议:对于大多数中小企业,方案二(混合架构)是最佳选择。既利用了云厂商的基础设施能力,又将核心数据保留在公司内部,兼顾安全性和可维护性。
技术选型建议
服务器操作系统推荐:
| 发行版 | 版本 | 支持周期 | 特点 | 适合谁 |
|---|---|---|---|---|
| Ubuntu | 22.04 LTS / 24.04 LTS | 5 年标准支持 | 软件包丰富,社区活跃,文档多 | 新手推荐、通用场景 |
| Rocky Linux | 9.x | 支持到 2032 年 | CentOS 替代品,RHEL 兼容,稳定可靠 | 企业生产环境、有经验的运维 |
| AlmaLinux | 9.x | 支持到 2032 年 | CentOS 替代品,RHEL 兼容,社区驱动 | 企业生产环境 |
| Debian | 12 (Bookworm) | 支持到 2028 年 | 轻量、稳定、安全 | 追求简洁稳定的开发者 |
特别提醒:
- CentOS 7 已于 2024 年 6 月 30 日结束生命周期(EOL),不再提供安全更新
- CentOS 8 已于 2021 年 12 月 31 日停止维护
- 推荐使用 Rocky Linux 或 AlmaLinux 作为替代
数据库选型:
| 数据库 | 类型 | 特点 | 适合场景 |
|---|---|---|---|
| MySQL | 关系型 | 最流行,生态完善 | 通用业务数据 |
| PostgreSQL | 关系型 | 功能强大,支持复杂查询 | 复杂业务、地理数据 |
| MongoDB | 文档型 | 灵活,Schema-free | 内容管理、用户画像 |
| Redis | 键值型 | 高性能,支持多种数据结构 | 缓存、会话、排行榜 |
实现
一、账号与资质准备
1.1 小程序账号注册
注册小程序账号是第一步。
注册地址:https://mp.weixin.qq.com
账号类型选择:
| 类型 | 适合谁 | 需要的材料 | 能力差异 |
|---|---|---|---|
| 个人 | 个人开发者 | 身份证、手机号 | 接口权限较少,不能用微信支付 |
| 企业 | 公司、团队 | 营业执照、法人身份证 | 接口权限完整 |
| 政府 | 政府机关 | 组织机构代码证 | 有专属能力 |
| 媒体 | 媒体机构 | 媒体资质证明 | 有专属能力 |
如果是做正经的商业项目,建议直接注册企业账号。个人账号虽然注册简单,但接口权限受限,后面再升级会比较麻烦。
1.2 AppID 获取
注册完账号后,需要获取 AppID,这是小程序的唯一标识。
获取路径:微信公众平台 → 开发管理 → 开发设置
需要保存的信息:
- AppID:小程序的唯一标识,开发时需要用到
- AppSecret:密钥,非常重要,不要泄露给他人
注意事项:
- AppSecret 只在生成时显示一次,一定要保存好
- 如果泄露了,可以重置,但需要重新配置所有使用它的地方
- 建议使用环境变量存储,不要硬编码在代码里
1.3 开发者配置
为了让团队成员能够协作开发,需要配置开发者权限。
配置路径:微信公众平台 → 成员管理
角色说明:
- 项目负责人:拥有所有权限
- 开发者:可以开发、调试、上传代码
- 体验者:可以使用体验版
- 观察者:只能查看,不能操作
二、网络配置(自建服务器最关键的部分)
这是自建服务器跟云服务器最大的区别。云服务器买来就有公网 IP,自建服务器得自己想办法让微信服务器能访问到你。
2.1 公网 IP 获取
方案一:申请固定公网 IP(推荐)
申请流程:
1. 联系公司宽带运营商(电信/联通/移动/企业宽带服务商)
2. 申请企业固定公网 IP(静态 IP)
3. 运营商会分配一个或多个公网 IP 地址
4. 将公网 IP 绑定到服务器网卡或通过 NAT 映射
费用参考:
- 企业专线 + 固定 IP:¥1000~5000+/月(带宽 10~100Mbps)
- 企业宽带附加固定 IP:¥200~800/月(带宽较小)
方案二:动态公网 IP + DDNS
适用场景:已有公网 IP 但为动态分配。
方案:
- 路由器配置 DDNS(动态域名解析)
- 使用花生壳/公云等 DDNS 服务
- 域名始终指向最新 IP
缺点:
- IP 变动时有短暂中断(通常几分钟)
- 不够稳定,不推荐生产环境使用
- 小程序后台配置的域名需要稳定的 IP 解析
方案三:内网穿透(仅开发测试)
适用场景:开发调试阶段。
工具:ngrok / frp / cpolar / 花生壳内网穿透
强烈不推荐用于生产环境:稳定性差、速度受限、安全风险高、域名不固定。
2.2 网络拓扑架构
微信用户(全国)
│
▼
微信服务器(腾讯)
│
▼ 公网访问
┌─────────────────────────────────────┐
│ 公司出口网关 │
│ ┌─────────┐ ┌──────────────┐ │
│ │ 路由器 │───▶│ 防火墙/WAF │ │
│ │ (NAT) │ │ │ │
│ └─────────┘ └──────┬───────┘ │
│ │ │
│ ┌────▼─────┐ │
│ │ 核心交换机 │ │
│ └────┬─────┘ │
│ │ │
│ ┌─────────┼─────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌──┐ │
│ │Web 服务器│ │数据库 │ │ │ │
│ │(内网IP) │ │(内网IP) │ │ │ │
│ └────────┘ └────────┘ └──┘ │
└─────────────────────────────────────┘
2.3 端口映射(NAT/PAT)
这是自建服务器最关键的配置之一。
微信小程序要求:
- 必须使用 HTTPS(443 端口)
- 不能带端口号(只能用默认端口)
因此需要在公司出口路由器/防火墙上配置端口映射:
配置示例(路由器/防火墙 DNAT 规则):
┌──────────────┬──────────────┬──────────────┬──────────┐
│ 协议 │ 外部端口 │ 内部 IP:端口 │ 说明 │
├──────────────┼──────────────┼──────────────┼──────────┤
│ TCP │ 443 │ 192.168.1.10:443 │ HTTPS │
│ TCP │ 80 │ 192.168.1.10:80 │ HTTP(跳转用)│
└──────────────┴──────────────┴──────────────┴──────────┘
重要:微信小程序只认 443 端口,不能映射到其他端口(如 8443)。
2.4 带宽需求评估
| 场景 | 上行带宽需求 | 说明 |
|---|---|---|
| 简单展示型小程序 | 5~10 Mbps | 图文展示为主 |
| 电商类小程序 | 10~30 Mbps | 含商品图片、支付交互 |
| 社交/直播类小程序 | 50~100 Mbps+ | 大量图片/视频/实时通信 |
注意:企业宽带通常上行带宽远小于下行(如 100M 下行 / 10M 上行),而服务器主要消耗的是上行带宽,务必确认上行带宽是否充足。
2.5 IP 白名单配置
微信小程序后台需要配置服务器 IP 白名单:
登录微信公众平台 → 开发管理 → 开发设置 → 服务器域名
需要添加的 IP:
- 你的公网 IP(固定 IP)
- 如果有多台服务器,全部公网 IP 都要添加
三、域名准备
3.1 域名注册
域名是用户访问你服务的地址,选择一个好的域名很重要。
域名注册商推荐:
- 阿里云(万网):国内最大的域名注册商
- 腾讯云:和微信生态结合更好
- 华为云:安全合规能力强
域名选择建议:
- 尽量选择
.com域名,用户认知度最高 - 域名要简短好记,避免使用连字符
- 如果是企业项目,建议使用品牌名作为域名
价格参考:
.com域名:约 100 元/年.cn域名:约 100 元/年.net域名:约 100 元/年
3.2 ICP 备案(自建服务器有特殊要求)
自建服务器的备案流程跟云服务器不太一样,需要特别注意。
备案方式对比:
| 场景 | 备案主体 | 备案流程 |
|---|---|---|
| 云服务器 | 通过云厂商代备案(阿里云/腾讯云等) | 在线提交,云厂商初审 → 管局终审 |
| 自建服务器 | 通过接入商/ISP 备案 | 联系宽带运营商或域名注册商备案 |
自建服务器备案流程:
步骤:
1. 确认域名注册商是否支持备案(推荐在阿里云/腾讯云注册域名)
2. 联系公司宽带运营商(如中国电信企业宽带)获取备案信息
3. 准备备案材料:
├── 企业营业执照副本
├── 法人身份证正反面
├── 网站负责人身份证正反面
├── 网站备案信息真实性核验单
├── 域名证书
├── 服务器托管协议(如有)
└── 幕布照片(部分管局要求)
4. 通过接入商系统提交备案申请
5. 接入商初审(1~3 个工作日)
6. 管局终审(7~20 个工作日)
7. 备案通过后,获取备案号
特别注意:
- 备案必须有接入商:自建服务器如果没有通过 ISP 接入备案,管局可能不予通过
- 部分管局要求服务器托管在 IDC 机房才接受备案
- 如果公司是专线接入,运营商就是接入商
- 域名实名认证必须与备案主体一致
备案替代方案:
如果备案困难,可以考虑混合架构:
方案:使用云服务器做反向代理(前端接入),后端业务跑在自建服务器
架构:
用户 → 云服务器(Nginx反向代理,已备案域名) → 公司自建服务器(内网)
优点:
- 利用云厂商快速完成备案
- 云厂商提供 DDoS 防护、CDN 等
- 自建服务器只需与云服务器打通内网(VPN/专线)
缺点:
- 增加一层网络跳转,延迟略增
- 需要额外的云服务器成本
3.3 域名解析配置
备案通过后,需要配置域名解析,把域名指向你的服务器。
解析记录类型:
| 类型 | 用途 | 示例 |
|---|---|---|
| A 记录 | 把域名指向一个 IP 地址 | api.example.com → 123.45.67.89 |
| CNAME 记录 | 把域名指向另一个域名 | www.example.com → example.com |
| MX 记录 | 邮件服务器配置 | 邮件服务需要 |
配置步骤:
- 登录域名注册商的控制台
- 找到域名解析设置
- 添加 A 记录,主机记录填
api(或其他子域名),记录值填服务器公网 IP - 保存后等待解析生效(通常几分钟到几小时)
四、SSL 证书配置
4.1 证书类型选择
SSL 证书用于实现 HTTPS 加密传输,小程序强制要求使用 HTTPS。
证书类型对比:
| 类型 | 验证方式 | 价格区间 | 申请时间 | 推荐品牌 | 适合场景 |
|---|---|---|---|---|---|
| DV(域名验证型) | 验证域名所有权 | 免费 ~ ¥500/年 | 几分钟 ~ 1 小时 | Let’s Encrypt(免费)、DigiCert、GeoTrust、Sectigo、腾讯云/阿里云免费证书 | 个人项目、测试环境、一般业务 |
| OV(组织验证型) | 验证组织真实性 | ¥1000 ~ ¥5000/年 | 1~3 个工作日 | DigiCert、GeoTrust、Sectigo、GlobalSign、Thawte | 企业官网、一般业务、企业小程序 |
| EV(扩展验证型) | 严格验证组织 | ¥3000 ~ ¥15000/年 | 3~7 个工作日 | DigiCert、GeoTrust、GlobalSign、Symantec | 金融、电商、政务、高安全需求 |
我的建议:
- 个人项目或测试环境:直接用 Let’s Encrypt 或云厂商免费证书,省心省钱
- 企业一般业务:选择 DV 证书即可,推荐 DigiCert 或 GeoTrust 的 DV 证书
- 企业正式项目:建议选择 OV 证书,提升用户信任度
- 金融、电商等高安全需求:选择 EV 证书,浏览器会显示绿色地址栏
4.2 免费证书申请与部署
Let’s Encrypt:
- 完全免费,90 天有效期,可自动续期
- 申请工具:Certbot、acme.sh
- 适合有一定技术基础的开发者
申请流程(以 Let’s Encrypt + Nginx 为例):
# 安装 certbot
sudo apt install certbot python3-certbot-nginx
# 申请证书
sudo certbot --nginx -d yourdomain.com
# 测试自动续期
sudo certbot renew --dry-run
# 证书文件位置
/etc/letsencrypt/live/yourdomain.com/
├── fullchain.pem # 证书链
├── privkey.pem # 私钥
├── cert.pem # 证书
└── chain.pem # 中间证书
Nginx HTTPS 配置示例:
server {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri; # 强制跳转 HTTPS
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 反向代理到后端应用
location /api/ {
proxy_pass http://127.0.0.1:8080/;
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_set_header X-Forwarded-Proto $scheme;
}
# 静态资源
location /static/ {
alias /var/www/static/;
expires 30d;
}
}
证书续期配置:
# Let's Encrypt 自动续期(crontab)
0 0 1 * * certbot renew --quiet && systemctl reload nginx
五、服务器环境配置
5.1 操作系统安装
推荐使用 Ubuntu 24.04 LTS 或 Rocky Linux 9,具体选择看团队技术栈。
基础环境安装(以 Ubuntu + Node.js 为例):
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# 安装 Nginx
sudo apt install -y nginx
# 安装 PM2(Node.js 进程管理)
sudo npm install -g pm2
# 安装 Git
sudo apt install -y git
# 安装其他常用工具
sudo apt install -y curl wget vim htop
5.2 Nginx 配置
Nginx 作为反向代理和静态资源服务器,是部署小程序后端的标配。
完整的 Nginx 配置:
# /etc/nginx/sites-available/api.example.com
# 上游服务器配置
upstream backend {
server 127.0.0.1:3000;
keepalive 32;
}
# HTTP 跳转 HTTPS
server {
listen 80;
server_name api.example.com;
return 301 https://$server_name$request_uri;
}
# HTTPS 主配置
server {
listen 443 ssl http2;
server_name api.example.com;
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
# 日志配置
access_log /var/log/nginx/api.example.com.access.log;
error_log /var/log/nginx/api.example.com.error.log;
# 请求大小限制(小程序图片上传需要)
client_max_body_size 10m;
# API 转发
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
# 超时设置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 静态资源
location /static/ {
alias /var/www/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 健康检查
location /health {
access_log off;
return 200 "OK";
add_header Content-Type text/plain;
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/api.example.com /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置
sudo systemctl reload nginx
六、数据库准备
6.1 数据库部署
自建数据库(以 MySQL 为例):
# 安装 MySQL
sudo apt install -y mysql-server
# 安全配置
sudo mysql_secure_installation
# 创建数据库和用户
sudo mysql -u root -p
-- 创建数据库
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并授权
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
MySQL 配置优化:
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础配置
bind-address = 127.0.0.1
port = 3306
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# InnoDB 配置
innodb_buffer_pool_size = 1G # 建议设置为内存的 50%~70%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
# 连接配置
max_connections = 200
wait_timeout = 600
interactive_timeout = 600
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
6.2 数据库备份策略
数据是最重要的资产,自建服务器更要做好备份。
备份策略建议:
- 每天凌晨全量备份
- 开启 binlog 实时备份
- 备份文件保留至少 7 天
- 定期进行恢复演练
自动备份脚本:
#!/bin/bash
# /usr/local/bin/mysql_backup.sh
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="myapp"
DB_USER="backup_user"
DB_PASS="backup_password"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME_$DATE.sql.gz
# 删除 7 天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup completed: $DB_NAME_$DATE.sql.gz"
配置定时任务:
# 添加到 crontab
crontab -e
# 每天凌晨 2 点执行备份
0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
异地备份:自建服务器强烈建议将备份同步到云端,防止本地灾难导致数据丢失。
备份存储建议:
├── 本地备份:NAS / 磁带机 / 备份服务器
├── 云端备份:同步到对象存储(COS/OSS)(推荐)
└── 异地备份:同步到分公司/灾备中心
七、安全防护(自建服务器必须重视)
云服务器有云厂商提供安全防护,自建服务器需要全部自行负责。
7.1 防火墙配置
# 使用 iptables 或 firewalld
# 仅开放必要端口
# Ubuntu 使用 ufw
sudo ufw enable
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# CentOS/Rocky Linux 使用 firewalld
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload
7.2 系统安全加固
# 1. 修改 SSH 端口
sudo vim /etc/ssh/sshd_config
# 修改 Port 22 为其他端口,如 Port 2222
# 2. 禁用 root 远程登录
# 设置 PermitRootLogin no
# 3. 使用密钥认证
# 生成密钥对:ssh-keygen -t ed25519
# 将公钥复制到服务器:ssh-copy-id -p 2222 user@server
# 4. 安装 fail2ban 防暴力破解
sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
7.3 DDoS 防护
自建服务器很难独立应对 DDoS 攻击,强烈建议购买云厂商高防 IP 或使用云反向代理方案。
| 方案 | 成本 | 效果 |
|---|---|---|
| 运营商清洗服务 | ¥500~5000/月 | 中等 |
| 云厂商高防 IP | ¥3000~30000+/月 | 优秀 |
| 自建流量清洗设备 | 设备成本高 | 取决于设备 |
| 使用云反向代理 | 云服务器费用 | 优秀(推荐) |
7.4 入侵检测
推荐工具:
- fail2ban:自动封禁暴力破解 IP
- OSSEC:主机入侵检测系统
- Snort/Suricata:网络入侵检测
- ClamAV:病毒扫描
7.5 安全加固清单
系统层面:
├── 关闭不必要的服务和端口
├── 定期更新系统和软件包(yum update / apt upgrade)
├── 禁用 root SSH 登录,使用密钥认证
├── 配置登录失败锁定策略
├── 开启审计日志(auditd)
├── 定期进行安全扫描(Nessus/OpenVAS)
└── 配置系统日志远程备份
应用层面:
├── Web 服务器隐藏版本号
├── 配置 WAF(ModSecurity / OpenResty lua-waf)
├── API 接口限流(Nginx limit_req)
├── SQL 注入防护(参数化查询)
├── XSS 防护(Content-Security-Policy)
├── CSRF 防护(Token 机制)
└── 敏感数据加密存储
八、高可用与灾备
8.1 电力保障
| 措施 | 说明 |
|---|---|
| UPS 不间断电源 | 应对短暂停电,建议在线式 UPS |
| 双路市电 | 两个独立供电回路(需与物业/电力公司协调) |
| 柴油发电机 | 长时间停电时供电 |
| 服务器双电源 | 服务器配备双电源模块,分别接不同供电 |
8.2 网络冗余
推荐方案:
- 双 ISP 接入(如电信+联通),通过 BGP 或策略路由实现
- 主线路故障时自动切换到备用线路
- DNS 配置多条 A 记录指向不同 IP(需 ISP 支持)
单 ISP 的风险:
- 运营商线路故障 → 服务完全不可用
- 无法防御针对单一出口的 DDoS 攻击
8.3 硬件监控
需要监控的指标:
├── 服务器硬件状态
│ ├── CPU 温度、使用率
│ ├── 内存使用率
│ ├── 磁盘使用率、SMART 状态
│ ├── 网卡流量
│ └── RAID 状态(如有)
├── 网络状态
│ ├── 公网连通性(Ping、TCP 检测)
│ ├── 带宽使用率
│ └── DNS 解析状态
└── 应用状态
├── Web 服务存活检测
├── 数据库连接状态
├── API 接口响应时间
└── SSL 证书到期时间
推荐监控工具:
- Zabbix:企业级硬件和网络监控
- Prometheus + Grafana:应用性能监控
- UptimeRobot / 阿里云监控:外部可用性监控(免费)
8.4 硬件维护准备
需要准备:
├── 备件储备
│ ├── 内存条(与服务器型号匹配)
│ ├── 硬盘(热插拔备用盘)
│ ├── 网卡
│ ├── 电源模块
│ └── 风扇
├── 维保服务
│ ├── 服务器厂商维保(如 Dell ProSupport、HPE Care Pack)
│ └── 硬盘数据恢复服务联系方式
└── 运维工具
├── 服务器远程管理卡(iDRAC/iLO/IPMI)
├── KVM 切换器
└── 串口控制台
九、微信小程序后台配置
9.1 服务器域名配置
这是小程序能够访问你服务器的关键步骤。
配置路径:微信公众平台 → 开发管理 → 开发设置 → 服务器域名
需要配置的域名:
| 类型 | 用途 | 示例 |
|---|---|---|
| request | wx.request 请求 | https://api.example.com |
| uploadFile | 文件上传 | https://api.example.com |
| downloadFile | 文件下载 | https://static.example.com |
| socket | WebSocket 通信 | wss://ws.example.com |
配置规则:
- 域名必须已备案
- 必须使用 HTTPS
- 不能带端口号(只能用 443)
- 不能使用 IP 地址
- 每种类型最多配置 20 个域名
- 一个月内最多修改 50 次
常见配置错误:
- 域名没有备案:需要先完成备案
- 域名没有 SSL 证书:需要先配置 HTTPS
- 域名格式错误:不要带
https://前缀和路径 - 域名未生效:DNS 解析可能还没生效,等一会再试
9.2 接口权限配置
根据业务需要,开通相应的接口权限。
常用接口权限:
| 权限 | 用途 | 是否需要审核 |
|---|---|---|
| 微信支付 | 在线收款 | 需要 |
| 消息模板 | 服务通知 | 需要 |
| 客服消息 | 在线客服 | 需要 |
| 位置服务 | 获取用户位置 | 需要 |
| 内容安全 | 文本/图片审核 | 需要 |
十、部署前检查
10.1 检查清单
在提交审核之前,务必检查以下内容:
账号与资质
- 小程序账号已注册
- AppID 和 AppSecret 已获取
- 小程序类目已选择
- 如需支付,微信支付商户号已开通
网络配置(自建服务器特有)
- 已申请固定公网 IP
- 已确认上行带宽满足需求
- 已配置端口映射(443 → 内网服务器 443)
- 已配置 IP 白名单(小程序后台)
- 已规划网络冗余方案
域名与证书
- 域名已注册并完成实名认证
- 已确认接入商(ISP)支持备案
- ICP 备案已完成
- DNS 解析已指向公网 IP
- SSL 证书已申请并部署
服务器与环境
- 服务器操作系统已安装
- 运行环境已安装配置
- Nginx 已配置并运行
- 防火墙已配置
- 数据库已部署并可连接
安全防护
- 防火墙已配置(仅开放 80/443/22)
- DDoS 防护方案已确定
- WAF 已部署
- 系统安全加固已完成
高可用
- UPS 不间断电源已配备
- 数据备份策略已实施
- 硬件监控告警已配置
- 应急预案已制定并演练
代码与部署
- 后端 API 开发完成
- 后端服务已部署并运行
- 小程序代码已提审
- 体验版已测试通过
运维保障
- 运维团队/人员已明确
- 硬件备件已准备
- 7×24 应急响应机制已建立
- 运维文档已编写
10.2 测试验证
API 接口测试:
# 测试接口是否可访问
curl https://api.example.com/api/health
# 测试 HTTPS 是否正常
curl -I https://api.example.com
# 测试跨域
curl -H "Origin: https://servicewechat.com" https://api.example.com/api/test
小程序体验版测试:
- 在微信开发者工具上传代码
- 在小程序后台设置体验版
- 使用体验版小程序测试所有功能
- 检查网络请求是否正常
- 检查文件上传下载是否正常
结果
部署成功后的状态
当所有准备工作完成后,你的小程序应该具备以下能力:
- 稳定的服务:后端 API 能够正常响应请求
- 安全的传输:所有数据通过 HTTPS 加密传输
- 可靠的网络:公网访问正常,端口映射正确
- 可靠的数据:数据库自动备份,数据安全有保障
- 完善的监控:能够及时发现和处理问题
- 应急能力:硬件故障、网络故障有应对方案
成本对比分析
自建服务器和云服务器的成本差异很大,一定要算清楚:
| 成本项 | 云服务器(年) | 自建服务器(年) |
|---|---|---|
| 硬件采购 | ¥0 | ¥10,000~50,000(一次性) |
| 硬件折旧 | ¥0 | ¥3,000~15,000/年 |
| 机房/电费/物业 | ¥0 | ¥5,000~20,000/年 |
| 企业专线+固定IP | ¥0 | ¥12,000~60,000/年 |
| 云服务器租赁 | ¥2,000~20,000 | ¥0 |
| 安全防护 | 云厂商含基础防护 | ¥5,000~30,000/年 |
| 运维人力 | 低 | 高(需专人) |
| 备份存储 | 云厂商含 | ¥1,000~5,000/年 |
| 合计(首年) | ¥2,000~20,000 | ¥36,000~180,000 |
| 合计(后续年) | ¥2,000~20,000 | ¥26,000~130,000 |
注意:自建服务器的隐性成本(人力、运维、故障损失)往往被严重低估。
总结与延伸阅读
核心要点回顾
- 网络是关键:自建服务器最大的挑战是让微信服务器能访问到你,公网 IP、端口映射、带宽这些一定要提前搞定
- 备案要趁早:自建服务器的备案流程比云服务器复杂,一定要提前开始
- 安全自己扛:没有云厂商帮你防护,防火墙、WAF、DDoS 防护都得自己搞
- 高可用要设计:电力、网络、硬件都要考虑冗余,不能有单点故障
- 运维是长期成本:自建服务器需要专人负责运维,这个成本容易被忽视
常见问题解答
Q:自建服务器一定要申请固定公网 IP 吗?
A:是的。微信小程序要求域名解析到稳定的 IP,动态 IP 不适合生产环境。
Q:备案一定要通过 ISP 吗?
A:是的。自建服务器需要有接入商,通常是你的宽带运营商。如果备案困难,可以考虑用云服务器做反向代理。
Q:自建服务器被 DDoS 攻击了怎么办?
A:自建服务器很难独立应对 DDoS 攻击,强烈建议购买云厂商高防 IP,或者使用云服务器做反向代理。
Q:自建服务器的成本真的比云服务器高吗?
A:不一定。如果业务规模大、有专业运维团队,长期来看自建服务器可能更划算。但对于大多数中小企业,云服务器的总成本更低。
Q:混合架构是什么意思?
A:混合架构是指用云服务器做前端接入(处理备案、DDoS 防护、CDN),后端业务跑在公司自建服务器上。这样既利用了云厂商的基础设施能力,又将核心数据保留在公司内部。
延伸阅读资源
官方文档:
云厂商文档:
推荐教程:
- 《微信小程序开发入门与实践》
- 《Nginx 高性能 Web 服务器详解》
- 《MySQL 性能优化》
最后的建议
自建服务器部署小程序确实比用云服务器复杂不少,但也不是不能搞定。关键是要做好规划,把网络、安全、高可用这些关键环节想清楚,然后一步步落实。
对于大多数中小企业,我的建议是采用混合架构——用云服务器做前端接入,核心业务跑在自建服务器上。这样既能利用云厂商的基础设施能力,又能把核心数据掌控在自己手里。
记住,第一次部署是最难的,等你熟悉了整个流程后,后面再部署就会轻松很多。祝你部署顺利!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)