天天看點

使用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