Mayx的博客

Logo

Mayx's Home Page

About Me

12 March 2022 - 字数统计:3472 - 阅读大约需要10分钟 - Hits: Loading...

Alpine的使用体验

by mayx


没别的,小就是好!

起因

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

Alpine的特点

Alpine Linux和我之前用过的piCore在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,而最近,我接手了另一个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 defaultrc-service mariadb start加入启动项和启动数据库,再执行mysql_secure_installation配置一些安全上的东西就OK了。
  3. Nginx安装起来就简单多了,直接执行apk add nginx,然后加入启动项rc-update add nginx default就行了。当然这只是安装,之后还需要一些配置才能连接到PHP。
  4. 额外的一些比如Redis我也试着装了一下,用apk add redisrc-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那样还要升级内核了,所以只要执行以下命令:

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的内存,被系统占掉那么多它到底干了些啥?目前我没有发现任何坑,到时候迁移完再看吧,总之现在的我只能说,小就是好!

tags: Alpine - LEMP - PHP
召唤伊斯特瓦尔