# Common Nginx + PHP-FPM Docker Image 这是一个通用的 Nginx + PHP-FPM Docker 镜像,支持外部配置文件覆盖。 ## 🔒 安全版本说明 提供两个版本供选择: ### Alpine版本 (推荐生产环境) - **镜像标签**: `common-nginx-fpm-alpine` - **基础镜像**: `php:8.4-fpm-alpine` - **安全状态**: ✅ 0个高危漏洞 - **镜像大小**: ~754MB - **推荐用途**: 生产环境、安全要求高的场景 ### Debian版本 (开发环境可选) - **镜像标签**: `common-nginx-fpm` - **基础镜像**: `php:8.4-fpm` - **安全状态**: ⚠️ 152个高危漏洞 - **镜像大小**: ~569MB - **推荐用途**: 开发环境、需要glibc兼容性的场景 > 📋 详细安全对比请查看 [SECURITY_REPORT.md](SECURITY_REPORT.md) ## 特性 - 基于官方 PHP 8.4 FPM 镜像 - 集成 Nginx 作为 Web 服务器 - 支持 PHP 文件动态处理和静态资源服务 - 预装常用 PHP 扩展(PDO MySQL, PDO PostgreSQL, PostgreSQL, MySQLi, OPcache) - 支持外部配置文件覆盖 - **端口重定向修复** - 支持任意端口映射 (如 `-p 8080:80`) - 使用 Supervisor 管理进程 - 包含健康检查端点 ## 快速开始 ### 构建镜像 ```bash # 构建Alpine版本 (推荐) docker build -t common-nginx-fpm-alpine . # 构建Debian版本 (需要修改Dockerfile第一行) # 将 FROM php:8.4-fpm-alpine 改为 FROM php:8.4-fpm docker build -t common-nginx-fpm . ``` ### 运行容器 ```bash # Alpine版本 - 基本运行 docker run -d -p 80:80 common-nginx-fpm-alpine # Alpine版本 - 挂载代码目录 docker run -d -p 80:80 -v /path/to/your/code:/var/www/html common-nginx-fpm-alpine # Alpine版本 - 安全运行 (推荐生产环境) docker run -d -p 80:80 \ --name web-app \ --read-only \ --tmpfs /tmp \ --tmpfs /var/run \ --memory=512m \ --cpus=1.0 \ -v /path/to/your/code:/var/www/html:ro \ -v /path/to/custom/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /path/to/custom/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro \ common-nginx-fpm-alpine # Debian版本 - 基本运行 docker run -d -p 80:80 common-nginx-fpm ``` ## 配置覆盖 ### Nginx 配置 - 默认配置:`/etc/nginx/nginx.conf` - 自定义配置:挂载到 `/etc/nginx/nginx.conf` 或 `/etc/nginx/conf.d/default.conf` ### PHP 配置 - 默认配置:`/usr/local/etc/php/php.ini` - 自定义配置:挂载到 `/usr/local/etc/php/conf.d/custom.ini` ### PHP-FPM 配置 - 默认配置:`/usr/local/etc/php-fpm.d/www.conf` - 自定义配置:挂载到 `/usr/local/etc/php-fpm.d/custom.conf` ## 目录结构 ``` /var/www/html/ # Web 根目录 /var/log/nginx/ # Nginx 日志 /var/log/php-fpm/ # PHP-FPM 日志 /var/lib/php/sessions/ # PHP 会话存储 ``` ## 端口 - `80`: HTTP 端口 ## 健康检查 访问 `http://localhost/health` 进行健康检查。 ## Docker Compose 使用 ### 🚀 一键启动 (推荐) 使用提供的启动脚本,一键配置和启动环境: ```bash # 启动开发环境 (端口8000) ./start.sh dev # 启动生产环境 (端口80) ./start.sh prod # 查看服务状态 ./start.sh status # 查看日志 ./start.sh logs # 停止服务 ./start.sh stop ``` ### 📋 手动配置 如果需要手动配置,请按以下步骤: 1. **复制环境变量文件** ```bash cp .env.example .env ``` 2. **编辑配置** (根据需要修改 `.env` 文件) ```bash # 基础配置 PROJECT_NAME=my-web-app WEB_PORT=80 CODE_PATH=./src # 数据库配置 MYSQL_PASSWORD=your_strong_password ``` 3. **启动服务** ```bash # 启动服务 docker-compose up -d # 查看日志 docker-compose logs -f ``` ### 环境配置 详细的环境变量配置请参考 `.env.example` 文件,主要包括: - **项目配置**: 项目名称、时区设置 - **Web服务**: 端口、代码路径 - **性能配置**: 内存和CPU限制 - **自定义配置**: 可选的配置文件覆盖 ## 环境变量 - `TZ`: 时区设置(默认:Asia/Shanghai) ## 安全注意事项 - 默认禁用了一些危险的 PHP 函数 - 设置了 open_basedir 限制 - 隐藏了敏感文件和目录 - 添加了安全响应头 ## 日志 - Nginx 访问日志:`/var/log/nginx/access.log` - Nginx 错误日志:`/var/log/nginx/error.log` - PHP-FPM 错误日志:`/var/log/php-fpm/www-error.log` - PHP-FPM 慢日志:`/var/log/php-fpm/slow.log` ## 使用示例 ### 开发环境设置 ```bash # 1. 克隆或创建项目 mkdir my-web-project && cd my-web-project # 2. 复制Docker配置 cp /path/to/common-nginx-fpm/* . # 3. 设置环境变量 cp .env.example .env # 编辑 .env 文件设置开发环境配置 # 4. 创建代码目录 mkdir -p src # 5. 启动开发环境 docker-compose up -d web mysql redis # 6. 访问应用 open http://localhost ``` ### 生产环境部署 ```bash # 1. 设置生产环境变量 cat > .env << EOF PROJECT_NAME=prod-webapp WEB_PORT=80 CODE_MOUNT_MODE=ro READ_ONLY=true MEMORY_LIMIT=512M CPU_LIMIT=1.0 MYSQL_PASSWORD=your_very_strong_password EOF # 2. 启动生产环境 docker-compose up -d # 3. 验证部署 curl http://localhost/health ``` ## 故障排除 ### 常见问题 **1. 容器启动失败** ```bash # 查看容器状态 docker-compose ps # 查看启动日志 docker-compose logs web ``` **2. PHP文件不执行,显示源码** ```bash # 检查nginx配置 docker exec nginx -t # 检查PHP-FPM状态 docker exec php-fpm -t ``` **3. 端口重定向问题** ```bash # 测试重定向功能 ./tools/test-redirect.sh 8080 # 检查nginx重定向配置 docker exec nginx -T | grep -E "(port_in_redirect|server_name_in_redirect)" ``` ### 查看日志 ```bash # Docker Compose日志 docker-compose logs -f web docker-compose logs -f mysql # 容器内日志 docker exec tail -f /var/log/nginx/error.log docker exec tail -f /var/log/php-fpm/www-error.log ``` ### 配置测试 ```bash # 测试 Nginx 配置 docker exec nginx -t # 测试 PHP-FPM 配置 docker exec php-fpm -t # 测试 PHP 扩展 docker exec php -m ``` ### 性能调优 ```bash # 查看资源使用 docker stats # 调整PHP-FPM进程数 # 编辑 config/www.conf pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 ```