apache(docker)+dnmp (Docker + Nginx+ MySQL5,8 + PHP5,7,8 + Redis + ElasticSearc) 部署测试详细过程

前期准备

一、本地安装

二、apache安装

注:如果服务器新服务器可以直接用宝塔安装,避免走很多坑
由于服务通过宝塔已经安装nginx,不能于安装apache,所以使用docker安装apache

1. docker 安装apache命令

1)拉取镜像

docker pull httpd

2)创建临时容器

docker run -id --name http-test -p 80:80 httpd

3)创建目录(目录位置根据自己情况去创建)

mkdir -p /home-data-disk/www/wwwroot /home-data-disk/docker/apache/logs /home-data-disk/docker/apache/conf/myconf

wwwroot 目录将映射为apache容器配置的应用程序目录
logs 目录将映射为apache容器的日志目录
conf 目录里的配置文件将映射为apache容器的配置文件
myconf 方便存放自己的配置,后期改apache的配置要用

4)拷贝容器内Apache 默认配置文件到本地当前目录下的 conf 目录,并删除临时容器,主要用它的配置文件

docker ps -a  //查看容器id
docker cp [容器ID]:/usr/local/apache2/conf/httpd.conf /home-data-disk/docker/apache/conf
docker rm -f [容器ID]

5)创建自己真正要用的容器

sudo lsof -i :8080 #查看端口是否被占用

docker run -p 8080:80 --name apache-my --network dnmp_dnmp --ip 192.168.0.21 -v /home-data-disk/www/wwwroot/:/www/ -v /home-data-disk/docker/apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v /home-data-disk/docker/apache/conf/myconf/:/usr/local/apache2/conf/myconf/ -v /home-data-disk/docker/apache/logs:/usr/local/apache2/logs/ -d httpd

8080:80 宿主机端口:容器端口
apache-my 容器名字
dnmp_dnmp 自定义的网络段192.168.0.0/24(安装dnmp环境是创建的)
192.168.0.21 自定义网络的ip(方便各容器互通)
-v 宿主机目录:容器目录 (目录映射)
-d httpd 镜像名

  1. 修改配置文件(大致要修改的地方)
ServerName 0.0.0.0:80

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule rewrite_module modules/mod_rewrite.so
<Directory />
    AllowOverride All
    Require all denied
</Directory>

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride All
    Options None
    Require all granted
</Directory>

