请开启 JavaScript
快速配置PHP8.4 + Nginx1.27 + MySQL9.4 环境 – 老迟笔记

快速配置PHP8.4 + Nginx1.27 + MySQL9.4 环境

一、前置配置

1、创建docker容器之间的通信网络
docker network create --driver bridge haveyb
2、创建相关映射目录
在宿主机创建相关开发代码的映射目录,按编程语言分类,好管理
mkdir -p ~/Desktop/code/{php,go,python,java,c}
在宿主机创建php相关配置文件映射目录
mkdir -p ~/Desktop/code/docker/php
在宿主机创建nginx相关配置文件和密钥相关映射目录
mkdir -p ~/Desktop/code/docker/nginx/{conf.d,cert,logs}

 

二、配置PHP环境

1、拉取PHP镜像
docker pull haveyb/php

该镜像是我以php官方php-fpm:8.4.12为基础,添加了一些常用扩展,yar、redis、swoole、pdo_mysql、gd、pcntl、sockets、igbinary、msgpack、zstd、pdo_pgsql、xsl、zip、bcmath、sysvmsg、sysvsem、sysvshm,为debian apt设置了默认阿里国内镜像源,添加了composer为当前最新稳定版本2.8.11,并为composer也配置了阿里国内镜像源。

2、创建PHP容器
创建临时php容器
docker run -itd --name temp-php haveyb/php bash
拷贝临时php容器内的php.ini到宿主机
docker cp temp-php:/usr/local/etc/php/php.ini ~/Desktop/code/docker/php
删除临时php容器
docker rm -f temp-php
创建正式php容器
docker run -itd --name php --privileged \
-p 9000:9000 -p 9501:9501 \
-v ~/Desktop/code:/data \
-v ~/Desktop/code/docker/php/php.ini:/usr/local/etc/php/php.ini \
--network=haveyb \
haveyb/php

 

三、配置Nginx环境

1、拉取openresty镜像【lua加强版Nginx,几乎和Nginx最新稳定版保持一致,已经是非常成熟的项目了】
docker pull openresty/openresty
2、创建测试站点配置文件
cd ~/Desktop/code/docker/nginx/conf.d

创建gg.conf,内容如下:

server {
    listen 80;
    server_name gg;
    root /data/php/test;
    index index.php index.html;

    # 安全头配置
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # 限制上传文件大小
    client_max_body_size 10M;

    # 静态资源处理
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
        try_files $uri =404;
    }

    # PHP脚本处理
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTP_HOST $host;
        fastcgi_param PHP_VALUE "date.timezone=Asia/Shanghai";
        include fastcgi_params;
    }

    # 伪静态支持
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # 日志配置
    access_log /var/log/nginx/gg_access.log;
    error_log /var/log/nginx/gg_error.log;
}
3、创建Nginx容器
创建临时nginx容器
docker run -itd --name temp-nginx openresty/openresty bash
拷贝临时nginx容器内的nginx.conf到宿主机
docker cp temp-nginx:/usr/local/openresty/nginx/conf/nginx.conf ~/Desktop/code/docker/nginx
删除临时nginx容器
docker rm -f temp-nginx
创建正式nginx容器
docker run -itd --name nginx --privileged \
-p 80:80 -p 443:443 \
-v ~/Desktop/code:/data \
-v ~/Desktop/code/docker/nginx/conf.d:/etc/nginx/conf.d \
-v ~/Desktop/code/docker/nginx/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf \
-v ~/Desktop/code/docker/nginx/cert:/usr/local/openresty/nginx/cert \
-v ~/Desktop/code/docker/nginx/logs:/var/log/nginx \
--network=haveyb \
openresty/openresty
4、注意事项
(1)本地宿主机修改nginx或php配置文件后,如何加载?

宿主机执行:

docker restart nginx
docker restart php

或者进入相应容器内执行:

nginx -s reload
php-fpm -s reload
(2)需要特别谨慎的点

由于目录映射的特性,如果宿主机的某个文件或目录与容器内的某个文件或目录通过-v进行了映射,那么在容器内对映射了的文件或目录进行删除,宿主机的文件或目录也会相应被删除。

因此为了安全起见,所有通过-v指定映射了的文件或目录,如果要执行删除操作,一定要宿主机执行,因为宿主机是可视化界面,误删的概率要小很多。

 

四、配置MySQL环境

1、进入宿主机待映射文件夹
cd ~/Desktop/code/docker
2、创建具体的映射文件夹
mkdir -p mysqldata/{data,logs,conf,pems,conf.d}
3、自定义 my.cnf 文件
cd ~/Desktop/code/docker/mysqldata/conf
vi my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
4、拉取官方 MySQL9.4镜像
docker pull mysql:9.4
5、创建容器
docker run -itd --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v ~/Desktop/code/docker/mysqldata/data:/var/lib/mysql \
-v ~/Desktop/code/docker/mysqldata/logs:/var/log/mysql \
-v ~/Desktop/code/docker/mysqldata/conf:/etc/mysql \
-v ~/Desktop/code/docker/mysqldata/conf.d:/etc/mysql/conf.d \
-v ~/Desktop/code/docker/mysqldata/pems:/etc/mysql/pems \
--restart unless-stopped \
--network=haveyb \
mysql:9.4
6、测试MySQL连接

用navicat连接时,直接用127.0.0.1,端口号3306,用户名root,密码123456连接即可

如果在php文件中连接MySQL,host写MySQL容器的容器名称,在这里就是 mysql

 

五、测试

1、增加宿主机对gg域名的本地解析

编辑本地hosts文件

vi /etc/hosts

添加下面代码

127.0.0.1           gg
2、编辑php测试文件
vi ~/Desktop/code/php/test/index.php

内容如下:

<?php
echo "<h1>PHP 环境测试</h1>";
echo "PHP 版本: " . phpversion() . "<br>";

// 测试MySQL连接
$servername = "mysql";
$username = "root";
$password = "123456";

try {
    $conn = new PDO("mysql:host=$servername;charset=utf8mb4", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "MySQL 连接成功: " . $conn->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
} catch(PDOException $e) {
    echo "MySQL 连接失败: " . $e->getMessage();
}

访问http://gg/,如果有phpinfo输出,说明LNMP环境配置成功

预期输出结果:

PHP 环境测试
PHP 版本: 8.4.12
MySQL 连接成功: 9.4.0