天天看点

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

1. 介绍

1.1 介绍

前面福哥已经教给大家使用php:7.4-apache-buster基础镜像搭建PHP运行环境了,这个是以模块方式(Module)运行PHP程序的,相比较这种方式更多人会选择主流的以FastCGI方式运行PHP程序,以FastCGI方式运行PHP程序就要用到PHP的FPM服务(FastCGI Process Manager)了。

今天福哥就带着大家使用php:7.4-fpm-buster基础镜像来搭建以FastCGI方式运行PHP程序的环境。

1.2 环境

镜像版本 php:7.4-fpm-buster
操作系统 CentOS 7 x86_64 2003
服务器 TFCentOS7x64
IP 192.168.168.68

2. 安装

2.1 Dockerfile

2.1.1 基础镜像

福哥选择的是php:7.4-fpm-buster这个基础镜像,这个就是FastCGI方式的。

https://hub.docker.com/_/php/tags?page=1&name=7.4-fpm-buster

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

2.1.2 维护者信息

这是福哥写的维护者信息。

# for MAINTAINER
MAINTAINER Author: Andy Bogate
MAINTAINER Email: [email protected]
MAINTAINER Home page: https://tongfu.net
MAINTAINER Datetime: 2023/03/18
MAINTAINER Version: v1.0           

2.1.3 暴露端口

提供服务的端口通常情况下是80和443,我们把它们暴露出来。

# for EXPOSE
EXPOSE 80 443           

2.1.4 主目录

福哥设置镜像的主目录是/tongfu.net/web。

# for WORKDIR
WORKDIR /tongfu.net/web           

2.1.5 安装工具

后面的制作过程需要用到wget工具,这个需要通过apt-get安装一下。

因为镜像本身只有一个FPM服务,所以这个Nginx服务我们得通过apt-get安装。

因为后面要是ps命令检测服务健康状态,所以还需要安装procps服务。

# install wget
RUN apt-get update \
&& apt-get -y install wget vim nginx procps
RUN apt-get -y install libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
RUN apt-get -y install libzip-dev
RUN apt-get -y install libc-client-dev libkrb5-dev
RUN apt-get -y install libxml2-dev           

2.1.6 释放PHP源码

这个php:7.4-fpm-buster包含了PHP的源码,因为后面需要使用PHP源码安装PHP扩展,所以先要释放PHP源码。

# extract PHP source
RUN docker-php-source extract           

2.1.7 GD图形库扩展

GD图形库可以让我们通过PHP直接加工各种图片文件,这个库可以用来实现图片验证码、照片加工等等功能的。

# gd extension
RUN docker-php-ext-configure gd \
--with-jpeg=/usr/include \
--with-freetype=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-enable gd           

2.1.8 MySQL扩展

福哥是使用PDO来连接MySQL数据库,而MySQL的PDO库PHP资源包里包含了,只要安装起来就行了。

# extension of mysqli for MySQL
RUN docker-php-ext-install mysqli \
&& docker-php-ext-enable mysqli

# extension of PDO for MySQL
RUN docker-php-ext-install pdo_mysql \
&& docker-php-ext-enable pdo_mysql           

2.1.9 Memcached扩展

memcached库需要从PECL下载,福哥选择的是3.1.5版本,这里直接通过phpize编译后就可以通过make安装了。memcached库依赖libmemcached库,福哥选择的是1.0.18版本,尽量不要改避免版本冲突~

# extension of Memcached
RUN wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz \
&& wget http://pecl.php.net/get/memcached-3.1.5.tgz \
&& tar -xzvf libmemcached-1.0.18.tar.gz \
&& cd libmemcached-1.0.18 \
&& sed -i 's/opt_servers \=\= false/\!opt_servers/g' clients/memflush.cc \
&& ./configure \
&& make && make install \
&& cd ../ \
&& rm -f libmemcached-1.0.18.tar.gz \
&& rm -rf libmemcached-1.0.18 \
&& tar -xzvf memcached-3.1.5.tgz \
&& cd memcached-3.1.5 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
--disable-memcached-sasl \
&& make && make install \
&& cd ../ \
&& rm -f memcached-3.1.5.tgz \
&& rm -rf memcached-3.1.5 \
&& docker-php-ext-enable memcached           

