使用php7。4buster镜像部署PHP7Nginx环境
1。介绍
1。1介绍
前面福哥已经教给大家使用php:7。4apachebuster基础镜像搭建PHP运行环境了,这个是以模块方式(Module)运行PHP程序的,相比较这种方式更多人会选择主流的以FastCGI方式运行PHP程序,以FastCGI方式运行PHP程序就要用到PHP的FPM服务(FastCGIProcessManager)了。
今天福哥就带着大家使用php:7。4fpmbuster基础镜像来搭建以FastCGI方式运行PHP程序的环境。
1。2环境
镜像版本
php:7。4fpmbuster
操作系统
CentOS7x86642003
服务器
TFCentOS7x64
IP
192。168。168。682。安装
2。1Dockerfile
2。1。1基础镜像
福哥选择的是php:7。4fpmbuster这个基础镜像,这个就是FastCGI方式的。
https:hub。docker。comphptags?page1name7。4fpmbuster
2。1。2维护者信息
这是福哥写的维护者信息。forMAINTAINERMAINTAINERAuthor:AndyBogateMAINTAINEREmail:tongfutongfu。netMAINTAINERHomepage:https:tongfu。netMAINTAINERDatetime:20230318MAINTAINERVersion:v1。0
2。1。3暴露端口
提供服务的端口通常情况下是80和443,我们把它们暴露出来。forEXPOSEEXPOSE80443
2。1。4主目录
福哥设置镜像的主目录是tongfu。netweb。forWORKDIRWORKDIRtongfu。netweb
2。1。5安装工具
后面的制作过程需要用到wget工具,这个需要通过aptget安装一下。
因为镜像本身只有一个FPM服务,所以这个Nginx服务我们得通过aptget安装。
因为后面要是ps命令检测服务健康状态,所以还需要安装procps服务。installwgetRUNaptgetupdateaptgetyinstallwgetvimnginxprocpsRUNaptgetyinstalllibwebpdevlibjpegdevlibpngdevlibfreetype6devRUNaptgetyinstalllibzipdevRUNaptgetyinstalllibcclientdevlibkrb5devRUNaptgetyinstalllibxml2dev
2。1。6释放PHP源码
这个php:7。4fpmbuster包含了PHP的源码,因为后面需要使用PHP源码安装PHP扩展,所以先要释放PHP源码。extractPHPsourceRUNdockerphpsourceextract
2。1。7GD图形库扩展
GD图形库可以让我们通过PHP直接加工各种图片文件,这个库可以用来实现图片验证码、照片加工等等功能的。gdextensionRUNdockerphpextconfiguregdwithjpegusrincludewithfreetypeusrincludedockerphpextinstallgddockerphpextenablegd
2。1。8MySQL扩展
福哥是使用PDO来连接MySQL数据库,而MySQL的PDO库PHP资源包里包含了,只要安装起来就行了。extensionofmysqliforMySQLRUNdockerphpextinstallmysqlidockerphpextenablemysqliextensionofPDOforMySQLRUNdockerphpextinstallpdomysqldockerphpextenablepdomysql
2。1。9Memcached扩展
memcached库需要从PECL下载,福哥选择的是3。1。5版本,这里直接通过phpize编译后就可以通过make安装了。memcached库依赖libmemcached库,福哥选择的是1。0。18版本,尽量不要改避免版本冲突extensionofMemcachedRUNwgethttps:launchpad。netlibmemcached1。01。0。18downloadlibmemcached1。0。18。tar。gzwgethttp:pecl。php。netgetmemcached3。1。5。tgztarxzvflibmemcached1。0。18。tar。gzcdlibmemcached1。0。18sedisoptserversfalse!optserversgclientsmemflush。cc。configuremakemakeinstallcd。。rmflibmemcached1。0。18。tar。gzrmrflibmemcached1。0。18tarxzvfmemcached3。1。5。tgzcdmemcached3。1。5usrlocalbinphpize。configurewithphpconfigusrlocalbinphpconfigdisablememcachedsaslmakemakeinstallcd。。rmfmemcached3。1。5。tgzrmrfmemcached3。1。5dockerphpextenablememcached
2。1。10Redis扩展
redis库需要从PECL下载,福哥选择的是4。1。0版本,这里直接通过phpize编译后就可以通过make安装了。extensionofRedisRUNwgethttp:pecl。php。netgetredis4。1。0。tgztarxzvfredis4。1。0。tgzcdredis4。1。0usrlocalbinphpize。configurewithphpconfigusrlocalbinphpconfigmakemakeinstalldockerphpextenablerediscd。。rmfredis4。1。0。tgzrmrfredis4。1。0
2。1。11MongoDB扩展
MongoDB库需要从PECL下载,福哥选择的是1。7。4版本,这里直接通过phpize编译后就可以通过make安装了。extensionofMongoDBRUNwgethttp:pecl。php。netgetmongodb1。7。4。tgztarxzvfmongodb1。7。4。tgzcdmongodb1。7。4usrlocalbinphpize。configurewithphpconfigusrlocalbinphpconfigmakemakeinstalldockerphpextenablemongodbcd。。rmfmongodb1。7。4。tgzrmrfmongodb1。7。4
2。1。12其他扩展
除了前面安装的几个扩展之外,福哥还安装了imap、zlib、soap、bcmath这些扩展,建议大家也把这些安装上。imapextensionRUNdockerphpextconfigureimapwithkerberoswithimapssldockerphpextinstallimapdockerphpextenableimapzlibextensionRUNmvusrsrcphpextzlibconfig0。m4usrsrcphpextzlibconfig。m4dockerphpextinstallzlibdockerphpextenablezlibsoapextensionRUNdockerphpextinstallsoapdockerphpextenablesoapbcmathextensionRUNdockerphpextinstallbcmathdockerphpextenablebcmath
2。1。13清理PHP源码
现在PHP的扩展都按照好了,已经不需要源码了,清理掉吧。sourcedeleteRUNdockerphpsourcedelete
2。2多进程
福哥今天制作的镜像是基于FastCGI方式运行的,这里面有Nginx和FPM两个服务,也就是说使用这个镜像启动的容器里面就会运行两个进程。但是按照Docker的设计思想一个容器里只能跑一个进程,怎么办?
其实按PHP的FastCGI方式的设计,应该是启动两个容器共同处理用户的请求。静态内容由Nginx容器负责处理,PHP程序由FPM容器负责处理。
但是福哥不想弄那么麻烦,就想把Nginx服务和FPM服务放在一起!要实现这个目的,就需要修改镜像的ENTRYPOINT,一个ENTRYPOINT只能运行一个进程。为了解决这个问题,福哥要自定义这个ENTRYPOINT,用ENTRYPOINT启动一个Shell脚本,在Shell脚本里面同时启动Nginx和FPM服务。
下面是福哥写的一个ENTRYPOINT启动Shell脚本startservice,用来同时启动Nginx和FPM服务。!binshargvfunctionsfunctionmain{startfpmusrlocalsbinphpfpmDstartnginxusrsbinnginxwaitsecssleep6sservicewhile〔1〕;doif〔psefgrepvgrepgrepphpfpm:masterprocess〕;thenechophpisdownexit1fiif〔psefgrepvgrepgrepnginx:masterprocess〕;thenechonginxisdownexit2fisleep6sdone}mainmain
在创建新的镜像的时候把startservice配置文件拷贝进去,并且授权可执行权限,最后将ENTRYPOINT的命令改成startservice。entrypointCOPYstartserviceusrsbinstartserviceRUNchmodxusrsbinstartserviceENTRYPOINT〔usrsbinstartservice,〕
2。3php配置文件
2。3。1php。ini
php。ini的存放目录是usrlocaletcphp,镜像提供了phpinidevelopment、php。iniproduction两个配置文件模板,我们可以根据使用场景选择开发版本还是生产版本。
2。4nginx配置文件
2。4。1模块配置
镜像安装的nginx包括modulesavailable和modulesenabled两个模块配置目录,modulesavailable里面包含全部的可用模块配置文件,modulesenabled里面是启用的模块配置文件。
要启用模块就从modulesavailable选择模块配置文件移动到modulesenabled下面。
要停用模块就从modulesenabled选择模块配置文件移动回modulesavailable下面。
2。4。2站点配置
镜像安装的nginx包括sitesavailable和sitesenabled两个站点配置目录,sitesavailable里面包含全部的可用站点配置文件,sitesenabled里面是启用的站点配置文件。
要启用站点就从sitesavailable选择站点配置文件建立符号链接到sitesenabled下面。
要停用站点就将sitesenabled下面删除站点配置文件的符号链接。
福哥在默认站点的server里面利用rewrite实现了一个PHP的伪静态重定向配置,可以将各种html请求转交给htmlRouteMap。php处理。
如果要修改配置文件就需要先启动一个容器,然后把需要修改的配置文件复制出来一份,在外面改好了在通过COPY命令导入进去。
下面是福哥修改过的默认站点default配置文件的内容,因为默认文件里面有大篇幅说明太长了,福哥就给去掉了。server{listen80defaultserver;listen〔::〕:80defaultserver;servername;rewrite(。)。htmlhtmlRouteMap。php?tfphpstaticname1;location{rootvarwwwhtml;}location。phpnbsp;{clientbodybuffersize1m;rootvarwwwhtml;fastcgipasslocalhost:9000;fastcgiindexindex。php;fastcgiparamSCRIPTFILENAMEdocumentrootfastcgiscriptname;includefastcgiparams;}}
在创建新的镜像的时候把default配置文件拷贝进去。nginxsitesCOPYdefaultetcnginxsitesenableddefault
2。5创建镜像
使用下面的命令创建tfphp:7。4nginx1。0。0镜像。dockerbuildfDockerfiletregistry。tongfu。net:5000tfphp:7。4nginx1。0。0。
2。6查看镜像
看看新的镜像,现在有apache版本、nginx版本两个tfphp的镜像了。dockerimagesgreptfphp
3。测试
3。1宿主机程序目录
在宿主机建立一个用来存放php程序的目录,它将被映射到容器的nginx主目录上面。mkdirptongfu。netdatadockerdatatfphphtml
3。2宿主机程序文件
在刚刚建立的目录下面建立一个php程序文件index。php,写入下面的代码。lt;?phpphpinfo();
再建立一个php程序文件htmlRouteMap。php,写入下面的代码。lt;?phpvardump(GET〔tfphpstaticname〕。。html);
3。3删除容器
因为前面我们使用apache版本的tfphp启动了一个容器了,现在要测试nginx版本的tfphp就需要先把这个tfphp容器删除掉。dockerrmftfphp
3。4启动容器
使用下面的命令基于tfphp:7。4nginx1。0。0镜像启动一个容器,将80端口和443端口映射到宿主机上面,将varwwwhtml这个nginx主目录映射到前面建立的目录上面。dockerruntidnametfphphtfphpp80:80p443:443vtongfu。netdatadockerdatatfphphtml:varwwwhtmlregistry。tongfu。net:5000tfphp:7。4nginx1。0。0
3。5浏览器访问
打开浏览器访问http:192。168。168。68index。php,可以看到PHP系统信息。
可以看到ServerAPI一栏的信息是FPMFastCGI,证明我们的这个运行环境是FastCGI模式的。
输入网址http:192。168。168。68tongfu。netdockertfphp。html,可以看到请求html资源路径被htmlRouteMap。php打印出来了。
4。总结
今天福哥在TFCentOS7x64服务器上面通过Dockerfile创建了一个镜像tfphp:7。4nginx1。0。0,并且通过这个新创建的镜像tfphp:7。4nginx1。0。0启动了一个容器,这个镜像用来运行基于PHP语言开发的应用程序。
后面福哥会在这个镜像tfphp:7。4nginx1。0。0基础之上进行二次扩展制作新的镜像,然后根据镜像的用途针对nginx和php进行自定义的配置,敬请期待
https:m。tongfu。nethome35blog513983。html