最近更换了服务器的提供商,服务器上的网站之类的也需要迁移,因为我没有用 Docker 来部署,所以运行环境之类的也需要重新安装。我的博客运行环境使用的是 PHP + Nginx,安装和配置都是使用宝塔面板来完成的。

这次我准备把 Web 服务器换成 Caddy,Caddy 相比 Nginx 来说,配置会简单很多。我选择 Caddy 的另一个原因就是可以自动申请和续订 SSL 证书,我使用的证书是 Let's Encrypt 的,需要每三个月续订一次,换成 Caddy 后就可以不用管了。

Caddy 在高负载下的性能相比 Nginx 可能会差一些,但我的网站只是个人博客,使用 Caddy 也不需要担心性能问题。

我服务器使用的 Linux 是 CentOS7,我下面的安装方式只适用于使用 yum 管理软件包的 Red Hat 系列 Linux,包括 CentOS、Fedora,RHEL 之类的。

安装 PHP

我服务器使用的 PHP 版本是 PHP7.4,虽然现在 PHP 已经到 8 了,但是我运行的一些 PHP 项目不是太兼容 PHP8,所以我这里还是选择安装 PHP7.4。

更新 yum:

yum update

默认的 yum 可能没有需要的 PHP 版本,这里使用 remi-release 仓库:

yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

安装 PHP7.4 和常用模块:

yum install -y php74-php-fpm php74-php-cli php74-php-bcmath php74-php-gd php74-php-json php74-php-mbstring php74-php-mcrypt php74-php-mysqlnd php74-php-opcache php74-php-pdo php74-php-pecl-crypto php74-php-pecl-mcrypt php74-php-pecl-geoip php74-php-pecl-swoole php74-php-recode php74-php-snmp php74-php-soap php74-php-xmll

如果你要安装其它版本的 PHP 和模块可以更换后面的数字版本号,比如 PHP7.2 就可以使用 php72。

安装完成后可以使用:

php74 -v

查看 PHP 版本。

默认的 php-cli 的命令是 php版本号,也就是 php74,如果你需要改为 php 可以输入:

ln -s /opt/remi/php74/root/usr/bin/php /usr/bin/php

如果你安装的不是 php7.4 可以把版本数字区域换成你的 php 版本。

安装 Caddy

Caddy 是一个使用 Go 开发的 Web 服务器,没有什么依赖,你可以直接到 Caddy 官网下载 caddy 的单文件放到服务器上使用,也可以使用 yum 安装。

我这里会使用 yum 来安装 Caddy,安装的版本是 Caddy2。

默认的 yum 也是没有 Caddy,需要安装 yum-plugin-copr:

yum install yum-plugin-copr

启用存储库:

yum copr enable @caddy/caddy

安装 Caddy:

yum install -y caddy

安装完成后使用:

caddy -v

查看 Caddy 版本。

安装 MySQL

目前 MySQL 最新的版本是 8.2,因为我的服务器配置不高,只有 2G 的内存,所以我还是选择 5.7 的版本。

添加 MySQL5.7 的存储库:

yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

导入新的 MySQL GPG 密钥:

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

MySQL 更改了 GPG 密钥,如果不导入新的密钥的话,无法安装 MySQL5.7。

安装 MySQL:

yum install -y mysql-community-server

安装完成后启动 MySQL 服务:

systemctl start mysqld

查看默认生成的 MySQL root 密码:

grep 'temporary password' /var/log/mysqld.log

显示的密码如下:

2023-11-18T16:01:54.214484Z 1 [Note] A temporary password is generated for root@localhost: 6!,Q1%9)l&tC

我的默认密码就是 6!,Q1%9)l&tC

如果你的系统启用了防火墙的话需要开放 3306 端口,CentOS 开放端口可以看 CentOS 开放、关闭和查看端口

下面连接到 MySQL 修改密码:

mysql -uroot -p

输入默认的 MySQL root 密码连接到 MySQL。

成功连接 MySQL 会显示一些版权信息:

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective

修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

比如我要把密码修改为 misterma.com2023

