最近更换了服务器的提供商,服务器上的网站之类的也需要迁移,因为我没有用 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 {#%E5%AE%89%E8%A3%85+PHP6368}
我服务器使用的 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 版本。
安装 Caddy {#%E5%AE%89%E8%A3%85+Caddy5998}
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 {#%E5%AE%89%E8%A3%85+MySQL6836}
目前 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 {#%E9%85%8D%E7%BD%AE+PHP-FPM+%E5%92%8C+Caddy3383}
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 {#%E9%85%8D%E7%BD%AE+PHP-FPM2609}
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
把 user
和 group
改为你创建的新用户名称:
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 {#%E9%85%8D%E7%BD%AE+Caddy1679}
可以在根目录创建一个 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,如果你的系统有防火墙的话,需要开启 80
和 443
端口。
配置完成后可以在你配置的网站目录里创建一个 index.php
文件,在文件中加入:
<?php
phpinfo();
进入你存放 Caddy 配置文件 Caddyfile
的目录,输入:
caddy run
Caddy 会使用当前目录下的 Caddyfile
配置运行。
你也可以使用:
caddy start
Caddy 会使用当前目录下的 Caddyfile
配置在后台运行。
你可以在浏览器访问你配置的域名,如果配置没有问题的话,应该能看到 PHP 的版本信息和模块说明。
如果访问 PHP 网页出现 File Not Found
可以看后面的解决方式。
下载 phpMyAdmin {#%E4%B8%8B%E8%BD%BD+phpMyAdmin9056}
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。
常用命令 {#%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A43840}
下面是 PHP-FPM、MYSQL、Caddy 的一些常用命令。
PHP-FPM {#PHP-FPM2719}
我使用的是 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 {#MySQL8826}
启动 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 {#Caddy7036}
使用当前目录下的 Caddyfile
文件启动 Caddy:
caddy run
使用当前目录下的 Caddyfile
文件在后台启动 Caddy:
caddy start
停止后台运行的 Caddy:
caddy stop
如果要使用其它目录的配置文件启动 Caddy 可以加 --config
选项,比如:
caddy start --config /dir/Caddyfile
或者:
caddy run --config /dir/Caddyfile
配置 Caddy 开机启动 {#%E9%85%8D%E7%BD%AE+Caddy+%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A88969}
下面配置 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 配置 {#%E7%94%A8%E4%BA%8E+Typecho+%E7%9A%84+Caddy+%E9%85%8D%E7%BD%AE6701}
我的博客程序使用的就是 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 的一些危险函数 {#%E7%A6%81%E7%94%A8+PHP+%E7%9A%84%E4%B8%80%E4%BA%9B%E5%8D%B1%E9%99%A9%E5%87%BD%E6%95%B01304}
打开 /etc/opt/remi/php74/php.ini
,查找 disable_functions
,如果前面有 ;
就去除 ;
,在 =
后面加入你需要禁用的函数,函数之前用英文逗号分隔:
disable_functions = eval, create_function, exec, ini_alter, passthru, phpinfo, shell_exec, system, dl
上面的函数功能我这里就不详细写了,主要就是一些通过 String 字符串执行 PHP 代码和执行系统命令之类的,你可以根据需要选择禁用。
一些常见问题的解决方式 {#%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E5%BC%8F4844}
每个人的服务器环境可能都不一样,遇到的问题也会不一样,下面是我遇到过的一些问题和解决方式,有遇到同类问题的也可以参考一下。
phpMyAdmin 出现 Error during session start {#phpMyAdmin+%E5%87%BA%E7%8E%B0+Error+during+session+start9671}
第一次运行 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 {#%E8%AE%BF%E9%97%AE+PHP+%E9%A1%B5%E9%9D%A2%E5%87%BA%E7%8E%B0+File+not+found2046}
- 检查
Caddyfile
的目录是否配置正确 - 检查网站目录和子目录的权限,主要是要有读取和写入权限
如果 Caddy 配置和网站目录都没有问题的话可能就是 selinux 的问题,我遇到的也是 selinux 问题。
可以让 selinux 忽略网站目录:
chcon -R -t httpd_sys_content_t /www
如果要关闭 selinux 可以打开i /etc/selinux/config
,找到:
SELINUX=enforcing
修改为:
SELINUX=disabled
重启服务器后 selinux 就会永久关闭。