外链论坛

 找回密码
 立即注册
搜索
查看: 7|回复: 0

运用php:7.4-fpm-buster镜像安排PHP7+Nginx环境

[复制链接]

2883

主题

210

回帖

9777万

积分

论坛元老

Rank: 8Rank: 8

积分
97779546
发表于 2024-10-4 13:14:53 | 显示全部楼层 |阅读模式

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

端口

80

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

此刻hub.docker.com依然打不开,大众就选这个版本吧!

拉取镜像php:7.4-fpm-buster,添加到registry.tongfu.net:5000私有仓库里面。

docker pull php:7.4-fpm-buster docker tag php:7.4-fpm-buster registry.tongfu.net:5000/php:7.4-fpm-buster docker rmi php:7.4-fpm-buster docker images | grep php

2.1.2 创建镜像目录

创建镜像目录php7.4nginx并切换到php7.4nginx目录下面。

mkdir /tongfu.net/data/dockerfile/tfphp7.4nginx cd /tongfu.net/data/dockerfile/tfphp7.4nginx

2.1.3 依赖镜像

第1行写上依赖镜像php:7.4-fpm-buster。

FROM registry.tongfu.net:5000/php:7.4-fpm-buster

2.1.4 守护者信息

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

for MAINTAINER MAINTAINER AuthorAndy Bogate MAINTAINER Emailtongfu@tongfu.net MAINTAINER Home page: https://tongfu.net MAINTAINERDatetime: 2023/03/18 MAINTAINER Version: v1.0

2.1.5 暴露端口

供给服务的端口一般状况下是80和443,咱们把它们暴露出来。

# for EXPOSE EXPOSE 80 443

2.1.6 主目录

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

# for WORKDIR WORKDIR /tongfu.net/web

2.1.7 设置时区

默认时区是UTC,咱们把它改成CST,便是中国标准时间。

# for timezoneRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ &&echo "Asia/Shanghai" > /etc/timezone

2.1.8 安装工具和依赖库

后面的制作过程需要用到wget工具,这个需要经过apt-get安装一下。除此之外还要安装有些依赖库,包含图形库、zip和xml等等。

由于镜像本身仅有一个FPM服务,FPM服务只能处理php程序,要处理其他类型的文件还得需要安装Nginx服务。

由于后面要是ps命令检测服务健康状态,因此还需要安装procps服务。

# install wget & nginx RUN apt-get update \ && apt-get -y installwget 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.9 释放PHP源码

这个php:7.4-fpm-buster包括了PHP的源码,由于后面需要运用PHP源码安装PHP扩展,因此先要释放PHP源码。

# extract HP source RUN docker-php-source extract

2.1.10 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.11 MySQL扩展

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

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

2.1.12 Memcached扩展

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

# library of Memcached RUN wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz \ && 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 # extension of Memcached RUN wget http://pecl.php.net/get/memcached-3.1.5.tgz \ && 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.13 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 \ && cd ../ \ && rm -f redis-4.1.0.tgz \ && rm -rf redis-4.1.0 \ && docker-php-ext-enable redis

2.1.14 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 \ && cd ../ \ && rm -f mongodb-1.7.4.tgz \ && rm -rf mongodb-1.7.4 \ && docker-php-ext-enable mongodb

2.1.15 其他扩展

除了前面安装的几个扩展之外,福哥还安装了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 extensionRUN 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.16 清理PHP源码

此刻PHP的扩展都根据好了,已然不需要源码了,清理掉吧。

# source deleteRUN docker-php-sourcedelete

2.2 多进程

福哥今天制作的镜像是基于FastCGI方式运行的,这儿面有FPM和Nginx两个服务,便是运用这个镜像起步的容器里面就会运行两个进程。然则根据Docker的设计思想一个容器里只能跑一个进程,怎么办?

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

然则福哥不想弄那样麻烦,就想把FPM服务和Nginx服务放在一块!要实现这个目的,就需要修改镜像的ENTRYPOINT。一个ENTRYPOINT只能运行一个进程,为认识决这个问题,福哥要自定义这个ENTRYPOINT,用ENTRYPOINT起步一个Shell脚本,在Shell脚本里面同期起步FPM服务和Nginx服务。

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

#!/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 COPYstart_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.ini-development出来放到镜像目录下。

docker run -tid --name ttt -h ttt registry.tongfu.net:5000/php:7.4-fpm-buster docker cp ttt:/usr/local/etc/php/php.ini-development php.ini docker rm -f ttt

设置错误日志路径,将PHP的执行错误存起来。

error_log= /tmp/php_errors.log

修改php.ini设置时区为Asia/Shanghai。

date.timezone = Asia/Shanghai

复制php.ini覆盖镜像里面的php.ini配置文件。

# php.ini COPY php.ini /usr/local/etc/php/php.ini

2.4 nginx配置文件

2.4.1 模块配置

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

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

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

由于nginx默认就支持rewrite,这个模块就不消调节了!

2.4.2 站点配置

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

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

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

由于镜像的nginx服务是福哥经过apt-get安装的,加上nginx的默认站点的配置文件default里面有非常多示例的配置乱七八糟的,因此这儿福哥打算自己写一个精简版本的默认站点配置文件default。

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

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 ~ \.php$ {       client_body_buffer_size      1m;       root           /var/www/html;       fastcgi_passlocalhost: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 ./

查看镜像

瞧瞧新的镜像,此刻有apache版本、nginx版本两个tfphp的镜像了。

docker images | grep tfphp

3. 测试

3.1 程序目录和程序文件

既然都是php环境,那样运用tfphp:7.4-apache-1.0.0的测试代码就能够了!

3.2 删除容器

由于前面咱们运用apache版本的tfphp起步了一个容器了,此刻要测试nginx版本的tfphp就需要先把这个tfphp容器删除掉。

docker rm -f tfphp

3.3 起步容器

运用下面的命令基于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

3.4 浏览器拜访

打开浏览器拜访http://192.168.168.68/index.php能够看到PHP系统信息。

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

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

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-10-18 18:21 , Processed in 0.084088 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.