Docker 的 LNMP 一键安装开发环境 + PHP 非侵入式监控平台 xhgui (优化系统性能、定位 Bug)
DNMP PLUS
dnmp = Docker
+ Nginx
+ MySQL
+ PHP
+ Redis
+ MongDB
plus = xhgui
+ xhprof
+ tideways
dnmp-plus = PHPer 的一键安装开发环境
+ PHP 非侵入式监控平台(优化系统性能、定位 Bug 的神器)
DNMP PLUS 项目特点,在 yeszao 的 DNMP 项目基础上新增:
- PHP xhprof 扩展 - Facebook 开发的 PHP 性能追踪及分析工具
- PHP tideways 扩展 - xhprof 的分支,支持 PHP7
- PHP mongodb 扩展
- MongoDB 服务
- Mongo Express - MongoDB 服务管理系统
- xhgui - XHProf 分析数据数据的 GUI 系统
推荐阅读
- dnmp-plus PHPer 的一键安装式终极 debug 开发环境
- dnmp-plus 一键安装式环境详细安装与使用
- 超全的设计模式简介(45种)
- design-patterns-for-humans 中文版
- MongoDB 资源、库、工具、应用程序精选列表中文版
- 有哪些鲜为人知,但是很有意思的网站?
- 一份攻城狮笔记
- 每天搜集 Github 上优秀的项目
- 一些有趣的民间故事
- 超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集
目录结构
├── .github Github 配置目录
├── conf 配置文件目录
│ ├── conf.d Nginx 用户站点配置目录
│ ├── mysql.cnf MySQL 用户配置文件
│ ├── nginx.conf Nginx 默认配置文件
│ ├── php-fpm.conf PHP-FPM 配置文件
│ ├── php.ini PHP 配置文件
│ ├── redis.conf Redis 配置文件
├── docs 文档目录
├── extensions PHP 扩展源码包
├── log 日志目录
├── mongo MongoDB 数据目录
├── mysql MySQL 数据目录
├── www PHP 代码目录
├── Dockerfile PHP 镜像构建文件
├── docker-compose-sample.yml Docker 服务配置示例文件
├── env.smaple 环境配置示例文件
└── travis-build.sh Travis CI 构建文件
环境要求
- Docker
- Docker-compose
- Git
快速使用
$ git clone https://github.com/guanguans/dnmp-plus.git --recursive
$ cd dnmp-plus
$ cp env.sample .env
$ cp docker-compose-sample.yml docker-compose.yml
$ docker-compose up -d
默认 web 根目录 www/localhost/
,浏览器访问 http://localhost
基本使用
lnmp-plus 自带 nginx、php72、php56、mysql、mongo、redis、phpmyadmin、phpredisadmin、mongo-express 这些镜像服务
# 创建并且启动容器
$ docker-compose up 服务1 服务2 ...
# 创建并且启动所有容器
$ docker-compose up
# 创建并且已后台运行的方式启动容器
$ docker-compose up -d 服务1 服务2 ...
# 启动服务
$ docker-compose start 服务1 服务2 ...
# 停止服务
$ docker-compose stop 服务1 服务2 ...
# 重启服务
$ docker-compose restart 服务1 服务2 ...
# 构建或者重新构建服务
$ docker-compose build 服务1 服务2 ...
# 进入命令行容器
$ docker-compose exec 服务 bash
# 删除并且停止容器
$ docker-compose rm 服务1 服务2 ...
# 停止并删除容器,网络,图像和挂载卷
$ docker-compose down 服务1 服务2 ...
xhgui 使用,可以参考 https://github.com/guanguans/guanguans.git...
安装
$ cd www/xhgui-branch
$ composer install
修改 xhgui-branch 配置文件 www/xhgui-branch/config/config.default.php
<?php
return array(
...
'debug' => true, // 改为true,便于调试
'mode' => 'development',
...
'extension' => 'tideways', // 改为支持 PHP7 的 tideways
...
'save.handler' => 'mongodb',
'db.host' => 'mongodb://mongo:27017', // 127.0.0.1 改为 mongo
...
);
hosts 文件中增加
127.0.0.1 xhgui.test
浏览器访问 http://xhgui.test
在要分析项目 nginx 配置文件中修改,以默认的 localhost 配置 conf/conf.d/localhost.conf
为例
...
location ~ \.php$ {
fastcgi_pass php72:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 在执行主程序之前运行我们指定的PHP脚本
fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/html/xhgui-branch/external/header.php";
}
...
重启 nginx
$ docker-compose restart nginx
浏览器访问 http://localhost,再访问 http://xhgui.test,此时已经有了内容,愉快的查看项目的性能追踪及分析吧
PHP 和扩展
切换 Nginx 使用的 PHP 版本
默认同时创建 PHP5.6
和 PHP7.2
2 个 PHP 版本的容器,切换 PHP 仅需修改相应站点 Nginx 配置的 fastcgi_pass
选项,例如,示例的 http://localhost 用的是 PHP7.2,Nginx 配置:
fastcgi_pass php72:9000;
要改用 PHP5.6,修改为:
fastcgi_pass php56:9000;
重启 Nginx 生效
$ docker-compose restart nginx
安装 PHP 扩展
PHP 的很多功能都是通过扩展实现,而安装扩展是一个略费时间的过程,
所以,除 PHP 内置扩展外,在 env.sample
文件中我们仅默认安装少量扩展,
如果要安装更多扩展,请打开你的 .env
文件修改如下的 PHP 配置,
增加需要的 PHP 扩展:
PHP72_EXTENSIONS=pdo_mysql,opcache,redis,xdebug,mongodb,tideways
PHP56_EXTENSIONS=opcache,redis,xdebug,mongodb,xhprof
然后重新构建 PHP 镜像
docker-compose build php72
docker-compose up -d
使用 Log
Log 文件生成的位置依赖于 conf 下各 log 配置的值。
Nginx 日志
Nginx 日志是我们用得最多的日志,所以我们单独放在根目录 log
下。log
会目录映射 Nginx 容器的 /var/log/nginx
目录,所以在 Nginx 配置文件中,需要输出 log 的位置,我们需要配置到 /var/log/nginx
目录,如:
error_log /var/log/nginx/nginx.localhost.error.log warn;
MySQL 日志
因为 MySQL 容器中的 MySQL 使用的是 mysql
用户启动,它无法自行在 /var/log
下的增加日志文件。所以,我们把 MySQL 的日志放在与 data 一样的目录,即项目的mysql
目录下,对应容器中的 /var/lib/mysql/
目录。
mysql.conf 中的日志文件的配置:
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
数据库管理
- 默认 phpMyAdmin 地址:http://localhost:8080
- 默认 phpRedisAdmin 地址:http://localhost:8081
- 默认 Mongo Express 地址:http://localhost:8082
参考链接
License
本作品采用《CC 协议》,转载必须注明作者和本文链接
给力
@win 谢谢鼓励🙏
刚想找一个,就看到你的了, 试试看
SF也看到相同的帖子,是楼主么
@whichzhen 嗯,可以试试看,除了基本的环境外,我还添加了 xhgui、xhprof、tideways 性能分析工具。
@DargonBo 嗯,我在 SF 也发了 :smile:
棒棒哒
@Alex_lcl :yum:
这里直接composer install 好像使用的是我本机的php。并没有安装扩展,所以一直报错。
@wenqingzzz 嗯对,composer 建议使用宿主机的
@guanguans 如果是宿主机,那么如何使用docker里面的php呢?mac自带的有一个php5.3的
我安装了一下,其它都是可以的。就是composer这里不知道怎么处理了
@wenqingzzz composer 用宿主机的,和平常使用一样的。
我是用mysql',如何连接navicate这样的客户端呢?
@wenqingzzz 嗯,那就好。
太牛逼了 :+1:
xhgui.test网址访问不通是哪里的问题,日志也没有。只有localhost能访问的通
@DongXin
hosts
配置了没有?日志在log
目录下问下这个在负载均衡的情况下怎么分析性能 :see_no_evil:
@draven :smile:
遇到tideways_enable() 未定义 求解
tideways
扩展有没有装?这太棒了,我自己做的没精力搞了,用这个! :smiley:
mark
给大佬点个赞 :+1:
推荐 laradock
@Aolinver 拿去用 :smiley:
@likunyan :smile:
@liaosp :smile:
首先感謝分享好用的工具~
不過回報一下在 Windows 10 docker 中,MongoDB 啟動時會有 volume 掛載權限問題
解決方式:需要另外掛額外的 volume
https://github.com/BarryYan/blog/issues/1
謝謝
@danielhuang030 谢谢反馈
环境中项目怎么连接数据库呢
@BigCola 注意主机地址 host 值为 mysql,而不是127.0.0.1,其他的和普通的一样。
error: 'mongodb' does not exist是什么原因,源地址换下吗
@kunshouzhidou 可以多贴一点错误信息吗
MongoDB服务器版本:No suitable servers found (
serverSelectionTryOnce
set): [Failed to resolve 'mongo'] 这个错误该如何处理啊支持大佬~~正在安装中
@guanguans
@wenqingzzz
@djw215 这是因为宿主机 php 没有安 mogodb 扩展,你可以给宿主机的 php 装下 mongodb 扩展
也可以在容器内安装
@guanguans 谢谢楼主,基本安装成功了,在这里总结一下坑吧: 1.这种warning可以忽略,不影响 WARNING: Ignoring APKINDEX.b3d2069c.tar.gz: No such file or directory WARNING: Ignoring APKINDEX.8d865ef8.tar.gz: No such file or directory 2.默认php56扩展是有xhprof,但是我装了几次一直报:
然后php56安装就报错,直接退出了 后面的也不会安装成功,所以我就把那个扩展给去了,反正基本上现在也一直是用php7了
3.在一个就是composer install的问题:
上面楼主也就说的很明确了,
a.宿主机(本机)安装,前提是你本地有php composer,但是如果是mac,他自带php,如果你的php没有mongodb会报错,需要你安装mongodb扩展
b.进入容器内,安装composer,用容器内的composer install
4.docker-compose exec php72 bash 这类的命令要在项目根目录执行
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve
php7.2版本的GD扩展未生效,查看phpinfo确实没有。排查php.ini已经开启了,这个确实分析不出来什么原因。
@xylileihuo
安装
gd
扩展的话需要配置env
文件如果我换一台服务器,是不是又得运行一次,docker-compose,但是我的容器已经改动过了怎么办。