2024-04-01 10:45:49
在 Docker 中部署 PHP 项目并启用 HTTPS,需完成证书生成、容器配置及服务部署三个核心步骤。以下是详细实现方案:
1. 生成 SSL 证书使用 OpenSSL 生成自签名证书(适用于开发和测试环境):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ssl/mykey.pem -out ./ssl/mycert.pem -subj "/CN=example.com"-x509:生成自签名证书。
-nodes:不加密私钥(避免容器启动时输入密码)。
-days 365:证书有效期。
-subj:指定证书主题(需替换为实际域名)。
在 Dockerfile 中集成证书和 Nginx 配置:
FROM php:8.2-fpm-alpine# 安装 NginxRUN apk add --no-cache nginx# 拷贝证书和配置COPY ./ssl/mykey.pem /etc/ssl/private/nginx.keyCOPY ./ssl/mycert.pem /etc/ssl/certs/nginx.crtCOPY ./nginx/https.conf /etc/nginx/conf.d/default.conf# 拷贝 PHP 项目COPY . /var/www/html# 启动脚本(同时启动 PHP-FPM 和 Nginx)CMD sh -c "php-fpm & nginx -g 'daemon off;'"Nginx 配置示例 (./nginx/https.conf):
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/certs/nginx.crt; ssl_certificate_key /etc/ssl/private/nginx.key; ssl_protocols TLSv1.2 TLSv1.3; root /var/www/html/public; index index.php; location ~ .php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }}方案二:通过 Docker Compose 动态挂载更灵活的方式是通过 docker-compose.yml 挂载证书和配置:
version: '3'services: php-https: image: php:8.2-fpm-alpine volumes: - ./ssl:/etc/ssl - ./nginx/https.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html ports: - "443:443" command: sh -c "php-fpm & nginx -g 'daemon off;'"3. 构建并运行容器# 构建镜像docker build -t php-https-app .# 运行容器(方案一)docker run -d -p 443:443 --name php-https php-https-app# 或使用 Compose(方案二)docker-compose up -d4. 验证 HTTPS 访问生产环境证书:自签名证书仅用于测试,生产环境应使用 Let's Encrypt 或商业 CA 签发的证书。
证书路径权限:确保容器内 Nginx 进程(如 nginx 用户)有权限读取证书文件。
HTTP 自动跳转 HTTPS:在 Nginx 配置中添加 80 端口监听并重定向:
server { listen 80; server_name example.com; return 301 https://$host$request_uri;}PHP 会话安全:在 php.ini 中启用 session.cookie_secure = On,确保会话仅通过 HTTPS 传输。
通过以上步骤,您的 PHP 项目将在 Docker 容器中通过 HTTPS 安全运行。