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 项目特点,在 yeszaoDNMP 项目基础上新增:

推荐阅读

目录结构

├── .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

Docker+Nginx+MySQL+PHP (xhprof、tideways)+xhgui,PHPer 的一键安装式终极 debug 开发环境

在要分析项目 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,此时已经有了内容,愉快的查看项目的性能追踪及分析吧

Docker+Nginx+MySQL+PHP (xhprof、tideways)+xhgui,PHPer 的一键安装式终极 debug 开发环境

Docker+Nginx+MySQL+PHP (xhprof、tideways)+xhgui,PHPer 的一键安装式终极 debug 开发环境

PHP 和扩展

切换 Nginx 使用的 PHP 版本

默认同时创建 PHP5.6PHP7.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

数据库管理

参考链接

License

MIT

No practice, no gain in one's wit.
我的 Gitub

本帖由系统于 3周前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 19
whichzhen

刚想找一个,就看到你的了, 试试看

3周前 评论

SF也看到相同的帖子,是楼主么

3周前 评论

@whichzhen 嗯,可以试试看,除了基本的环境外,我还添加了 xhgui、xhprof、tideways 性能分析工具。

3周前 评论

@DargonBo 嗯,我在 SF 也发了 :smile:

3周前 评论
wenqingzzz

这里直接composer install 好像使用的是我本机的php。并没有安装扩展,所以一直报错。

1周前 评论

@wenqingzzz 嗯对,composer 建议使用宿主机的

1周前 评论
wenqingzzz

@guanguans 如果是宿主机,那么如何使用docker里面的php呢?mac自带的有一个php5.3的

1周前 评论
wenqingzzz

我安装了一下,其它都是可以的。就是composer这里不知道怎么处理了

1周前 评论

@wenqingzzz composer 用宿主机的,和平常使用一样的。

1周前 评论
wenqingzzz

我是用mysql',如何连接navicate这样的客户端呢?

1周前 评论
wenqingzzz (作者) 1周前
draven

太牛逼了 :+1:

4天前 评论

xhgui.test网址访问不通是哪里的问题,日志也没有。只有localhost能访问的通

1天前 评论

@DongXin hosts 配置了没有?日志在 log 目录下

22小时前 评论
j475523225

问下这个在负载均衡的情况下怎么分析性能 :see_no_evil:

21小时前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!