You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mabbs/_posts/2022-03-12-alpine.md

56 lines
8.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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那样还要升级内核了所以只要执行以下命令
```bash
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的内存被系统占掉那么多它到底干了些啥目前我没有发现任何坑到时候迁移完再看吧总之现在的我只能说小就是好