安装Tengine

编译和安装

因为Tengine是阿里优化的Nginx,并发能力较好,但是安装和使用方式和Nginx是一模一样的,先去Tengine官网找最新版的连接,截至本文最新版本为3.1.0

# 安装必要工具,若已有跳过这一步
dnf install gcc gcc-c++ make curl

# 确保为root目录
cd

# 下载源码包
curl -o te.tar.gz -L https://tengine.taobao.org/download/tengine-3.1.0.tar.gz

# 解压
tar -zxvf te.tar.gz

# cd进入解压后的目录,我这里是tengine-3.1.0
cd tengine-3.1.0

# 生成Makefile文件并编译安装
./configure
make
make install

中途可能会出现以下报错,执行dnf install pcre-devel之后再从./configure重新开始执行

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

设置开机自启

为了更方便管理这里使用systemctl来管理,先使用vim创建一个配置文件,一定要在这个目录里

vim /usr/lib/systemd/system/nginx.service

然后点i键进入编辑模式,将下面的内容复制按Shift+Insert粘贴进去,其中/usr/local/nginx是你Nginx的安装路径,若你没有在编译安装时使用--prefix修改路径则直接用这个就行

[Unit]
Description=Nginx
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

然后按Esc,输入:wq保存并退出

# 重载systemctl
systemctl daemon-reload

# 开启自启动(禁用改成disable)
systemctl enable nginx

# 开启
systemctl start nginx

# 重载配置文件
systemctl reload nginx

# 关闭
systemctl stop nginx

# 重启
systemctl restart nginx

安装PHP

编译和安装

先去PHP官网Download页面,点击侧栏Old archives可以看历史版本,找你你想要的版本,这里使用8.0.29

# 确保为root目录
cd

# 下载源码包
curl -o php.tar.gz -L https://www.php.net/distributions/php-8.0.29.tar.gz

# 解压
tar -zxvf php.tar.gz

# 生成Makefile文件并编译安装(指定到php8目录是防止未来安装其他版本的php方便区分)
./configure --enable-fpm --prefix=/usr/local/php8
make
make install

中途可能出现以下报错,执行dnf install libxml2-devel之后再从./configure重新开始执行

configure: error: Package requirements (libxml-2.0 >= 2.9.0) were not met:

Package 'libxml-2.0', required by 'virtual:world', not found

若出现其他的报错,只要不是兼容,大概率是缺运行库,根据下面方法自己进行排查

# 比如上面的报错告诉你缺少libxml
dnf search libxml

# 然后寻找给你列出的前几个里面,找到一个最贴近的结尾为devel的安装即可
dnf install libxml2-devel

# 若系统没有这个库,则尝试换源或者升级系统,不想升级就去github找源码手动编译安装,没有的这个问题普遍存在在老版本的CentOS上

接下来复制配置文件

# 复制预设配置文件
cp /usr/local/php8/etc/php-fpm.conf.default /usr/local/php8/etc/php-fpm.conf
cp /usr/local/php8/etc/php-fpm.d/www.conf.default /usr/local/php8/etc/php-fpm.d/www.conf

# 复制php.ini
cp php.ini-production /usr/local/php8/php.ini

# 可以测试以下会不会有php版本输出
/usr/local/php8/sbin/php-fpm -v

开启开机自启

依然使用systemctl管理

vim /usr/lib/systemd/system/php8.service

然后把下面的粘贴进去,php8根据自己的实际情况可以更改

[Unit]
Description=php-fpm
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/php8/sbin/php-fpm -y /usr/local/php8/etc/php-fpm.conf -c /usr/local/php8/php.ini
ExecStop=/usr/local/php8/sbin/php-fpm stop

[Install]
WantedBy=multi-user.target

然后按Esc,输入:wq保存并退出

# 重载systemctl
systemctl daemon-reload

# 开启自启动(禁用改成disable)
systemctl enable php8

