前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Docker快速搭建Nginx+PHP-FPM+MySQL+phpMyAdmin环境

使用Docker快速搭建Nginx+PHP-FPM+MySQL+phpMyAdmin环境

作者头像
py3study
发布2020-05-26 09:57:51
2.6K0
发布2020-05-26 09:57:51
举报
文章被收录于专栏:python3python3

一、概述

环境介绍

操作系统:centos 7.6

docker版本:19.03.8

ip地址:192.168.31.34

本文将介绍如何使用单机部署Nginx+PHP-FPM环境

二、Nginx+PHP-FPM

拉取镜像

代码语言:javascript
复制
docker pull gaciaga/nginx-vts:latest
docker pull crunchgeek/php-fpm:7.3-r7

说明:

nginx镜像已经加装了vts模块,php镜像是最新版本。

php-fpm安装的模块如下:

代码语言:javascript
复制
apc
apcu
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
ds
enchant
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
igbinary
imagick
imap
interbase
intl
json
ldap
libxml
mbstring
memcache
memcached
mongodb
msgpack
mysqli
mysqlnd
newrelic
openssl
pcntl
pcre
PDO
pdo_dblib
pdo_mysql
pdo_pgsql
pdo_sqlite
pdo_sqlsrv
pgsql
Phar
posix
pspell
readline
recode
redis
Reflection
session
shmop
SimpleXML
soap
sockets
sodium
SPL
sqlite3
ssh2
standard
sysvmsg
sysvsem
sysvshm
test
tidy
tokenizer
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib

运行镜像

代码语言:javascript
复制
docker run -d -it --restart=always --name nginx-vts -p 80:80 gaciaga/nginx-vts:latest
docker run -d -it --restart=always --name php-fpm -p 9000:9000 crunchgeek/php-fpm:7.3-r7

修改nginx配置文件

复制配置文件,这里先临时放到/opt目录

代码语言:javascript
复制
cd /opt/
docker cp nginx-vts:/etc/nginx/conf.d/default.conf .

修改配置文件

代码语言:javascript
复制
vi default.conf

内容如下:

