51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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 {#%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

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 {#%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,如果你的系统有防火墙的话,需要开启 80443 端口。

配置完成后可以在你配置的网站目录里创建一个 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}

  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 就会永久关闭。

赞(4)
未经允许不得转载:工具盒子 » Linux 安装和配置 Caddy + PHP + MySQL