静看光阴荏苒
不管不顾不问不说也不念

Debian11配置Apache2使用PHP-FPM

最近要部署一个php程序只支持apache,属实有点蛋疼,用了几年的nginx,早就把apache的配置方法给忘光了,没办法只能抓紧时间重新学一下apache2.4的配置,这篇文章记录一下配置过程。

默认情况下apache2.4还是用的mpm_prefork和mod_php来跑php,但是用这种方法早就已经过时了。

目前推荐的做法是使用mpm_event和phpfpm,所以这篇文章只介绍一下这种方法。

实际上这篇文章也算是走了一遍在debian11上搭建lamp的整个流程。。做事做全套吧。。

安装apache2:

apt -y update
apt -y install apache2

安装mariadb:

apt -y install mariadb-server

添加php8的存储库:

apt -y install apt-transport-https ca-certificates lsb-release
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt -y update

安装phpfpm:

apt -y install php8.0-fpm

顺便把程序需要用到的其他php扩展也装上:

apt -y install php8.0-mysql php8.0-imagick php8.0-gd php8.0-curl php8.0-dom php8.0-mbstring php8.0-zip php8.0-bcmath php8.0-intl

启动以及设置apache2/mariadb/phpfpm开机自启:

systemctl enable --now apache2 mariadb php8.0-fpm

[重要]这里有个特别需要注意的地方,如果之前系统安装过这个包:libapache2-mod-php8.0

这个包会把apache的mpm模式改为prefork,我们需要手动改回event:

a2dismod php8.0
a2dismod mpm_prefork
a2enmod mpm_event

查看当前apache的mpm模式,正常情况下应该回显event:

a2query -M

没有安装过这个包的话就不用管了。

启用proxy_fcgi和setenvif模块,用于支持phpfpm:

a2enmod proxy_fcgi setenvif

重启apache2使其生效:

systemctl restart apache2

启用php8的fpm配置:

a2enconf php8.0-fpm

重载apache2使其生效:

systemctl reload apache2

启用rewrite模块,用于支持.htaccess文件:

a2enmod rewrite

重启apache2使其生效:

systemctl restart apache2

rewrite模块虽然启用了,但由于debian默认的配置不允许使用.htaccess文件,所以还需要修改配置文件。

这里提供一个覆写配置的方案,就不用改动原来官方的配置了,在conf-available目录新建一个配置文件:

nano /etc/apache2/conf-available/allow-override.conf

写入如下配置:

<Directory "/var/www">
    AllowOverride all
</Directory>

然后启用这个配置:

a2enconf allow-override

重载apache2使其生效:

systemctl reload apache2

新建站点(vhost)配置文件:

nano /etc/apache2/sites-available/example.conf

写入如下配置:

<VirtualHost *:80>
        ServerName apache.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/example
        ErrorLog ${APACHE_LOG_DIR}/example_error.log
        CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>

检查配置是否正确:

apache2ctl configtest

正常的话就可以启用这个站点(vhost)了,命令后面跟的是站点配置文件的文件名:

a2ensite example

站点目录所有者和使用nginx+phpfpm时一样,都是使用www-data这个用户,所以要更改的话可以使用下面的命令:

chown -R www-data:www-data /var/www/example

站点启用后也是需要重载apache2才能生效的:

systemctl reload apache2

现在可以仍一个phpinfo上去看看配置是否正常,能正常访问到phpinfo并在serverapi这里显示fpm/fastcgi说明正常:

一路走到这里就基本熟悉apache2在debian上的配置了,实际上就靠这几个命令行工具就能完成绝大多数的配置:

a2ensite // 启用站点
a2dissite // 关闭站点
a2enconf // 启用配置文件
a2disconf // 关闭配置文件
a2enmod // 启用模块
a2dismod // 关闭模块
a2query // 查看apache2的各种信息

启用站点、关闭站点、启用配置文件、关闭配置文件,这些操作都可以通过reload来生效,启用模块、关闭模块则必须通过restart来生效。

