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年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 44

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论
wenqingzzz

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

1年前 评论

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

1年前 评论
wenqingzzz

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

1年前 评论
wenqingzzz

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

1年前 评论
djw215 3个月前

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

1年前 评论
wenqingzzz

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

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

太牛逼了 :+1:

1年前 评论

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

1年前 评论

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

1年前 评论
j475523225

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

1年前 评论
j475523225

遇到tideways_enable() 未定义 求解

1年前 评论

tideways 扩展有没有装?

1年前 评论
j475523225 1年前
Aolinver

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

1年前 评论
小李世界

给大佬点个赞 :+1:

1年前 评论

推荐 laradock

1年前 评论

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

不過回報一下在 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

    謝謝

11个月前 评论

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

11个月前 评论

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

11个月前 评论

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

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

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

11个月前 评论

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

9个月前 评论

支持大佬~~正在安装中

9个月前 评论

@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
3个月前 评论

@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

3个月前 评论

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name does not resolve

1周前 评论

php7.2版本的GD扩展未生效,查看phpinfo确实没有。排查php.ini已经开启了,这个确实分析不出来什么原因。 file

6天前 评论

@xylileihuo

安装 gd 扩展的话需要配置 env 文件

#################### PHP7.2 ####################
PHP72_EXTENSIONS=pdo_mysql,opcache,redis,xdebug,mongodb,tideways,gd # 这里配置一下,重新构建
5天前 评论

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