Linux 安装和配置 Caddy + PHP + MySQL
最近更换了服务器的提供商,服务器上的网站之类的也需要迁移,因为我没有用 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
把 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
可以在根目录创建一个 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
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
- 检查
Caddyfile
的目录是否配置正确 - 检查网站目录和子目录的权限,主要是要有读取和写入权限
如果 Caddy 配置和网站目录都没有问题的话可能就是 selinux 的问题,我遇到的也是 selinux 问题。
可以让 selinux 忽略网站目录:
chcon -R -t httpd_sys_content_t /www
如果要关闭 selinux 可以打开i /etc/selinux/config
,找到:
SELINUX=enforcing
修改为:
SELINUX=disabled
重启服务器后 selinux 就会永久关闭。
版权声明:本文为原创文章,版权归 Mr. Ma's Blog 所有,转载请联系博主获得授权。
本文地址:https://www.misterma.com/archives/941/
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。