ALTER USER 'root'@'localhost' IDENTIFIED BY 'misterma.com2023';

在命令行使用 MySQL 的时候,SQL 语句的结尾需要加 ;

配置 PHP-FPM 和 Caddy

PHP-FPM(PHP FastCGI Process Manager)是 PHP 的一个 FastCGI 进程管理器,用于处理 PHP 脚本的请求。Caddy 收到客户端请求后会把请求发送给 PHP-FPM,PHP-FPM 处理完成后会把结果返回给 Caddy,Caddy 再把结果返回给客户端。

Caddy 和 PHP-FPM 的通信方式包括 TCP Sock 和 UNIX Sock。TCP Sock 可以实现远程通信,也就是 PHP 和 Caddy 不再一台服务器也能通信,UNIX Sock 需要在同一台服务器才能通信,不过 UNIX Sock 的安全性和性能要比 TCP Sock 高,我这里也会使用 UNIX Sock。

配置 PHP-FPM

root 的用户权限比较高,为了安全考虑,可以单独创建一个用户来作为 PHP-FPM 的运行用户。

下面创建一个 www 用户:

useradd www

下面会涉及到文件编辑,你可以用 vi 之类的编辑器来编辑,关于 vi 的使用可以看 Linux VI 编辑器简单使用教程 。如果你不习惯在命令行编辑的话,也可以使用 Xftp 之类的 FTP 工具,通过 SFTP 连接到服务器,可以使用图形界面操作文件目录,也可以使用你电脑上安装的编辑器打开文件编辑。

打开 PHP-FPM 的配置文件 /etc/opt/remi/php74/php-fpm.d/www.conf ,找到:

user = apache
group = apache

usergroup 改为你创建的新用户名称:

user = www
group = www

找到:

listen = 127.0.0.1:9000

改为:

listen = /tmp/php-cgi-74.sock

下面的配置项如果前面有 ; 就去除 ;,如果配置文件中没有配置项就加入:

listen.owner = www
listen.group = www
listen.mode = 0666

配置完成后启动 PHP:

systemctl start php74-php-fpm

设置 PHP-FPM 开机启动:

systemctl enable php74-php-fpm

可以查看一下 /tmp 目录有没有 php-cgi-74.sock ,如果没有的话可以在 /tmp 目录里的其它子目录找一下,如果能找到的话说明 sock 文件创建成功。

systemd 为了安全考虑,把 sock 文件放到了子目录,可以通过修改服务单元文件的方式来把 sock 文件放到 /tmp

停止 PHP-FPM:

systemctl stop php74-php-fpm

打开 /etc/systemd/system/multi-user.target.wants/php74-php-fpm.service ,找到:

PrivateTmp=true

改为:

PrivateTmp=false

重新加载 systemd:

systemctl daemon-reload

启动 PHP-FPM:

systemctl start php74-php-fpm

现在可以查看一下 /tmp 目录有没有 php-cgi-74.sock

配置 Caddy

可以在根目录创建一个 www 目录来存放网站:

mkdir /www

如果你是用 root 用户创建的 /www 的话,可以把 /www 的组和所有者改为 www 用户:

chown -R www /www

Caddy 的配置文件你可以放到 www 目录,也可以根据你的需求放到其它目录,下面创建一个名为 Caddyfile 的文件作为 Caddy 的配置文件:

touch Caddyfile

下面再 Caddyfile 文件中配置一个网站:

# 网站域名
www.misterma.com {
    # 网站目录
    root * /www/web1
    # 启用静态文件服务,否则无法加载 img、CSS、JS
    file_server
    # 配置 caddy 和 PHP 的通信方式和路径
    php_fastcgi unix//tmp/php-cgi-74.sock
}

Caddy 默认会自动申请 SSL 和启用 HTTPS,如果你的系统有防火墙的话,需要开启 80443 端口。

配置完成后可以在你配置的网站目录里创建一个 index.php 文件,在文件中加入:

<?php
phpinfo();

进入你存放 Caddy 配置文件 Caddyfile 的目录,输入:

