Alpine Linux · VPS 初始化 · OpenRC

Alpine Linux
轻量服务器初始化清单

整机内存 50 MB 起步、apk 包管理简洁、OpenRC 服务模型干净。本文整理 VPS 拿到手后的全套初始化步骤。

~5 MB容器镜像体积
apk包管理工具
OpenRC默认 init 系统
musl轻量 libc,注意兼容性
TL;DR · 核心结论

Alpine Linux 基于 musl libc + BusyBox + OpenRC,整机内存通常 50~100 MB,是跑博客、反代、DNS 的理想系统。初始化六步:① sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 换国内源;② apk add chrony + rc-update add chronyd 做时间同步;③ apk add nginx php83-fpm php83-mysqli php83-gd php83-mbstring php83-tokenizer php83-curl 装 Web 环境;④ rc-update add nginx default / rc-update add php83-fpm default 开机自启(不是 systemctl);⑤ 云控制台安全组放行 22/80/443;⑥ 部署 Typecho 时如果 500,先查 Nginx 错误日志,大概率是缺 php83-tokenizer 或 php83-mbstring。

Why Alpine

为什么博客/反代/DNS 都爱用 Alpine

小、快、干净,但要接受 musl 的兼容性代价

体积小 ~5 MB

官方容器镜像只有约 5 MB,整机安装后磁盘占用不到 200 MB。云服务器上省下来的磁盘和内存都是真金白银。

内存占用低 50 MB 起

空载内存通常 50~100 MB,对比 Ubuntu Server 的 300~500 MB 是数量级差距。1 核 1 G 的小鸡跑 Nginx + PHP-FPM 毫无压力。

OpenRC 服务模型 干净

不使用 systemd,服务脚本在 /etc/init.d/,自启用 rc-update add xxx default,查看用 rc-status,逻辑直白。

musl 兼容性 注意

musl libc 与 glibc 行为差异,少数闭源二进制(如某些专有数据库客户端)不能直接跑,需要 static build 或重编译。

Init Checklist

初始化六步清单

新 VPS 拿到手按顺序跑一遍

1. 换国内 apk 源

  • 编辑 /etc/apk/repositories
  • 把 dl-cdn.alpinelinux.org 换成 mirrors.aliyun.com 或 mirrors.tuna.tsinghua.edu.cn
  • 执行 apk update 生效
  • 版本号要与系统一致(如 v3.20),可先 cat /etc/alpine-release 确认

2. 时间同步 chrony

  • apk add chrony
  • rc-update add chronyd default
  • /etc/init.d/chronyd start
  • 验证:chronyc tracking,看 System time 是否接近 0
  • 时间不准会导致 HTTPS 证书校验失败、日志时间错位

3. 装 Nginx + PHP-FPM

  • apk add nginx
  • apk add php83-fpm php83-mysqli php83-gd php83-mbstring php83-tokenizer php83-curl php83-session php83-json
  • Alpine 把 PHP 拆成独立包,每个扩展都要单独装
  • PHP-FPM 默认监听 127.0.0.1:9000,socket 在 /run/php83-fpm.sock

4. 开机自启(OpenRC)

  • rc-update add nginx default
  • rc-update add php83-fpm default
  • 立即启动:/etc/init.d/nginx start、/etc/init.d/php83-fpm start
  • 查看所有自启服务:rc-status
  • 参考 Alpine Init System 官方 wiki

5. 安全组与防火墙

  • 云控制台安全组放行:22(SSH)、80(HTTP)、443(HTTPS)
  • Alpine 本地防火墙用 apk add iptables 或 ufw
  • 生产环境建议改 SSH 端口、禁 root 密码登录、用密钥
  • 不要把 3306(MySQL)、6379(Redis)暴露到公网

6. 部署应用(Typecho 为例)

  • 解压 Typecho 到 /var/www/typecho
  • 给 Nginx 配 server 块,root 指到该目录
  • 伪静态参考 Typecho 官方文档
  • 浏览器访问域名,按引导安装
  • 常见 500 错误见下方"常见坑"
Ports

必须放行与绝对不能暴露的端口

安全组一次配好,少走很多弯路

端口用途是否公网放行备注
22SSH建议放行(可改端口)生产环境建议密钥登录、禁 root 密码
80HTTP放行用来签 Let's Encrypt 证书 + 跳转 HTTPS
443HTTPS放行网站主入口
3306MySQL/MariaDB禁止只监听 127.0.0.1,公网暴露会被扫
6379Redis禁止历史上大量未授权访问案例
9000PHP-FPM禁止只监听 127.0.0.1 或 unix socket
853/53DoT/DoH(自建 DNS)按需放行仅当你对外提供加密 DNS 服务时
Pitfalls

Alpine 部署 Typecho 的常见坑

23-4.cn 自己踩过的几个

500 错误:缺 php-tokenizer 最高频

Typecho 后台或文章页直接 500,看 Nginx 日志没细节。原因是 Alpine 的 PHP 拆包,php83-tokenizer 没装。修复:apk add php83-tokenizer 然后 /etc/init.d/php83-fpm restart。

500 错误:缺 php-mbstring 次高频

中文标题、UTF-8 字符串处理报错。apk add php83-mbstring 后重启 PHP-FPM。Alpine 不会像 Debian 那样自动装依赖扩展。

systemctl 报错 新手必踩

Alpine 用 OpenRC 不是 systemd。systemctl start nginx 会提示 command not found。正确命令是 /etc/init.d/nginx start 或 rc-service nginx start。

php-fpm 找不到 socket 配置问题

Nginx 报 "connect() to unix:/run/php/php83-fpm.sock failed"。Alpine 的 socket 路径默认在 /run/php83-fpm.sock,Nginx 配置里要写对。可在 /etc/php83/php-fpm.d/www.conf 改 listen。

FAQ

常见问题

Alpine 为什么比 Ubuntu/Debian 轻那么多?+
Alpine 基于 musl libc 和 BusyBox,默认容器镜像只有约 5 MB,整机内存占用通常在 50~100 MB 级别,比 Ubuntu Server 少一个数量级。代价是 musl 与 glibc 的兼容性差异,少数闭源软件需要重编译。
Alpine 的包管理为什么是 apk 不是 apt/yum?+
Alpine 自带 apk-tools,配置文件在 /etc/apk/repositories,常用命令 apk add / apk update / apk upgrade。换源就是把该文件里的 dl-cdn.alpinelinux.org 改成 mirrors.aliyun.com 或 mirrors.tuna.tsinghua.edu.cn。
Alpine 开机自启用 systemctl 为什么报错?+
Alpine 默认用 OpenRC 而不是 systemd,开机自启命令是 rc-update add <服务> default,查看状态用 rc-status。例如 rc-update add nginx default、rc-update add php83-fpm default。
Typecho 在 Alpine 上打开页面 500 错误怎么排查?+
最常见原因是缺 php-tokenizer / php-mbstring / php-curl 等扩展。Alpine 的 PHP 拆成了独立包,需要 apk add php83-tokenizer php83-mbstring php83-curl,然后 /etc/init.d/php83-fpm restart。
References

参考来源