2.1.10 Redis扩展

redis库需要从PECL下载,福哥选择的是4.1.0版本,这里直接通过phpize编译后就可以通过make安装了。

# extension of Redis
RUN wget http://pecl.php.net/get/redis-4.1.0.tgz \
&& tar -xzvf redis-4.1.0.tgz \
&& cd redis-4.1.0 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& docker-php-ext-enable redis \
&& cd ../ \
&& rm -f redis-4.1.0.tgz \
&& rm -rf redis-4.1.0           

2.1.11 MongoDB扩展

MongoDB库需要从PECL下载,福哥选择的是1.7.4版本,这里直接通过phpize编译后就可以通过make安装了。

# extension of MongoDB
RUN wget http://pecl.php.net/get/mongodb-1.7.4.tgz \
&& tar -xzvf mongodb-1.7.4.tgz \
&& cd mongodb-1.7.4 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& docker-php-ext-enable mongodb \
&& cd ../ \
&& rm -f mongodb-1.7.4.tgz \
&& rm -rf mongodb-1.7.4           

2.1.12 其他扩展

除了前面安装的几个扩展之外,福哥还安装了imap、zlib、soap、bcmath这些扩展,建议大家也把这些安装上。

# imap extension
RUN docker-php-ext-configure imap \
--with-kerberos \
--with-imap-ssl \
&& docker-php-ext-install imap \
&& docker-php-ext-enable imap

# zlib extension
RUN mv /usr/src/php/ext/zlib/config0.m4 /usr/src/php/ext/zlib/config.m4 \
&& docker-php-ext-install zlib \
&& docker-php-ext-enable zlib

# soap extension
RUN docker-php-ext-install soap \
&& docker-php-ext-enable soap

# bcmath extension
RUN docker-php-ext-install bcmath \
&& docker-php-ext-enable bcmath           

2.1.13 清理PHP源码

现在PHP的扩展都按照好了,已经不需要源码了,清理掉吧。

# source delete
RUN docker-php-source delete           

2.2 多进程

福哥今天制作的镜像是基于FastCGI方式运行的,这里面有Nginx和FPM两个服务,也就是说使用这个镜像启动的容器里面就会运行两个进程。但是按照Docker的设计思想一个容器里只能跑一个进程,怎么办?

其实按PHP的FastCGI方式的设计,应该是启动两个容器共同处理用户的请求。静态内容由Nginx容器负责处理,PHP程序由FPM容器负责处理。

但是福哥不想弄那么麻烦,就想把Nginx服务和FPM服务放在一起!要实现这个目的,就需要修改镜像的ENTRYPOINT,一个ENTRYPOINT只能运行一个进程。为了解决这个问题,福哥要自定义这个ENTRYPOINT,用ENTRYPOINT启动一个Shell脚本,在Shell脚本里面同时启动Nginx和FPM服务。

下面是福哥写的一个ENTRYPOINT启动Shell脚本start_service,用来同时启动Nginx和FPM服务。

#!/bin/sh

# argv

# functions

function _main
{
  # start fpm
  /usr/local/sbin/php-fpm -D

  # start nginx
  /usr/sbin/nginx

  # wait secs
  sleep 6s

  # service
  while [ 1 ] ;
  do
    if [ "" = "`ps -ef | grep -v grep | grep 'php-fpm: master process'`" ] ; then
      echo "php is down"
      exit 1
    fi

    if [ "" = "`ps -ef | grep -v grep | grep 'nginx: master process'`" ] ; then
      echo "nginx is down"
      exit 2
    fi

    sleep 6s
  done
}

# main

_main "$@"           

在创建新的镜像的时候把start_service配置文件拷贝进去,并且授权可执行权限,最后将ENTRYPOINT的命令改成start_service。

# entry point
COPY start_service /usr/sbin/start_service
RUN chmod +x /usr/sbin/start_service
ENTRYPOINT ["/usr/sbin/start_service", ""]           

2.3 php配置文件

2.3.1 php.ini

php.ini的存放目录是/usr/local/etc/php/,镜像提供了php-ini-development、php.ini-production两个配置文件模板,我们可以根据使用场景选择开发版本还是生产版本。

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

2.4 nginx配置文件

