使用Docker快速搭建Nginx+PHP-FPM+MySQL+phpMyAdmin环境
一、概述
环境介绍
操作系统:centos 7.6
docker版本:19.03.8
ip地址:192.168.31.34
本文将介绍如何使用单机部署Nginx+PHP-FPM环境
二、Nginx+PHP-FPM
拉取镜像
docker pull gaciaga/nginx-vts:latest
docker pull crunchgeek/php-fpm:7.3-r7
说明:
nginx镜像已经加装了vts模块,php镜像是最新版本。
php-fpm安装的模块如下:
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
运行镜像
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目录
cd /opt/
docker cp nginx-vts:/etc/nginx/conf.d/default.conf .
修改配置文件
vi default.conf
内容如下:
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;
#}
}
说明:
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放入此目录。
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
docker cp default.conf nginx-vts:/etc/nginx/conf.d/default.conf
docker exec -it nginx-vts nginx -s reload
访问页面
http://192.168.31.34/status
效果如下:

修改php-fpm配置文件
复制www.conf,并修改status路径。注意:这里必须和nginx设置的保持一致。
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进程
# 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 重启
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状态页面
http://192.168.31.34/fpm_status
效果如下:

测试php文件
在/opt目录新建一个test.php
vi /opt/test.php
内容如下
<?php
phpinfo();
?>
拷贝test.php到容器目录
docker cp test.php php-fpm:/var/www/html/test.php
访问页面
http://192.168.31.34/test.php
效果如下;

三、MySQL
直接运行dockerhub里面的mysql5.7镜像
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开发的。
下载代码
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
修改配置
cd /opt/phpMyAdmin-5.0.2-all-languages
cp config.sample.inc.php config.inc.php
vi config.inc.php
将
$cfg['Servers'][$i]['host'] = 'localhost';
改为
$cfg['Servers'][$i]['host'] = '192.168.31.34';
拷贝phpMyAdmin到容器中
这里需要在nginx容器里面开放一个81端口,用来访问phpmyadmin,需要删除nginx容器,重新运行。
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
docker exec -it nginx-vts mkdir -p /var/www/html
复制代码到php容器中
docker cp phpMyAdmin-5.0.2-all-languages nginx-vts:/var/www/html/
编辑nginx配置
cd /opt/
vi phpmyadmin.conf
内容如下:
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容器,并重新加载
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
http://192.168.31.34:81
效果如下:

输入用户名:root
密码:abcd@1234
登录之后,效果如下:

总结
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容器。
使用Docker快速搭建Nginx+PHP-FPM+MySQL+phpMyAdmin环境的更多相关文章
- 使用docker快速搭建nginx+php环境
在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...
- 使用Docker快速搭建Nginx+PHP-FPM环境
下载nginx官方镜像和php-fpm镜像 docker pull nginx docker pull bitnami/php-fpm 使用php-fpm镜像开启php-fpm应用容器 docker ...
- linux下搭建nginx+php(FastCGI)+mysql运行环境
一.安装环境 1.CentOS5.5 2.php5.4 3.MySQL5.5.19 二.安装程序依赖库和开发环境 为了省事把所需要的库文件全都安装上,可以使用rpm包安装,也可以用yum命令安装, 1 ...
- ubuntu13.04 搭建 Nginx + PHP + PHP-FPM + Mysql (lnmp) 环境
Nginx 是一个轻量级,以占用系统资源少,运行效率而成为web服务器的后起之秀,国内现在很多大型网站都以使用nginx,包括腾讯.新浪等大型信息网站,还有淘宝网站使用的是nginx二次开发的web服 ...
- 五分钟用Docker快速搭建Go开发环境
挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...
- 一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Docker 快速搭建 MySQL 5.6 开发环境
使用 Docker 快速搭建一个 MySQL 5.6 开发环境 步骤 获取镜像 docker pull mysql:5.6 启动容器,密码 123456,映射 3306 端口 docker run - ...
- spring boot / cloud (十八) 使用docker快速搭建本地环境
spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...
- Docker Data Center系列(一)- 快速搭建云原生架构的实践环境
本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...
随机推荐
- 彻底记住看起来很高级的__pycache__与__name__
参考了的博客:https://blog.csdn.net/yitiaodashu/article/details/79023987 https://blog.csdn.net/ipi715718/ar ...
- 自定义 ocelot 中间件输出自定义错误信息
自定义 ocelot 中间件输出自定义错误信息 Intro ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候 ...
- B 等差素数列
B 等差素数列:2,3,5,7,11,13,....是素数序列.类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列.上边的数列公差为30,长度为6.2004年,格 ...
- B - B Saruman's Army(贪心)
在一条直线上,有n个点.从这n个点中选择若干个,给他们加上标记.对于每一个点,其距离为R以内的区域里必须有一个被标记的点.问至少要有多少点被加上标记 Saruman the White must le ...
- Codeforces Round #652 (Div. 2) E. DeadLee(贪心)
题目链接:https://codeforces.com/contest/1369/problem/E 题意 Lee 有 $n$ 种不同种类的食物和 $m$ 个朋友,每种食物有 $w_i$ 个,每个朋友 ...
- Java多线程同步和异步问题
我们首先来说一下多线程: 多线程很形象的例子就是:在一个时刻下,一个班级的学生有人在拖地,有人在擦窗户,有人在擦桌子 按照单线程程序,肯定是先去拖地,再去擦窗户,再去擦桌子.但是在多线程就好像他们在一 ...
- hdu3436 Queue-jumpers(Splay)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- 2019牛客多校 Round2
Solved:2 Rank:136 A Eddy Walker 题意:T个场景 每个场景是一个长度为n的环 从0开始 每次要么向前走要么向后走 求恰好第一次到m点且其他点都到过的概率 每次的答案是前缀 ...
- HihoCoder - 1110
题意: 您的任务是判断输入是否是合法的正则表达式.正则表达式定义如下: 1: 0和1都是正则表达式. 2:如果P和Q是正则表达式,那么PQ就是正则表达式. 3:如果P是正则表达式,(P)就是正则表达式 ...
- Codeforces Round #646 (Div. 2) C. Game On Leaves (贪心,博弈)
题意:给你一棵树,每次可以去掉叶节点的一条边,Ayush先开始,每回合轮流来,问谁可以第一个把\(x\)点去掉. 题解:首先如果\(x\)的入度为\(1\),就可以直接拿掉,还需要特判一下入度为\(0 ...