---
layout: post
title: Alpine的使用体验
tags: [Alpine, LEMP, PHP]
---

  没别的，小就是好！<!--more-->    

# 起因
  最近一段时间，我开始学习Docker了。在学习期间，我知道了Docker官方推荐的Alpine Linux系统。以前我也听说过这个系统，但是名字没什么特色就没关心过。不过既然学了Docker，我也体验了一下，发现还真是相当不错，而且正好能解决我手头的问题。   

# Alpine的特点
  Alpine Linux和我之前用过的[piCore](/2020/12/07/picore.html)在PC上用的版本TinyCore Linux有相似之处，他们都是基于Busybox来驱动整个系统的，不过TinyCore的软件要少很多，而且软件都是用类似镜像的方式打包，系统也是在内存中运行的，所以并不适合在生产环境中使用。Alpine就不一样了，它库中的软件很明显要多得多，而且现在很多人都在使用基于Docker构建的程序上，稳定性肯定是没有任何问题的，大小虽然比TinyCore Linux大了些，但是相比于CentOS之类的发行版要小太多了，而且在没有装程序的时候内存基础占用才不到100MiB。   
  另外它安装软件也特别简单，使用的命令是`apk add`，比如我想在Alpine上安装Docker，就直接输入`apk add docker`就行了，基本上不需要其他什么操作，Docker就安装好了，然后再执行个`rc-update add docker boot`加到启动项里，不像其他发行版还要加什么源啊，还要安装什么containerd啊，就很麻烦。   
  不过据说Alpine不适合开发，好像是因为系统用的是musl libc，用的人少，有些程序会不兼容……不过在我这次测试当中，没有碰见类似的问题。所以对于我来说，在生产服务器上使用CentOS实在是太浪费了，浪费硬盘空间又浪费内存空间，像我能用的服务器性能都不怎么高，要是用Alpine那就可以在一定程度上再提高性能了。   

# 预期的问题解决方案
  在两年前，我为了优化我所维护的花火学园曾经把系统[Ubuntu换成CentOS](/2020/01/05/devops.html)，而最近，我接手了另一个ACGN资源论坛——资源统筹局。这个论坛的体积也不小，因为之前论坛里对附件的上传限制不高，导致很大部分都是附件占的体积。像现在花火学园从以前的只有2GiB到现在有20GiB了，再加上统筹局又有十几GiB，还有CentOS本身又要10GiB左右，我原来租的64GiB大小的硬盘基本上不够用了，所以现在只好先升到了80GiB的硬盘。不过考虑到可持续发展，增加硬盘容量就要增加成本，这对可持续发展不是一件好事。想想CentOS要占掉这么大的空间实在是不合适，如果我能把这部分空间节省下来的话，那我还能继续用64GiB硬盘的服务器。   
  不过因为现在的数据量比较大，而且服务的用户也比较多，如果计划出问题恢复起来也比较麻烦，所以我想先在自己在电脑上创建一个类似的服务器，安装上Alpine进行预演测试，然后再找空闲时间在服务器上进行迁移操作，这样就能尽可能保证服务不会因为操作失误而中断了。   

# Alpine的安装与环境测试
  我在选取Alpine镜像的时候是使用的virt镜像，因为介绍上说这个版本对虚拟机有优化，而云服务器本质上就是一个KVM的虚拟机，我在电脑上装的话则是Hyper-V的虚拟机，所以我用的是这个版本。在启动之后，首先需要执行`setup-alpine`进行配置和安装，这么看来用光盘启动的Alpine有点像LiveCD，另外在服务器上安装的话在选择那个硬盘模式的时候可以选LVM，选了LVM之后方便以后调硬盘大小，然后再选sys。不过LVM有可能会影响性能，所以追求极致性能的话可以直接选sys。其他部分安装都很人性化，包括选择源还能自动找到最合适的源，这个比Ubuntu好多了，apt想换源还得手动换。   