代码语言:javascript
复制
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    location /status {
        vhost_traffic_status_display;
        vhost_traffic_status_display_format html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   192.168.31.34:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }
    location ~ ^/(fpm_status|health)$ {
        fastcgi_pass 192.168.31.34:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

说明:

代码语言:javascript
复制
location ~ \.php$ {
        fastcgi_pass   192.168.31.34:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }

这段配置是用来设置php文件访问的。

注意:

fastcgi_pass 地址为:主机ip+9000。因为在上面的步骤中,我已经把端口映射出来了。

fastcgi_param 表示php脚本运行的目录,这里的路径,是php-fpm里面的路径,不是nginx容器路径。因为nginx和php-fpm在2个不同的容器中。

php-fpm容器,默认已经创建了/var/www/html/目录。此目录时空的,稍后我会将test.php放入此目录。

代码语言:javascript
复制
    location ~ ^/(fpm_status|health)$ {
        fastcgi_pass 192.168.31.34:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

这里是用来查看php-fpm的状态页面的。

这里定义的fpm_status和health,表示访问php-fpm对应的路径。在php-fpm里面的www.conf中,路径必须一致,后面会介绍修改www.conf文件。

fastcgi_param 这里就不需要写绝对路径了,它会自动找到对应的脚本。

覆盖容器配置文件,并重载nginx

代码语言:javascript
复制
docker cp default.conf nginx-vts:/etc/nginx/conf.d/default.conf
docker exec -it nginx-vts nginx -s reload

访问页面

代码语言:javascript
复制
http://192.168.31.34/status

效果如下:

1.png
1.png

修改php-fpm配置文件

复制www.conf,并修改status路径。注意:这里必须和nginx设置的保持一致。

代码语言:javascript
复制
docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf .
sed -i '238c pm.status_path = /fpm_status' www.conf
docker cp www.conf php-fpm:/usr/local/etc/php-fpm.d/www.conf

注意:这里的sed命令表示覆盖238行的内容。 

查看php-fpm进程

代码语言:javascript
复制
# docker exec -it  php-fpm ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  1.9 299256 37132 pts/0    Ss+  09:25   0:00 php-fpm: master
www-data    14  0.0  0.6 299416 12236 pts/0    S+   09:25   0:00 php-fpm: pool w
www-data    15  0.0  0.6 299416 12236 pts/0    S+   09:25   0:00 php-fpm: pool w
root        23  0.0  0.0  10620  1416 pts/1    Rs+  09:38   0:00 ps -aux

php-fpm 重启

代码语言:javascript
复制
docker exec -it  php-fpm kill -USR2 1

php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /Data/apps/php7/sbin/php-fpm(start|stop|reload)等命令,所以不要再看这种老掉牙的命令了,需要使用信号控制:master进程可以理解以下信号

访问php-fpm状态页面

代码语言:javascript
复制
http://192.168.31.34/fpm_status

效果如下:

1.png
1.png

测试php文件

在/opt目录新建一个test.php

代码语言:javascript
复制
vi /opt/test.php

内容如下

代码语言:javascript
复制
<?php
   phpinfo();
?>

拷贝test.php到容器目录

代码语言:javascript
复制
docker cp test.php php-fpm:/var/www/html/test.php

访问页面

代码语言:javascript
复制
http://192.168.31.34/test.php

效果如下;

1.png
1.png

三、MySQL

直接运行dockerhub里面的mysql5.7镜像

代码语言:javascript
复制
mkdir -p /data/mysql/data

docker run -d --name mysql5.7 --restart=always -e MYSQL_ROOT_PASSWORD=abcd@1234  -p 3306:3306 -v /data/mysql/data:/var/lib/mysql mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

四、phpMyAdmin

为了验证LNMP环境,使用phpMyAdmin来演示一下,它是用php开发的。

下载代码

代码语言:javascript
复制
cd /opt/
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip
unzip phpMyAdmin-5.0.2-all-languages.zip

修改配置

代码语言:javascript
复制
cd /opt/phpMyAdmin-5.0.2-all-languages
cp config.sample.inc.php config.inc.php
vi config.inc.php

代码语言:javascript
复制
$cfg['Servers'][$i]['host'] = 'localhost';

改为

代码语言:javascript
复制
$cfg['Servers'][$i]['host'] = '192.168.31.34';

拷贝phpMyAdmin到容器中

这里需要在nginx容器里面开放一个81端口,用来访问phpmyadmin,需要删除nginx容器,重新运行。

代码语言:javascript
复制
docker rm -f nginx-vts
docker run -d -it --restart=always --name nginx-vts -p 80:80 -p 81:81 gaciaga/nginx-vts:latest

复制代码到nginx容器中

为了和php容器目录一致,先创建目录,再copy

代码语言:javascript
复制
docker cp phpmyadmin.conf nginx-vts:/etc/nginx/conf.d/
docker exec -it nginx-vts mkdir -p  /var/www/html

复制代码到php容器中

代码语言:javascript
复制
docker cp phpMyAdmin-5.0.2-all-languages nginx-vts:/var/www/html/

编辑nginx配置

代码语言:javascript
复制
cd /opt/
vi phpmyadmin.conf

内容如下:

代码语言:javascript
复制
server {
    listen       81;
    server_name  localhost;
    root   /var/www/html/phpMyAdmin-5.0.2-all-languages;
    index  index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass   192.168.31.34:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/phpMyAdmin-5.0.2-all-languages/$fastcgi_script_name;
        include        fastcgi_params;
    }
}

复制配置文件到nginx容器,并重新加载

代码语言:javascript
复制
docker cp default.conf nginx-vts:/etc/nginx/conf.d/
docker cp phpmyadmin.conf nginx-vts:/etc/nginx/conf.d/
docker exec -it nginx-vts nginx -s reload

访问phpMyAdmin

代码语言:javascript
复制
http://192.168.31.34:81

效果如下:

1.png
1.png

输入用户名:root

密码:abcd@1234

登录之后,效果如下:

1.png
1.png

总结

nginx和php都是独立运行的docker容器。因此,对于php代码,必须在php容器中映射才行。至于nginx容器,也最好做一下映射。

但是一般php项目,除了php代码之外,还有一些静态资源,比如:html,css,js,jpeg,png等等。

所以,最好是2个容器都做一下映射。nginx负责处理静态资源,php容器用了解析php代码。

注意:nginx配置中的fastcgi_param 必须写绝对路径。

最后补充一点,php-fpm有一个进程池的概念。类型有2种,分别是static和dynamic。

虽然dynamic可以节约服务器资源,但是对于pv流量比较大的情况下,需要频繁的回收php-fpm进程池,特别耗费CPU

因此,在大并发情况下,使用static。

如果将php项目运行在k8s中,可以将php容器运行多个副本,nginx通过k8s的cluster ip转发到php容器。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • 环境介绍
    • 二、Nginx+PHP-FPM
      • 拉取镜像
        • 运行镜像
          • 修改nginx配置文件
            • 修改php-fpm配置文件
              • 测试php文件
              • 三、MySQL
              • 四、phpMyAdmin
                • 下载代码
                  • 修改配置
                    • 拷贝phpMyAdmin到容器中
                      • 编辑nginx配置
                        • 访问phpMyAdmin
                          • 总结
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档