在宿主机Nginx中代理Docker容器内的PHP-FPM程序

在宿主机Nginx中代理Docker容器内的PHP-FPM程序
最新回答
不交电费瞎发啥光

2022-10-01 10:00:06

在宿主机Nginx中代理Docker容器内的PHP-FPM程序,需通过端口映射实现Nginx与容器内PHP-FPM的通信,核心步骤包括配置PHP-FPM容器端口映射和设置Nginx的FastCGI代理。

一、配置PHP-FPM容器端口映射
  1. 启动容器并映射端口使用docker run命令启动PHP-FPM容器,并通过-p参数将容器内的9000端口(PHP-FPM默认监听端口)映射到宿主机的9000端口。示例命令如下:

    docker run -d --name my-php-fpm-app -p 9000:9000 -v /path/on/host/to/your/php/app:/app bitnami/php-fpm:latest

    -p 9000:9000:将容器内9000端口映射到宿主机9000端口,使Nginx可通过宿主机IP访问容器内PHP-FPM。

    -v /path/on/host/to/your/php/app:/app:将宿主机PHP代码目录挂载到容器内,确保Nginx与PHP-FPM访问同一代码路径。

  2. 验证端口连通性容器启动后,通过以下命令检查端口映射是否成功:

    docker ps -a # 确认容器运行状态nc -vz 127.0.0.1 9000 # 测试宿主机9000端口是否可达

    若显示succeeded!,则表示PHP-FPM服务已通过端口映射暴露到宿主机。

二、配置宿主机Nginx的FastCGI代理
  1. 创建Nginx配置文件在Nginx配置目录(如/etc/nginx/conf.d/)中创建新配置文件(如my_php_app.conf),并添加以下内容:

    server { listen 80; server_name your_domain.com
    www.your_domain.com;
    root /path/on/host/to/your/php/app; # 必须与Docker挂载路径一致 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; # 指向宿主机映射的端口 fastcgi_split_path_info ^(.+.php)(/.+)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } location ~ /. { deny all; }}

    关键参数说明

    fastcgi_pass 127.0.0.1:9000:Nginx通过宿主机9000端口转发请求到容器内PHP-FPM。

    root:必须与Docker挂载的宿主机路径一致,确保Nginx能正确找到PHP文件。

    try_files $uri =404:防止未找到的PHP文件被发送到PHP-FPM,提升安全性。

  2. 检查并重载Nginx配置执行以下命令检查配置语法并重载Nginx:

    nginx -t # 检查配置语法nginx -s reload # 重载配置
三、特殊环境下的IP调整
  • Docker Desktop(macOS/Windows):若宿主机IP非127.0.0.1(如Docker分配的网桥IP192.168.59.103),需将fastcgi_pass中的IP替换为实际网桥IP。可通过以下命令获取:docker network inspect bridge | grep Gateway # 查看Docker网桥IP修改后示例:fastcgi_pass 192.168.59.103:9000;
四、验证代理效果
  1. 访问测试通过浏览器访问配置的域名(如
    http://your_domain.com
    ),若能正常显示PHP页面,则说明代理成功。
  2. 日志排查若访问失败,检查Nginx错误日志(如/var/log/nginx/my_php_app.error.log)和PHP-FPM容器日志(docker logs my-php-fpm-app),定位问题原因。
总结

通过端口映射将Docker容器内PHP-FPM的9000端口暴露到宿主机,并在Nginx中配置fastcgi_pass指向该端口,即可实现宿主机Nginx对容器内PHP-FPM的高效代理。核心要点包括端口映射一致性、路径挂载正确性及FastCGI参数配置。特殊环境下需根据实际IP调整代理地址。