自建服务器部署小程序准备工作详解

用公司自己的物理服务器来跑小程序后端,跟直接买云服务器相比,确实要多操不少心。网络怎么打通?安全防护怎么做?硬件坏了怎么办?这些问题在云服务器时代其实不用太操心,但自建服务器就得自己一个个解决。这篇文章就把整个流程掰开了揉碎了讲清楚,顺便把踩过的坑和经验都分享出来。


背景

小程序的运行原理

搞清楚小程序怎么跑起来的,才能明白为什么要准备那么多东西。小程序的运行其实分两块:

前端部分:跑在用户的微信里,负责页面展示和交互。这部分代码上传到微信公众平台就行,微信帮你分发。

后端部分:跑在你自己的服务器上,负责业务逻辑、数据存储、文件管理这些。这才是我们今天要重点聊的——怎么把后端服务部署到公司自己的服务器上。

┌─────────────┐         ┌─────────────┐         ┌─────────────┐
│   用户手机   │ ──────► │  微信服务器   │ ──────► │  你的服务器   │
│  (微信客户端) │         │ (分发前端代码) │         │ (运行后端API) │
└─────────────┘         └─────────────┘         └─────────────┘

自建服务器和云服务器的核心区别

选择自建服务器,意味着你要承担更多的责任。先看看两者的主要差异:

对比项 云服务器 自建服务器
公网 IP 云厂商自动分配,即买即用 需要向 ISP 申请,或通过 NAT 映射
带宽 随时可弹性调整 受限于公司出口带宽,调整周期长
域名备案 使用云厂商备案系统 需通过 ISP(宽带运营商)备案
网络安全 云厂商提供安全组/WAF/DDoS 需自行搭建防火墙、WAF 等
硬件运维 云厂商负责 公司 IT 团队自行维护
高可用 云厂商提供 SLA 保障 需自行设计冗余方案
扩展性 弹性伸缩,分钟级 需采购硬件,周期长

为什么微信对服务器有要求

微信对后端服务器有几个硬性要求,不满足的话小程序根本跑不起来:

  1. 必须是已备案的域名——不能用 IP 地址直接访问
  2. 必须使用 HTTPS——不支持 HTTP 明文传输
  3. 域名需要在后台配置——只有配置过的域名才能被小程序访问

这些要求看起来麻烦,实际上是在保护用户数据安全。理解了这一点,后面做准备工作就不会觉得是在做无用功了。


问题

自建服务器的特殊挑战

用云服务器部署小程序,很多问题云厂商帮你解决了。但自建服务器不一样,你得自己搞定。常见的坑有这些:

网络方面的问题

  • “服务器在公司内网,微信怎么访问到?”——需要申请公网 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 但为动态分配。

方案:

  1. 路由器配置 DDNS(动态域名解析)
  2. 使用花生壳/公云等 DDNS 服务
  3. 域名始终指向最新 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 记录 邮件服务器配置 邮件服务需要

配置步骤

  1. 登录域名注册商的控制台
  2. 找到域名解析设置
  3. 添加 A 记录,主机记录填 api(或其他子域名),记录值填服务器公网 IP
  4. 保存后等待解析生效(通常几分钟到几小时)

四、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

小程序体验版测试

  1. 在微信开发者工具上传代码
  2. 在小程序后台设置体验版
  3. 使用体验版小程序测试所有功能
  4. 检查网络请求是否正常
  5. 检查文件上传下载是否正常

结果

部署成功后的状态

当所有准备工作完成后,你的小程序应该具备以下能力:

  1. 稳定的服务:后端 API 能够正常响应请求
  2. 安全的传输:所有数据通过 HTTPS 加密传输
  3. 可靠的网络:公网访问正常,端口映射正确
  4. 可靠的数据:数据库自动备份,数据安全有保障
  5. 完善的监控:能够及时发现和处理问题
  6. 应急能力:硬件故障、网络故障有应对方案

成本对比分析

自建服务器和云服务器的成本差异很大,一定要算清楚:

成本项 云服务器(年) 自建服务器(年)
硬件采购 ¥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

注意:自建服务器的隐性成本(人力、运维、故障损失)往往被严重低估。


总结与延伸阅读

核心要点回顾

  1. 网络是关键:自建服务器最大的挑战是让微信服务器能访问到你,公网 IP、端口映射、带宽这些一定要提前搞定
  2. 备案要趁早:自建服务器的备案流程比云服务器复杂,一定要提前开始
  3. 安全自己扛:没有云厂商帮你防护,防火墙、WAF、DDoS 防护都得自己搞
  4. 高可用要设计:电力、网络、硬件都要考虑冗余,不能有单点故障
  5. 运维是长期成本:自建服务器需要专人负责运维,这个成本容易被忽视

常见问题解答

Q:自建服务器一定要申请固定公网 IP 吗?
A:是的。微信小程序要求域名解析到稳定的 IP,动态 IP 不适合生产环境。

Q:备案一定要通过 ISP 吗?
A:是的。自建服务器需要有接入商,通常是你的宽带运营商。如果备案困难,可以考虑用云服务器做反向代理。

Q:自建服务器被 DDoS 攻击了怎么办?
A:自建服务器很难独立应对 DDoS 攻击,强烈建议购买云厂商高防 IP,或者使用云服务器做反向代理。

Q:自建服务器的成本真的比云服务器高吗?
A:不一定。如果业务规模大、有专业运维团队,长期来看自建服务器可能更划算。但对于大多数中小企业,云服务器的总成本更低。

Q:混合架构是什么意思?
A:混合架构是指用云服务器做前端接入(处理备案、DDoS 防护、CDN),后端业务跑在公司自建服务器上。这样既利用了云厂商的基础设施能力,又将核心数据保留在公司内部。

延伸阅读资源

官方文档

云厂商文档

推荐教程

  • 《微信小程序开发入门与实践》
  • 《Nginx 高性能 Web 服务器详解》
  • 《MySQL 性能优化》

最后的建议

自建服务器部署小程序确实比用云服务器复杂不少,但也不是不能搞定。关键是要做好规划,把网络、安全、高可用这些关键环节想清楚,然后一步步落实。

对于大多数中小企业,我的建议是采用混合架构——用云服务器做前端接入,核心业务跑在自建服务器上。这样既能利用云厂商的基础设施能力,又能把核心数据掌控在自己手里。

记住,第一次部署是最难的,等你熟悉了整个流程后,后面再部署就会轻松很多。祝你部署顺利!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