这几个命令实际对应也就只操作下面这几个目录:

/etc/apache2/sites-available // 可用站点
/etc/apache2/sites-enabled // 已经启用的站点
/etc/apache2/conf-available // 可用配置文件
/etc/apache2/conf-enabled // 已经启用的配置文件
/etc/apache2/mods-available // 可用模块
/etc/apache2/mods-enabled // 已经启用的模块

启用了某个站点、配置文件、模块就只是把available目录内的配置文件做一个符号链接到enabled目录内,关闭的话就是删除符合链接。

a2query更是一个非常好用的查看apache2的状态工具,比如要查看当前启用的模块:

a2query -m

会列出当前已经启用的模块:

authn_file (enabled by maintainer script)
authz_host (enabled by maintainer script)
filter (enabled by maintainer script)
dir (enabled by maintainer script)
alias (enabled by maintainer script)
auth_basic (enabled by maintainer script)
proxy_fcgi (enabled by site administrator)
reqtimeout (enabled by maintainer script)
setenvif (enabled by maintainer script)
mime (enabled by maintainer script)
rewrite (enabled by site administrator)
negotiation (enabled by maintainer script)
authn_core (enabled by maintainer script)
mpm_event (enabled by site administrator)
ssl (enabled by site administrator)
authz_core (enabled by maintainer script)
autoindex (enabled by maintainer script)
deflate (enabled by maintainer script)
authz_user (enabled by maintainer script)
proxy (enabled by site administrator)
access_compat (enabled by maintainer script)
env (enabled by maintainer script)
socache_shmcb (enabled by site administrator)
status (enabled by maintainer script)

签发ssl证书这块还是可以用certbot:

apt -y install python3-certbot-apache

然后一条命令即可完事:

certbot --apache

剩下的就和apache2没啥关系了,数据库初始化:

mysql_secure_installation

新版本的mariadb10.5,和以往有点不一样,会提示你是否要切换到unix_socket authentication,这里选n:

Enter current password for root (enter for none):
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

创建数据库和用户并授权:

mysql -u root -p
CREATE DATABASE example CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON example.* TO example@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
quit

关于phpfpm的配置,这里稍微提一嘴,我个人推荐用ondemand模式来管理phpfpm的进程,用这个模式的话不会浪费你的机器内存,对于一些机器内存不大的机器来说比较友好。

默认情况下是dynamic模式,要修改的话,编辑如下配置文件:

nano /etc/php/8.0/fpm/pool.d/www.conf

找到下面的配置修改:

pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 30s;
pm.max_requests = 500

在ondemand模式下只有pm.max_children参数是生效的,这个参数直接指定最大的phpfpm进程数量。我这里就只设置了5,对于一般站点来说够用了,不够的话自己往上加。

php8的php.ini配置:

nano /etc/php/8.0/fpm/php.ini

一般就是这些配置改改就行了:

max_execution_time = 300
post_max_size = 100M
upload_max_filesize = 100M
memory_limit = 256M
赞(6)
未经允许不得转载:荒岛 » Debian11配置Apache2使用PHP-FPM
分享到: 更多 (0)

评论 4

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    要启用全新域名嘛? :oops:

    橘子3年前 (2021-10-15) Google Chrome 83.0.4103.124 Google Chrome 83.0.4103.124 Windows 7 Windows 7回复
  2. #2

    如果让我用ap我估计也当场暴毙!

    sooele3年前 (2021-10-16) Microsoft Edge 94.0.992.50 Microsoft Edge 94.0.992.50 Windows 10 x64 Edition Windows 10 x64 Edition回复
  3. #3

    大佬有空可不可以写下这个教程:https://github.com/ZLMediaKit/ZLMediaKit

    ZLMediaKit3年前 (2021-10-23) Google Chrome 95.0.4638.54 Google Chrome 95.0.4638.54 Windows 10 x64 Edition Windows 10 x64 Edition回复

分享创造快乐

广告合作资源投稿