2.4.1 模块配置

镜像安装的nginx包括modules-available和modules-enabled两个模块配置目录,modules-available里面包含全部的可用模块配置文件,modules-enabled里面是启用的模块配置文件。

要启用模块就从modules-available选择模块配置文件移动到modules-enabled下面。

要停用模块就从modules-enabled选择模块配置文件移动回modules-available下面。

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

2.4.2 站点配置

镜像安装的nginx包括sites-available和sites-enabled两个站点配置目录,sites-available里面包含全部的可用站点配置文件,sites-enabled里面是启用的站点配置文件。

要启用站点就从sites-available选择站点配置文件建立符号链接到sites-enabled下面。

要停用站点就将sites-enabled下面删除站点配置文件的符号链接。

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

福哥在默认站点的server里面利用rewrite实现了一个PHP的伪静态重定向配置,可以将各种html请求转交给htmlRouteMap.php处理。

如果要修改配置文件就需要先启动一个容器,然后把需要修改的配置文件复制出来一份,在外面改好了在通过COPY命令导入进去。

下面是福哥修改过的默认站点default配置文件的内容,因为默认文件里面有大篇幅说明太长了,福哥就给去掉了。

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   server_name _;

   rewrite ^\/(.*)\.html /htmlRouteMap.php?tfphp_static_name=$1;

   location / {
      root           /var/www/html;
   }

   location ~ \.phpnbsp;{
      client_body_buffer_size      1m;

      root           /var/www/html;
      fastcgi_pass   localhost:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include        fastcgi_params;
   }
}           

在创建新的镜像的时候把default配置文件拷贝进去。

# nginx sites
COPY default /etc/nginx/sites-enabled/default           

2.5 创建镜像

使用下面的命令创建tfphp:7.4-nginx-1.0.0镜像。

docker build -f Dockerfile \
-t registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0 ./           
使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

2.6 查看镜像

看看新的镜像,现在有apache版本、nginx版本两个tfphp的镜像了。

docker images | grep tfphp           
使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

3. 测试

3.1 宿主机程序目录

在宿主机建立一个用来存放php程序的目录,它将被映射到容器的nginx主目录上面。

mkdir -p /tongfu.net/data/docker/data/tfphp/html/           

3.2 宿主机程序文件

在刚刚建立的目录下面建立一个php程序文件index.php,写入下面的代码。

<?php

phpinfo();           

再建立一个php程序文件htmlRouteMap.php,写入下面的代码。

<?php

var_dump($_GET['tfphp_static_name']. ".html");           

3.3 删除容器

因为前面我们使用apache版本的tfphp启动了一个容器了,现在要测试nginx版本的tfphp就需要先把这个tfphp容器删除掉。

docker rm -f tfphp           
使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

3.4 启动容器

使用下面的命令基于tfphp:7.4-nginx-1.0.0镜像启动一个容器,将80端口和443端口映射到宿主机上面,将/var/www/html这个nginx主目录映射到前面建立的目录上面。

docker run -tid \
--name tfphp \
-h tfphp \
-p 80:80 \
-p 443:443 \
-v /tongfu.net/data/docker/data/tfphp/html:/var/www/html \
registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0           
使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

3.5 浏览器访问

打开浏览器访问http://192.168.168.68/index.php,可以看到PHP系统信息。

可以看到Server API一栏的信息是FPM/FastCGI,证明我们的这个运行环境是FastCGI模式的。

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

输入网址http://192.168.168.68/tongfu.net/docker/tfphp.html,可以看到请求html资源路径被htmlRouteMap.php打印出来了。

使用php:7.4-fpm-buster镜像部署PHP7+Nginx环境

4. 总结

今天福哥在TFCentOS7x64服务器上面通过Dockerfile创建了一个镜像tfphp:7.4-nginx-1.0.0,并且通过这个新创建的镜像tfphp:7.4-nginx-1.0.0启动了一个容器,这个镜像用来运行基于PHP语言开发的应用程序。

后面福哥会在这个镜像tfphp:7.4-nginx-1.0.0基础之上进行二次扩展制作新的镜像,然后根据镜像的用途针对nginx和php进行自定义的配置,敬请期待~

https://m.tongfu.net/home/35/blog/513983.html