Skip to content
LNMP docker production environment
Dockerfile PHP Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
conf
log
mysql
nginx
node
php
redis
www/site
.gitignore
README.md
docker-compose-build.yml
docker-compose-dev.yml
docker-compose.yml
env-example

README.md

LNMP(Docker + Nginx + MySQL + PHP7/5 + Redis)PHP统一开发环境

1.项目结构

目录说明:

    \
    ├── conf                                配置文件目录
    │   ├── mysql                           
    │   │   ├── my5.7.cnf                   mysql5.7配置文件
    │   │   └── my8.0.cnf                   mysql8.0配置文件
    │   ├── nginx                           
    │   │   ├── conf.d                      nginx用户站点配置目录
    │   │   │   ├── certs                   ssl证书配置目录
    │   │   │   ├── site1.conf              默认演示站点
    │   │   │   ├── site2.conf              https默认演示站点
    │   │   │   └── upstream.conf           fastcgi_pass配置文件
    │   │   └── nginx.conf                  nginx默认配置文件
    │   ├── php
    │   │   ├── php-fpm.d                   php配置目录
    │   │   │   ├── www.conf                php-fpm默认配置文件
    │   │   │   └── zz-docker.conf          fastcgi_pass 监听配置文件 unix socket / tcp socket
    │   │   └── php.ini                     php默认配置
    │   └── redis           
    │       └── redis.conf                  redis默认配置
    ├── log                                 日志文件
    │   ├── mysql
    │   ├── nginx
    │   ├── php-fpm
    │   └── redis
    ├── mysql                               
    │   └── Dockerfile                      mysql镜像构建文件
    ├── nginx                               
    │   └── Dockerfile                      nginx镜像构建文件
    ├── node                    
    │   ├── Dockerfile                      node镜像构建文件
    │   ├── laravel-echo-server
    │   │   └── laravel-echo-server.json    支持 laravel echo server
    │   └── package.json
    ├── php
    │   ├── Dockerfile                      php镜像构建文件
    │   ├── php-queue
    │   │   └── Dockerfile                  php-queue镜像构建文件
    │   └── php-xdebug
    │       └── Dockerfile                  php镜像构建文件 含xdebug 开发环境使用
    ├── redis
    │   └── Dockerfile                      redis镜像构建文件
    ├── www                                 项目源码目录
    │   └── site                            默认演示文件
    │       └── index.php
    ├── data                                数据存放目录
    ├── docker-compose-dev.yml              开发环境
    ├── docker-compose.yml                  生成环境
    ├── env-example                         环境变量文件
    └── README.md                           说明文档

2. 快速使用

  1. 本地安装gitdockerdocker-compose
  2. clone项目:
    $ git clone git@github.com:thinksvip/lnmp.git
  1. 如果不是root用户,还需将当前用户加入docker用户组:
    $ sudo gpasswd -a ${USER} docker
  1. 启动:
    $ cd lnmp
    $ cp env-example .env
    $ docker-compose up
  1. 访问在浏览器中访问:

两个站点使用同一PHP代码:./www/site/index.php

3. 切换PHP版本?

默认情况下,我们启用php72版本的容器,

切换PHP版本仅需修改.env 配置的PHP_FPM_VERSION选项,

例如,示例的localhost用的是PHP7.2,.env 配置:

    PHP_FPM_VERSION=7.2

要改用PHP5.6,修改为:

    PHP_FPM_VERSION=5.6

终止LNMP 重新启动 LNMP 生效。

    $ docker-compose down
    $ docker-compose up 

4. 添加快捷命令

在开发的时候,我们可能经常使用docker exec -it切换到容器中,把常用的做成命令别名是个省事的方法。

打开~/.bashrc,加上:

    alias dnginx='docker exec -it nginx /bin/sh'
    alias dphp='docker exec -it php sh'
    alias dmysql='docker exec -it mysql /bin/bash'
    alias dredis='docker exec -it redis /bin/bash'
    alias dqueue='docker exec -it queue sh'
    alias dnode='docker exec -it node sh'       

5. 使用Log

Log文件生成的位置依赖于conf下各log配置的值。

5.1 Nginx日志

