往期回顾
一.docker的安装
二.php环境之nginx的docker镜像制作
上期已经讲了php环境所需的nginx镜像的制作并测试了使用制作的镜像起的容器提供的静态站点页面的访问,那么接下来我们就准备在上一期的镜像基础上再装入php做成php-nginx的镜像包
创建一个新容器 安装php
用我们做好nginx镜像运行创建一个新的容器
docker run -it my/lnp:v1 /bin/bash
下载对应版本php安装包
代码语言:shell复制php版本的选择 见后面的常见问题归纳(php) 1
cd /tmp
wget https://www.php.net/distributions/php-7.4.30.tar.gz
#或使用镜像地址
wget -O /tmp/php-7.4.30.tar.gz http://cn2.php.net/get/php-7.4.30.tar.gz/from/a/mirror
wget命令及下载包的格式检测问题 见后面的常见问题归纳(php) 2
解压到指定目录
tar -zxvf /tmp/php-7.4.30.tar.gz -C /usr/local/
添加www用户组
查看所有用户组信息
cat /etc/group [| grep 你要查的用户组字符串]
查看所有用户信息
cat /etc/passwd [| grep 你要查的用户字符串]
有了就不用再建了
代码语言:shell复制groupadd www
useradd -g www www
进入目录准备进行编译安装
cd /usr/local/php-7.4.30
配置configure
为了保持和原有项目的配置一致,可以在原项目上运行phpinfo();
其中的 Configure Command
选项就是原先项目的php配置,可以直接复制出来去除'
即可
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --disable-fileinfo --enable-opcache
安装配置依赖包
然后不断根据提示 yum -y install 对应的依赖包
根据configure配置的报错 一步一步安装对应缺失的依赖包即可(因为环境不同,可能需要安装的依赖包也有所不同,可以报错了去百度对应的依赖包需要安装什么)以下是我的安装过程,供参考:
代码语言:shell复制Package 'libxml2', required by 'virtual:world', not found
yum install -y libxml2-devel
Package 'sqlite3', required by 'virtual:world', not found
yum -y install sqlite-devel
Package 'libcurl', required by 'virtual:world', not found
yum -y install libcurl-devel
Package 'icu-uc', required by 'virtual:world', not found
Package 'icu-io', required by 'virtual:world', not found
Package 'icu-i18n', required by 'virtual:world', not found
yum install -y libicu-devel
Package 'oniguruma', required by 'virtual:world', not found
Package 'oniguruma', required by 'virtual:world', not found
yum -y install oniguruma
yum -y install oniguruma oniguruma-devel
Error: Unable to find a match: oniguruma-devel
# 我docker环境的centos 8.5.2111 安装oniguruma-devel异常,百度需要手动编译安装
# 处理参考:https://www.cnblogs.com/lyc94620/p/13201379.html
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O /tmp/oniguruma-6.9.4.tar.gz
#上面的链接下载不了的话可换成下面这个试试
wget http://down.24kplus.com/linux/oniguruma/oniguruma-6.9.4.tar.gz
tar -zxf oniguruma-6.9.4.tar.gz
cd oniguruma-6.9.4
./autogen.sh && ./configure --prefix=/usr
make && make install
#安装完成后删除对应包
rm -rf oniguruma-6.9.4
rm -rf oniguruma-6.9.4.tar.gz
或者现在可以把你的 configure 配置项和环境信息告诉gbt,让gbt告诉你需要提前安装的依赖包
代码语言:txt复制#gbt根据./configure 给的预安装包
yum install -y gcc gcc-c make autoconf automake zlib-devel libxml2-devel bzip2-devel openssl-devel curl-devel gd-devel libjpeg-devel libpng-devel freetype-devel readline-devel libxslt-devel libmcrypt-devel libicu-devel
直到出现 下面这段 或是 echo $?
返回 0
便编译成功了
...
Thank you for using PHP.
...
编译安装(需要花一些时间安装 >10分钟)
make && make install && make clean
检测安装及相关配置项配置
检测安装是否成功
/usr/local/php/bin/php -v
配置php命令全局使用
方法一 添加环境变量
代码语言:txt复制vi /etc/profile
#文件最后中加入这一行
PATH=$PAHT:/usr/local/php/bin
#运行下面命令
source /etc/profile
按上述操作 就可以直接使用 php
命令了,但这个方法有个问题退出当前shell重新链接后 需要再次执行 source /etc/profile
才生效,否则 还是 -bash: php: command not found
- 查询相关原因
~/.bashrc
: 用户级别的Bash Shell配置文件,当一个用户登录系统时,该文件会自动执行。
/etc/bashrc
: 系统级别的Bash Shell配置文件,对于所有用户都有效。
/etc/profile
: 系统级别的Shell环境配置文件,对于所有Shell类型(包括Bash)都有效。
将环境变量添加到/etc/profile
可以让它对所有Shell生效,但是,当您重新打开Shell时,它不会自动加载/etc/profile
,因此您需要手动运行source /etc/profile
以使更改生效。
为了避免手动输入命令,您可以将source /etc/profile
添加到~/.bashrc
或~/.bash_profile
文件中,这样每次打开一个新的终端窗口时,它都会自动加载/etc/profile
并更新环境变量。只需在文件的末尾添加以下代码即可:
bash
if [ -f /etc/profile ]; then
source /etc/profile
fi
这个代码片段检查/etc/profile
文件是否存在,并且如果存在,则自动运行source
命令加载它。
方法二 创建一个软链接
直接在原有的命令环境下创建一个软链接即可,简单方便
代码语言:txt复制#查看原来的环境变量
[root@xxx /]# echo $PATH
/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#直接在原来的/usr/bin 命令环境下加一个php的命令软链接就行
[root@xxx /]# ln -s /usr/local/php/bin/php /usr/bin/php
php相关配置
复制相关默认配置文件
cp /usr/local/php-7.4.30/php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
修改php-fpm配置
代码语言:shell复制具体参数项参考 php-fpm.conf配置说明及demo
[root@xxx /]# vi /usr/local/php/etc/php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
[www]
;listen = /tmp/php-cgi.sock
listen = 127.0.0.1:9000
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
;pm = dynamic
pm = static
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 60
request_terminate_timeout = 30
request_slowlog_timeout = 2
slowlog = var/log/slow.log
pm.status_path = /fpm-status
启动 php-fpm
代码语言:shell复制# 运行php-fpm
/usr/local/php/sbin/php-fpm
# 指定配置文件启动 PHP-FPM 服务
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf
#为了方便直接使用php-fpm命令启动,也可以给php-fpm创建一个软链接
ln -s /usr/local/php/sbin/php-fpm /usr/bin/php-fpm
#查看对应php-fpm进程是否正常启动
ps -ef | grep php-fpm
#杀掉所有的php-fpm进程(pid具体地址看php-fpm.conf的设置)
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
#或是查找方式杀
ps -ef |grep php-fpm | grep -v grep | awk '{print $2}' | xargs kill -9
nginx与php服务的启动关停脚本
- 根目录下创建启动脚本
/start.sh
#!/bin/bash
# 指定配置文件启动 PHP-FPM 服务
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf
# 指定配置文件启动 Nginx 服务
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# PHP加入环境变量 使环境变量生效(因为再/usr/bin/下已经创建了php的快捷链接所以这里不需要执行这个了)
# source /etc/profile
- 根目录下创建关停脚本
/stop.sh
#!/bin/bash
#杀掉所有的php-fpm进程(pid具体地址看php-fpm.conf的设置)
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
#关闭nginx服务
/usr/local/nginx/sbin/nginx -s stop
- 启动、关闭服务测试
#运行服务
[root@xxx /]# /start.sh
#关闭服务
[root@xxx /]# /stop.sh
#检测服务是否存在
[root@xxx /]# ps -ef | grep nginx
[root@xxx /]# ps -ef | grep php-fpm