## 安装LEMP  
  安装完成之后弹出光盘然后重启就OK了，接下来是安装LEMP环境。我以前用LEMP基本上要么是配好的，要么就是一键包，我既没有体验过编译安装，也没有试过用软件包管理器安装。所以这次在Alpine上安装也算是一个挑战了。像Docker安装既然直接安就可以，那这三个组件应该也差不多，我一开始是找的网上的文章，装倒是能正常装，但是我找了一个探针试着运行了一下总是报500的错误……结果发现网上那些在Alpine上安装的PHP连像php-json这种核心库都没装😓，后面我只好自己摸索，把Discuz需要的PHP扩展装全了，在安装软件之前，要启用community源，不然好多包会找不到，具体位置是在`/etc/apk/repositories`，把里面那个community源前面的#去掉，然后执行一下`apk update`就行了。   
  1. 安装PHP的命令主要是：`apk add php7 php7-fpm php7-opcache php7-gd php7-mysqli php7-zlib php7-curl php7-pdo php7-mysqlnd php7-json php7-exif php7-zip php7-redis php7-imagick php7-fileinfo php7-xml`，安装完之后别忘记把php-fpm加到启动项里：`rc-update add php-fpm7 default`，这些库安装完基本上大多数网站引擎就能正常用了。   
  2. 还有就是MySQL，我装的是MariaDB，反正也是相互兼容的，应该也不影响。具体命令是`apk add mariadb mariadb-client`，然后执行`/etc/init.d/mariadb setup`初始化，执行`rc-update add mariadb default`和`rc-service mariadb start`加入启动项和启动数据库，再执行`mysql_secure_installation`配置一些安全上的东西就OK了。   
  3. Nginx安装起来就简单多了，直接执行`apk add nginx`，然后加入启动项`rc-update add nginx default`就行了。当然这只是安装，之后还需要一些配置才能连接到PHP。    
  4. 额外的一些比如Redis我也试着装了一下，用`apk add redis`和`rc-update add redis default`就OK。   

  所有操作完成之后Nginx改一下配置文件，需要在`/etc/nginx/http.d`里的配置文件中增加一段：
```
location ~ \.php$ {
    fastcgi_pass      127.0.0.1:9000;
    fastcgi_index     index.php;
    include           fastcgi.conf;
}
```
  这个文件夹里面的`default.conf`中没配root，而且默认404，这些使用的时候都需要改一下。   
  所有的东西改完之后就可以使用完整的LEMP环境了。当然这些都是预演，这篇文章也是为了接下来在服务器上配置做准备。   
  另外还有些安全上的问题，默认情况下是没有配禁用函数的，还有防火墙默认也没有安装，Alpine倒是支持安装ufw也挺方便的，这些实际使用的时候都得配一下。   
  除此之外还有把php-fpm和redis配置成监听Unix Domain之类的优化操作，这些之前的文章都有写，这里就不多做描述了。   
## 配置BBR
  之前用CentOS的时候我是直接用的脚本整的BBR，不过BBR好像是高版本Linux内核自带的功能，本来就不需要安装，Alpine的内核版本好像是5.15，就不用像CentOS那样还要升级内核了，所以只要执行以下命令：
```shell
sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf 
sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf 
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf 
sysctl -p
```
  然后重启，执行`lsmod | grep bbr`只要有`tcp_bbr`就OK。

# 体验和总结
  最终整完之后安装了Discuz，感觉还挺不错的，功能简单试了一下都没有问题，用探针测试了一下速度也很不错，感觉作为接下来花火学园和资源统筹局的基础环境没有任何问题。   
  在结束之后我看了一下占用硬盘才600MiB，空载内存才200MiB左右，这简直比CentOS好太多了，像CentOS的LEMP空载内存都要600MiB左右，我整个服务器才2GiB的内存，被系统占掉那么多它到底干了些啥？目前我没有发现任何坑，到时候迁移完再看吧，总之现在的我只能说，小就是好！
