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

本作品采用《CC 协议》,转载必须注明作者和本文链接

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

本帖由系统于 1年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 41

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论
wenqingzzz

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

11个月前 评论

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

11个月前 评论
wenqingzzz

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

11个月前 评论
wenqingzzz

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

11个月前 评论
djw215 1个月前

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

11个月前 评论
wenqingzzz

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

11个月前 评论
wenqingzzz (作者) 11个月前
draven

太牛逼了 :+1:

11个月前 评论

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

11个月前 评论

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

11个月前 评论
j475523225

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

11个月前 评论
j475523225

遇到tideways_enable() 未定义 求解

11个月前 评论

tideways 扩展有没有装?

11个月前 评论
j475523225 11个月前
Aolinver

这太棒了,我自己做的没精力搞了,用这个! :smiley:

10个月前 评论
小李世界

给大佬点个赞 :+1:

9个月前 评论

推荐 laradock

9个月前 评论

首先感謝分享好用的工具~

不過回報一下在 Windows 10 docker 中,MongoDB 啟動時會有 volume 掛載權限問題

mongo_1          | 2019-09-27T08:09:50.585+0000 E  STORAGE  [initandlisten] WiredTiger error (17) [1569571790:585383][1:0x7f4021a2db00], connection: __posix_open_file, 712: /data/db/WiredTiger.wt: handle-open: open: File exists Raw: [1569571790:585383][1:0x7f4021a2db00], connection: __posix_open_file, 712: /data/db/WiredTiger.wt: handle-open: open: File exists
mongo_1          | 2019-09-27T08:09:50.588+0000 I  STORAGE  [initandlisten] WiredTiger message unexpected file WiredTiger.wt found, renamed to WiredTiger.wt.24
mongo_1          | 2019-09-27T08:09:50.589+0000 E  STORAGE  [initandlisten] WiredTiger error (1) [1569571790:589705][1:0x7f4021a2db00], connection: __posix_open_file, 712: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted Raw: [1569571790:589705][1:0x7f4021a2db00], connection: __posix_open_file, 712: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted

解決方式:需要另外掛額外的 volume
https://github.com/BarryYan/blog/issues/1

  1. 先手動建立 volume
    docker volume create --name=mongodata
  2. 修改 docker-compose.yml
    mongo:
    #...
    volumes:
      - mongodata:/data/db:rw
    #...
    volumes:
    mongodata:
    external: true

    謝謝

9个月前 评论

环境中项目怎么连接数据库呢

9个月前 评论

@BigCola 注意主机地址 host 值为 mysql,而不是127.0.0.1,其他的和普通的一样。

9个月前 评论

error: 'mongodb' does not exist是什么原因,源地址换下吗

8个月前 评论
kunshouzhidou (作者) 8个月前

@kunshouzhidou 可以多贴一点错误信息吗

8个月前 评论

MongoDB服务器版本:No suitable servers found (serverSelectionTryOnce set): [Failed to resolve 'mongo'] 这个错误该如何处理啊

6个月前 评论

支持大佬~~正在安装中

6个月前 评论

@djw215 这是因为宿主机 php 没有安 mogodb 扩展,你可以给宿主机的 php 装下 mongodb 扩展

也可以在容器内安装

docker-compose exec php72  bash
cd xhgui-branch/
wget https://github.com/composer/composer/releases/download/1.10.6/composer.phar
chmod +x composer.phar 
./composer.phar install
1个月前 评论

@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,但是我装了几次一直报: file 然后php56安装就报错,直接退出了 后面的也不会安装成功,所以我就把那个扩展给去了,反正基本上现在也一直是用php7了 3.在一个就是composer install的问题: 上面楼主也就说的很明确了, a.宿主机(本机)安装,前提是你本地有php composer,但是如果是mac,他自带php,如果你的php没有mongodb会报错,需要你安装mongodb扩展

      # pecl 安装
      pecl install mongodb
      cd ./www/xhgui-branch/
      composer install

b.进入容器内,安装composer,用容器内的composer install

        docker-compose exec php72  bash
        cd xhgui-branch/
       wget https://github.com/composer/composer/releases/download/1.10.6/composer.phar
       chmod +x composer.phar 
        ./composer.phar install

4.docker-compose exec php72 bash 这类的命令要在项目根目录执行 file

1个月前 评论

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