Nginx日志是我们用得最多的日志,所以我们单独放在根目录log下。

log会目录映射Nginx容器的/var/log/nginx目录,所以在Nginx配置文件中,需要输出log的位置,我们需要配置到/var/log/nginx目录,如:

    error_log  /var/log/nginx/nginx.localhost.error.log  warn;

5.1 PHP-FPM日志

大部分情况下,PHP-FPM的日志都会输出到Nginx的日志中,所以不需要额外配置。

如果确实需要,可按一下步骤开启。

  1. 在主机中创建日志文件并修改权限:
    $ touch log/php-fpm/php-fpm.error.log
    $ chmod a+w log/php-fpm.error.log
  1. 主机上打开并修改PHP-FPM的配置文件conf/www.conf,找到如下一行,删除注释,并改值为:
    php_admin_value[error_log] = /var/log/php-fpm/php-fpm.error.log
  1. 重启PHP-FPM容器。

5.2 MySQL日志

因为MySQL容器中的MySQL使用的是mysql用户启动,它无法自行在/var/log下的增加日志文件。在启动容器组后给/var/log/mysql/文件夹更所有者为mysql。更改文件夹所有者后重启mysql容器。

    $ docker exec mysql chown mysql:root /var/log/mysql
    $ docker-compose restart mysql

重启完成后在./log/mysql/会生成mysql-slow.log日志文件。

6. 使用composer

lnmp默认已经在容器中安装了composer,使用时先进入容器:

    $ docker exec -it php sh

然后进入相应目录,使用composer:

    $ cd /var/www/html/
    $ composer install

因为composer依赖于PHP,所以,是必须在容器里面操作composer的。

7. 使用opcache

注意opcache已开启,配置默认不查询 更改 如发布新版本需重启php-fpm

    $ docker-compose restart php

如需关闭 修改./conf/php/php.iniopcache.enable=1的值为0

    opcache.enable=0

opcache具体配置需查看./conf/php/php.ini[opcache]

8. 使用queue

设置项目路径

    $ sed -i 's/APP_CODE_PATH=/APP_CODE_PATH=Your project name/g' .env

查看调度输出

    $ docker-compose logs queue

9. 使用xdebug

默认情况下,我们已经dev环境安装了Xdebug的扩展,但并未在php.ini文件中配置启用。要使用Xdebug的调试,在./conf/php/php.ini的文件最后这几行将注释取消:

    [XDebug]
    xdebug.enable = on
    xdebug.remote_enable = on
    xdebug.remote_connect_back = on
    xdebug.idekey = "PHPSTORM"
    xdebug.remote_autostart = on
    xdebug.remote_handler = "dbgp"
    xdebug.remote_host = "192.168.31.210"
    xdebug.remote_port = "9001"
    xdebug.remote_log = "/var/log/php-fpm/xdebug_remote.log"

然后重启PHP容器。

    $ docker-compose restart php

10. 在正式环境中安全使用

要在正式环境中使用,请:

  1. 在php.ini中关闭XDebug调试
  2. 增强MySQL数据库访问的安全策略
  3. 增强redis访问的安全策略

常见问题

  1. 遇到“No releases available for package "pecl.php.net/redis”

    请参考: https://github.com/yeszao/dnmp/issues/10

说明:这个问题主要是受国内网络环境影响,现在PHP7以上的版本直接采用从源码安装扩展,所以这个问题已经没有了。

  1. PHP5.6错误“ibfreetype6-dev : Depends: zlib1g-dev but it is not going to be installed or libz-dev”

    请参考: https://github.com/yeszao/dnmp/issues/39

  2. mysql日志文件授权为何不在Dockerfile中使用RUN 命令直接授权。因为DockerfileVOLUME指令之后的任何内容都无法对该卷进行更改。我们的镜像是基于官方镜像搭建,官方镜像在构建时使用过VOLUME指令。

    请参考: https://container-solutions.com/understanding-volumes-docker/

  3. 项目权限问题

    进入php容器 docker-compose exec php sh

    授权 chown -R www-data:www-data /var/www/html

搭建参考

  1. https://github.com/yeszao/dnmp

  2. http://laradock.io/

License

MIT

You can’t perform that action at this time.