当前位置: 首页 > news >正文

10分钟快速部署PHP+Nginx+MySQL+Redis开发环境

一、准备工作

概述

本教程旨在快速部署PHP+Nginx+MySQL+Redis开发环境,其中版本分别是PHP8.4、Nginx1.27、MySQL9.4、Redis8.2。

全部采用docker化部署,优点在于想要升级或降级环境,只要将当前容器停掉,再重新拉一个相应版本的镜像,重新创建容器并指定映射目录即可,非常便捷。若有兴趣,你可以自行探索或者给我评论留言。

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、注意事项

本地宿主机修改nginx或php配置文件后,如何加载?

宿主机执行:
docker restart nginx
docker restart php
或者进入相应容器内执行:
nginx -s reload
php-fpm -s reload
需要特别谨慎的点:

由于目录映射的特性,如果宿主机的某个文件或目录与容器内的某个文件或目录通过-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

五、配置Redis环境

1、拉取redis镜像

docker pull redis:8.2

2、创建本地映射文件夹

mkdir -p ~/Desktop/code/docker/redis/data/logs
touch ~/Desktop/code/docker/redis/data/logs/notice.log

3、新建redis.conf文件

cd ~/Desktop/code/docker/redis
vi redis.conf
# 设置允许所有ip来连接
bind 0.0.0.0# 设置端口号
port 6379# 密码
requirepass 123456# 保护模式开关,开启时仅允许本地连接或认证连接
protected-mode yes# 设置日志级别
loglevel notice# 日志地址
logfile /data/logs/notice.log# 设置最大内存容量为256MB
maxmemory 256MB# 内存淘汰策略:从所有键中淘汰最近最少使用的键,最适合缓存场景
maxmemory-policy allkeys-lru# TCP保活探测间隔(秒),用于检测无效连接
tcp-keepalive 300# 是否以守护进程方式启动,docker需要配置为no
daemonize no# 持久化设置
dir /data# RDB 持久化配置(文件会存放在 /data/dump.rdb)
dbfilename dump.rdb
save 900 1# AOF 持久化配置(文件会存放在 /data/appendonly.aof)
appendonly yes
# AOF文件存储路径
appendfilename appendonly.aof
# AOF 刷盘策略(每秒刷盘,推荐)
appendfsync everysec
#加载由于某些原因导致的末尾异常的AOF文件(主进程被kill/断电等)
aof-load-truncated yes# 开启RDB-AOF混合持久化格式
aof-use-rdb-preamble yes# 当Aof log增长超过指定百分比例时,重写AOF文件
auto-aof-rewrite-percentage 100
# AOF 重写的最小文件大小(避免小文件频繁重写)
auto-aof-rewrite-min-size 64mb# 客户端空闲超时时间(秒),0表示永不超时
timeout 0# PID文件路径,记录Redis进程ID(仅守护进程模式有效)
pidfile /var/run/redis_6379.pid# 可用数据库的数量,默认16个(编号0-15)
databases 16# 超过此值的命令会被记录到慢查询日志(微妙,10000微妙=10毫秒=0.01秒,正常命令执行时间通常在1毫秒以内,简单的 GET/SET 甚至只需微秒级)
slowlog-log-slower-than 10000# 慢查询日志的最大存储条数,超过此条数,新日志会覆盖最旧的日志(FIFO队列 First-In-First-Out Queue,先进先出队列)
slowlog-max-len 128

注:获取redis8.2默认配置,可通过访问 https://raw.githubusercontent.com/redis/redis/8.2/redis.conf 获取

4、创建redis容器

docker run -itd --name redis -p 6379:6379 \-v ~/Desktop/code/docker/redis/redis.conf:/etc/redis/redis.conf \-v ~/Desktop/code/docker/redis/data:/data \--network=haveyb \redis:8.2 \redis-server /etc/redis/redis.conf

六、测试

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><br>";// 测试MySQL连接
echo "<h2>MySQL 连接测试</h2>";
$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();
}echo "<br><br>";// 测试Redis连接
echo "<h2>Redis 连接测试</h2>";
$redisHost = "redis";
$redisPort = 6379;
$redisPassword = "123456";// 检查Redis扩展是否安装
if (!class_exists('Redis')) {echo "Redis 扩展未安装,请先安装 Redis 扩展";
} else {$redis = new Redis();try {// 连接Redis服务器$connectResult = $redis->connect($redisHost, $redisPort);if (!$connectResult) {throw new Exception("无法连接到Redis服务器");}// 使用ACL用户名和密码进行认证// 注意:Redis 6.0+ 支持用户名+密码认证,旧版本仅支持密码$authResult = $redis->auth($redisPassword);if (!$authResult) {throw new Exception("Redis 认证失败,用户名或密码错误");}// 执行一个简单命令测试连接$redis->set("test_key", "php_redis_test");$testValue = $redis->get("test_key");if ($testValue === "php_redis_test") {echo "Redis 连接成功,且可以正常执行命令<br>";echo "Redis 服务器版本: " . $redis->info()['redis_version'];} else {throw new Exception("Redis 命令执行失败");}} catch (Exception $e) {echo "Redis 连接失败: " . $e->getMessage();} finally {// 关闭连接if (isset($redis) && $redis->isConnected()) {$redis->close();}}
}echo "<br><br>";
phpinfo();

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

预期输出结果:
PHP 环境测试
PHP 版本: 8.4.12MySQL 连接测试
MySQL 连接成功: 9.4.0Redis 连接测试
Redis 连接成功,且可以正常执行命令
Redis 服务器版本: 8.2.1

原文链接:10分钟快速部署PHP+Nginx+MySQL+Redis开发环境

http://www.dtcms.com/a/398317.html

相关文章:

  • 通过智享直播,企业如何实现精准的受众定位与内容分发
  • 【Prompt学习技能树地图】零样本与少样本提示技术实战:原理、应用与调优
  • group_points自定义tensorrt算子编写
  • 20250925问答课题-多标签分类模型
  • 唯品会库存API集成问题与技术方案解析
  • Python开发一个系统
  • 02-教务管理系统(选课管理系统)
  • 从入门到精通:逆向工程完全工具指南与桌面环境搭建
  • 注册网站做推广衡阳网站搜索引擎优化
  • 从零开始学Flink:数据转换的艺术
  • 公司做网站的流程wordpress 放大镜插件
  • 《系统与软件工程 功能规模测量 NESMA方法》(GBT 42588-2023)标准解读
  • React Testing完全指南:Jest、React Testing Library实战
  • python+springboot+django/flask的医院食堂订餐系统 菜单发布 在线订餐 餐品管理与订单统计系统
  • 半导体制造常见检测之拉曼光谱
  • Python 第七节 循环语句for和while使用详解及注意事项
  • 怎么把svg做网站背景谷歌关键词挖掘工具
  • Vue3中的computed属性
  • 7. 临时变量的常量性
  • SNK施努卡有色冶炼自动化解决方案
  • SpringCloud项目阶段七:延迟任务技术选项对比以及接入redis实现延迟队列添加/取消/消费等任务
  • 建站特别慢wordpress网站项目总体设计模板
  • 驱动开发,为什么需要映射?
  • 网站栏目模版确定网站推广目标
  • AI产品经理项目实战:BERT语义分析识别重复信息
  • 亚远景-ISO 42001:为汽车AI安全设定新标杆
  • 电路方案分析(二十四)汽车高压互锁参考设计
  • 深圳网站快速备案手机app播放器
  • CSS精灵技术
  • 数据库导论#1