caddy run

Caddy 会使用当前目录下的 Caddyfile 配置运行。

你也可以使用:

caddy start

Caddy 会使用当前目录下的 Caddyfile 配置在后台运行。

你可以在浏览器访问你配置的域名,如果配置没有问题的话,应该能看到 PHP 的版本信息和模块说明。

如果访问 PHP 网页出现 File Not Found 可以看后面的解决方式。

下载 phpMyAdmin

phpMyAdmin 是一个使用 PHP 编写的 MySQL 管理工具,它可以使用 Web 的方式来管理 MySQL。

phpMyAdmin 就是一套 PHP 网站,你可以使用系统的包管理器安装,也可以到 phpMyAdmin 官网下载安装,我这里会直接到官网下载。

phpMyAdmin 的官网是 https://www.phpmyadmin.net,可以在 www 目录下创建一个 phpmyadmin 目录来存放 phpMyAdmin,进入 www/phpmyadmin 目录,下面使用 wget 来下载 5.2.1:

wget --no-check-certificate https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip

解压:

unzip phpMyAdmin-5.2.1-all-languages.zip

解压后可能会得到一个 phpMyAdmin-5.2.1-all-languages 目录,可以把里面的所有文件和目录移动到 /www/phpmyadmin 目录:

mv /www/phpmyadmin/phpMyAdmin-5.2.1-all-languages/* /www/phpmyadmin/

打开你的 Caddyfile 配置文件,为 phpmyadmin 配置一个站点:

# 监听 4090 端口的所有 HTTP 请求
http://:4090 {
    # phpMyAdmin 的网站目录
    root * /www/phpmyadmin
    # 静态文件服务
    file_server
    # PHP 服务
    php_fastcgi unix//tmp/php-cgi-74.sock
}

上面的 http://:4090 就是可以直接通过服务器 IP:4090 来访问,配置完成后重启 Caddy。

在浏览器访问配置的地址就能看到 phpMyAdmin,你可以输入你的 MySQL 用户名和密码登录管理 MySQL。

安装 Composer

Composer 是 PHP 的一个包管理器。当你上传 PHP 项目到服务器时,你应该不想把 vendor 目录里的文件也一起上传到服务器,虽然 PHP 的 vendor 没有 Node.js 的 node_modules 恶心,但是也有不少文件。

如果你配置了 php 命令的话,可以输入下面的命令安装 Composer:

hp -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('https://composer.github.io/installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

安装完成后可以输入:

composer --version

查看 composer 版本信息。

如果你要给 PHP 项目安装依赖可以进入项目目录,输入:

composer install

Composer 会根据你项目里的 composer.json 和 composer.lock 来安装依赖。

常用命令

下面是 PHP-FPM、MYSQL、Caddy 的一些常用命令。

PHP-FPM

我使用的是 PHP7.4,我这里的命令都包含 php74,如果你用的不是 7.4 的话可以更改数字,如果你配置了 PHP 命令的话也可以不加数字。

启动 PHP-FPM:

systemctl start php74-php-fpm

停止 PHP-FPM:

systemctl stop php74-php-fpm

重启 PHP-FPM:

systemctl restart php74-php-fpm

查看 PHP-FPM 状态:

systemctl status php74-php-fpm

设置 PHP-FPM 开机启动:

systemctl enable php74-php-fpm

禁止 PHP-FPM 开机启动

systemctl disable php74-php-fpm

MySQL

启动 MySQL

systemctl start mysqld

停止 MYSQL:

systemctl stop mysqld

重启 MySQL:

systemctl restart mysqld

查看 MySQL 状态:

systemctl status mysqld

设置 MySQL 开机启动

systemctl enable mysqld

禁止 MySQL 开机启动:

systemctl disable mysqld

重新加载 MySQL 配置:

systemctl reload mysqld

Caddy

使用当前目录下的 Caddyfile 文件启动 Caddy:

caddy run

使用当前目录下的 Caddyfile 文件在后台启动 Caddy:

caddy start

停止后台运行的 Caddy:

caddy stop

如果要使用其它目录的配置文件启动 Caddy 可以加 --config 选项,比如:

caddy start --config /dir/Caddyfile

或者:

caddy run --config /dir/Caddyfile

配置 Caddy 开机启动

下面配置 Caddy 通过 systemctl 命令启动和开机启动。

/etc/systemd/system 创建一个 caddy.service 文件:

touch /etc/systemd/system/caddy.service

caddy.service 中加入:

[Unit]
Description=Caddy v2 HTTP/HTTPS server
After=network.target

[Service]
Restart=on-failure
User=root
ExecStart=/usr/bin/caddy run --config /www/Caddyfile
ExecReload=/usr/bin/caddy reload --config /www/Caddyfile

[Install]
WantedBy=multi-user.target

其中的 /usr/bin/caddy 就是 Caddy 软件的位置,通过 yum 安装的 Caddy 一般在 /usr/bin/caddy,如果你的 Caddy 是在 Caddy 官网下载的单文件,你需要换成你的 Caddy 文件的位置。

/www/Caddyfile 是 Caddy 配置文件 Caddyfile 的位置。

user=root 就是通过 root 用户启动,你也可以换成其它用户。

配置完成后重新加载 systemd 配置:

systemctl daemon-reload

开机启动 Caddy:

systemctl enable caddy

启动 Caddy:

systemctl start caddy

停止 Caddy:

systemctl stop caddy

重启 Caddy:

systemctl restart caddy

用于 Typecho 的 Caddy 配置

我的博客程序使用的就是 Typecho,下面是一个可用于 Typecho 的 Caddy 配置:

# 网站域名
www.misterma.com {
    # 网站目录
    root * /www/blog
    # 静态文件服务
    file_server
    # PHP 服务
    php_fastcgi unix//tmp/php-cgi-74.sock
    # 压缩
    encode gzip
    # Typecho 的伪静态
    handle_path / {
        try_files {path} {path}/ /index.php/{uri}
    }
    # 禁止访问 .db 后缀的文件
    @forbidden {
        path *.db
    }
    respond @forbidden 404
    # 日志
    log {
        output file /www/log/misterma.com.log {
            roll_size 100mb
            roll_keep 3
            roll_keep_for 7d
        }
    }
}

禁用 PHP 的一些危险函数

打开 /etc/opt/remi/php74/php.ini,查找 disable_functions ,如果前面有 ; 就去除 ;,在 = 后面加入你需要禁用的函数,函数之前用英文逗号分隔:

disable_functions = eval, create_function, exec, ini_alter, passthru, phpinfo, shell_exec, system, dl

上面的函数功能我这里就不详细写了,主要就是一些通过 String 字符串执行 PHP 代码和执行系统命令之类的,你可以根据需要选择禁用。

一些常见问题的解决方式

每个人的服务器环境可能都不一样,遇到的问题也会不一样,下面是我遇到过的一些问题和解决方式,有遇到同类问题的也可以参考一下。

phpMyAdmin 出现 Error during session start

第一次运行 phpMyAdmin 出现如下错误:

phpMyAdmin - Error
Error during session start; please check your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)

session_start(): Failed to read session data: files (path: /var/opt/remi/php74/lib/php/session)

主要是 session 目录的权限问题,可以把 /var/opt/remi/php74/lib/php/session 的所有者和组设置为 PHP-FPM 的用户,下面设置为 www 用户:

chown -R www:www /var/opt/remi/php74/lib/php/session

访问 PHP 页面出现 File not found

  1. 检查 Caddyfile 的目录是否配置正确
  2. 检查网站目录和子目录的权限,主要是要有读取和写入权限

如果 Caddy 配置和网站目录都没有问题的话可能就是 selinux 的问题,我遇到的也是 selinux 问题。

可以让 selinux 忽略网站目录:

chcon -R -t httpd_sys_content_t /www

如果要关闭 selinux 可以打开i /etc/selinux/config ,找到:

SELINUX=enforcing

修改为:

SELINUX=disabled

重启服务器后 selinux 就会永久关闭。