TraceEnable off
IncludeOptional /usr/local/apache2/conf/myconf/*.conf

IncludeOptional /usr/local/apache2/conf/myconf/*.conf 这个是之前提到要用的目录(每个网站的不同的配置)

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot "/www/enlightv"
    ServerName 428a707d.177.177.177.177
    ServerAlias 177.177.177.177
    #errorDocument 404 /404.html


    #DENY FILES
     <Files ~ (\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)$>
       Order allow,deny
       Deny from all
    </Files>

    #PHP
    <FilesMatch \.php$>
      
            SetHandler "proxy:fcgi://192.168.0.10:9000"
    </FilesMatch>


    #PATH
    <Directory "/www/enlightv">
        SetOutputFilter DEFLATE
        Options FollowSymLinks
        AllowOverride All
        Require all granted
        DirectoryIndex index.php index.html index.htm default.php default.html default.htm
    </Directory>
</VirtualHost>

配置好后将上面文件放到myconf目录下,文件名 177.177.177.177.conf

  1. 每次改完配置重启apache
docker restart apache-my

三、dnmp安装

1.配置文件需要修改部分

  • .env文件(一些扩展,账号密码根据自己情况设置)
SOURCE_DIR=/home-data-disk/www #apache应用程序目录要与php应用程序目录一致
  • docker-compose.yml文件
php:
    build:
      context: ./services/php
      args:
        PHP_VERSION: php:${PHP_VERSION}-fpm-alpine
        CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
        PHP_EXTENSIONS: ${PHP_EXTENSIONS}
        TZ: "$TZ"
    container_name: php
    expose:
      - 9501
    extra_hosts:
      - "www.site1.com:172.17.0.1"
    volumes:
      - ${SOURCE_DIR}:/www/:rw #注意要改的地方,根据自己情况有可能需要修改
      - ${PHP_PHP_CONF_FILE}:/usr/local/etc/php/php.ini:ro
      - ${PHP_FPM_CONF_FILE}:/usr/local/etc/php-fpm.d/www.conf:rw
      - ${PHP_LOG_DIR}:/var/log/php
      - ${DATA_DIR}/composer:/tmp/composer
    restart: always
    cap_add:
      - SYS_PTRACE
    networks:
    #   - default
      # 可以把-default 改成下列配置,以固定容器IP
      dnmp:
        ipv4_address: 192.168.0.10
        
  mysql:
    image: mysql/mysql-server:${MYSQL_VERSION}
    container_name: mysql
    ports:
      - "${MYSQL_HOST_PORT}:3306"
    volumes:
      - ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
      - ${MYSQL_CONF_FILE_MY}:/etc/my.cnf:ro
      - ${DATA_DIR}/mysql:/var/lib/mysql/:rw
      - ${MYSQL_LOG_DIR}:/var/log/mysql/:rw

    restart: always
    networks:
    #   - default
          #   - default
      # 可以把-default 改成下列配置,以固定容器IP
      dnmp:
        ipv4_address: 192.168.0.11
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_ROOT_HOST: "${MYSQL_ROOT_HOST}"
      TZ: "$TZ"
      
networks:
  dnmp:
    driver: bridge
    ipam:
    #   driver: default
      # 解除下面的注释可以设置网段,用于nginx等容器固定容器IP
      config:
        - subnet: 192.168.0.0/24

2.dnmp安装使用

具体安装使用参考官方文档即可(上述有链接)

3.插件安装

1)rabbitmq安装rabbitmq_delayed_message_exchange延时队列插件
  1. 根据自己mq版本下载自己对应插件版本,网址https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

我rabbitmq版本是v3.12.4,下载的插件版本是v3.12.0

  1. 将下载好的插件传到服务器(/dnmp/services/rabbitmq)目录,并复制到rabbitmq容器
cd /dnmp/services/rabbitmq
#复制命令
docker cp rabbitmq_delayed_message_exchange-3.12.0.ez rabbitmq:/opt/rabbitmq/plugins
  1. 进入容器,可以查看到此插件
docker exec -it rabbitmq bash
cd /opt/rabbitmq/plugins
ls
  1. 安装消息管理插件(dnmp集成环境默认装了,可以忽略此步骤,可以从/dnmp/services/rabbitmq/dockerfile文件看到)
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
  1. 查看插件
rabbitmq-plugins list
  1. 启动插件并重启容器
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
exit
docker-compose restart rabbitmq
  1. 可以看到如下,安装成功了

在这里插入图片描述

三、报错处理

  1. STORAGE_WRITE_ERROR:./Application/Runtime/Cache/Home/2a94b8bda04ff446dcedd42276fc99ee.php
chmod -R 777 Runtime/   #为缓存文件加权限

2.1055:Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column

  1. 修改mysql配置

由于mysql8使用的真正配置文件是:mysql容器文件位置 /etc/my.cnf,而写官方只把mysql.cnf映射出来了,无论你怎么修改mysql.cnf配置文件都没反应,
先将my.cnf文件复制出来docker cp [容器ID]:/etc/my.cnf /home-data-disk/dnmp/services/mysql

  • 修改.dnmp下.env配置文件
#
# MySQL8
#
MYSQL_VERSION=8.0.28
MYSQL_HOST_PORT=13306
MYSQL_ROOT_PASSWORD=f6GbSLJWhR8GPi76
MYSQL_ROOT_HOST=%
MYSQL_CONF_FILE=./services/mysql/mysql.cnf
MYSQL_CONF_FILE_MY=./services/mysql/my.cnf  #改动部分
MYSQL_LOG_DIR=./logs/mysql
  • 修改dnmp下 docker-compose.yml
  mysql:
    image: mysql/mysql-server:${MYSQL_VERSION}
    container_name: mysql
    ports:
      - "${MYSQL_HOST_PORT}:3306"
    volumes:
      - ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
      - ${MYSQL_CONF_FILE_MY}:/etc/my.cnf:ro #改动部分
      - ${DATA_DIR}/mysql:/var/lib/mysql/:rw
      - ${MYSQL_LOG_DIR}:/var/log/mysql/:rw

    restart: always
    networks:
    #   - default
          #   - default
      # 可以把-default 改成下列配置,以固定容器IP
      dnmp:
        ipv4_address: 192.168.0.11
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_ROOT_HOST: "${MYSQL_ROOT_HOST}"
      TZ: "$TZ"
  • 重新构建mysql
docker-compose up -d mysql
  • 修改dnmp/services/mysql下my.cnf文件
!includedir /etc/mysql/conf.d  #末尾加上这条语句

  • 接下来再修改mysql.cnf配置文件,然后重启容器,mysql就能读到了

注意:一定要给/home-data-disk/dnmp/logs/mysql 目录下文件读写权限
命令: chmod -R 666 /dnmp/logs/mysql
上面这个命令将mysql目录(文件夹)权限也改成666,还要将其改回755:chmod 755 /dnmp/logs/mysql
其中,/dnmp/logs/mysql 是目标目录的路径。使用-R选项表示递归地修改目录及其子内容的权限。

[client]
port                    = 3306
default-character-set   = utf8mb4


[mysqld]
user                    = mysql
port                    = 3306
sql_mode                = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #主要加入这条

default-storage-engine  = InnoDB
default-authentication-plugin   = mysql_native_password
character-set-server    = utf8mb4
collation-server        = utf8mb4_unicode_ci
init_connect            = 'SET NAMES utf8mb4'

disable-log-bin
skip-character-set-client-handshake
explicit_defaults_for_timestamp

slow_query_log
long_query_time         = 3
slow-query-log-file     = /var/log/mysql/mysql.slow.log #上面注意提到的读写权限,相当于给容器内这个文件加的
log-error               = /var/log/mysql/mysql.error.log #上面注意提到的读写权限,相当于给容器内这个文件加的

default-time-zone       = '+8:00'


[mysql]
default-character-set   = utf8mb4

3.宿主机运行 php容器->php脚本

docker exec php php /www/wwwroot/项目目录/index.php admin/My/getNode 一直没成功执行,
于是在宿主机执行(非项目入口目录)php /www/wwwroot/project/index.php admin/My/getNode
报错:PHP Warning: require(./ThinkPHP/ThinkPHP.php): failed to open stream: No such file or directory in /www/wwwroot/project/index.php on line 52

<?php

// 应用入口文件
chdir(__DIR__); #入口文件加入此行代码

// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';

四、扩展

  1. 宿主机执行php脚本文件
#先生成一个容器(使用$PWD 要在项目根目录下执行)
docker run --interactive --tty --network=dnmp_dnmp --volume $PWD:/www:rw --workdir /www --name my_php_script --ip 192.168.0.33 dnmp-php
#进入文件
vim .bashrc //在根目录下
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

#不需要先创建容器,每次调用这个函数的时候,都会自动生成 (--rm 容器停止后自动删除)
phpp () {
    tty=
    tty -s && tty=--tty
    docker run \
        $tty \
        --interactive \
        --rm \
        --network=dnmp_dnmp \
        --volume $PWD:/www:rw \
        --workdir /www \
        dnmp-php php "$@"
}

#进入文件加入以下函数 (可以在宿主机任何位置直接运行该项目下php脚本)
php7 () {
    tty=
    tty -s && tty=--tty
    docker exec $tty my_php_script php "$@"
}

#创建好后 运行php脚本
php7 index.php /admin/test/test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值