# 开启
systemctl start php8

# 关闭
systemctl stop php8

# 重启
systemctl restart php8

连接到Nginx

使用TCP9000的方法比较简单,但是效率不高,这里主要教的是使用unixsock的方式连接,这样效率比较高,大部分生产环境中也是这样配置的,如宝塔面板的php配置,我们先打开Nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf

server{}块中找到类似以下内容,按下i键进入编辑模式,将前面的#注释去掉,并且如下将fastcgi_param中的/scripts$fastcgi_script_name改为$document_root$fastcgi_script_name

...
#location ~ \.php$ {
#   root           html;
#   fastcgi_pass   127.0.0.1:9000;
#   fastcgi_index  index.php;
#   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
#   include        fastcgi_params;
#}
...

按Esc输入:wq保存并退出,到这时其实已经可以用了,但是使用的是TCP连接,你可以

# 把html的主页改掉名字或者删除
mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak

# 新建一个index.php
vim /usr/local/nginx/html/index.php

# 填入“<?php phpinfo(); ?>”后然后保存退出

# 重启php和nginx
systemctl restart php8
systemctl restart nginx

此时访问你的服务器大概率已经可以显示出php的信息界面了,接下来我们把TCP连接调整为unixsock连接,首先选取一个地方放sock文件,这里推荐放进/dev/shm中,这个文件夹是在运行内存里,读写速度快效率更高,然后打开php-fpm的配置文件

vim /usr/local/php8/etc/php-fpm.d/www.conf

然后将listen = 127.0.0.1:9000listen.backlog = 511改为下面的样子,第二个记得把前面的;注释去掉

...
listen = /dev/shm/php8.sock

; Set listen(2) backlog.
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
listen.backlog = -1
...

以及下拉后的下面三行前面的;注释去掉

...
listen.owner = nobody
listen.group = nobody
listen.mode = 0660
...

然后修改nginx的配置文件

vim  /usr/local/nginx/conf/nginx.conf

将刚才修改的那一部分的127.0.0.1:9000改为以下的样子,以及配置文件第一行的#user nobody前的#注释去掉

location ~ \.php$ {
  root           html;
  fastcgi_pass   unix:/dev/shm/php8.sock;
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}

然后重启nginx和php,再次访问你的服务器即可

# 重启php和nginx
systemctl restart php8
systemctl restart nginx

编译php模块

由于我们安装的是一个纯净版的php,没有任何模块,所以在使用时缺什么模块需要根据所缺安装,比如我要使用typecho,提示我缺少mbstring模块,我们就以这个为例子,首先php的源码文件夹不要删,cd进去

# 安装必要工具
dnf install autoconf

# 进入php源码文件夹的ext目录
cd /root/php-8.0.29/ext/

# 我们缺少mbstring模块(可以使用ls查看有没有你需要用的模块)
cd mbstring

# 通过phpize工具生成配置文件,/usr/local/php8是你的php安装目录
/usr/local/php8/bin/phpize

# 编译并安装,prefix是最后编译出来的so的输出位置,其实放哪都行,最后配置文件指向就可以了
./configure --with-php-config=/usr/local/php8/bin/php-config
make
make install

中途可能出现以下报错,执行dnf install oniguruma-devel之后再从./configure重新开始执行,如果是其他错误就dnf search就可以了

configure: error: Package requirements (oniguruma) were not met:

Package 'oniguruma', required by 'virtual:world', not found

然后一般会输出在php安装目录下的lib/php/extensions/no-debug-non-zts-20200930/文件夹中,可以自行打开检查一下,然后打开php的配置文件指向这个so

# 就是上面复制得到那个php.ini
vim /usr/local/php8/php.ini

在文档中下部分找到一堆extension=的位置,按i进入编辑模式,添加一行

extension=/usr/local/php8/lib/php/extensions/no-debug-non-zts-20200930/mbstring.so

保存退出,重启php即可