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

40次阅读

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

本文详细介绍了如何在宿主机上运行的Nginx服务器中,高效代理Docker容器内部署的PHP-FPM应用程序。教程涵盖了PHP-FPM容器的启动配置、Nginx FastCGI代理的核心设置,并提供了详细的Nginx配置示例,旨在帮助开发者实现Nginx与Docker化PHP服务的无缝集成,确保生产环境的稳定运行。

引言

将PHP-FPM应用程序部署在Docker容器中已成为现代Web开发中的常见实践,它提供了环境隔离和部署便捷性。然而,在某些场景下,例如为了利用宿主机Nginx的现有配置、性能优势或集成特定模块,我们可能选择在宿主机上独立运行Nginx作为Web服务器和反向代理,而非将其也容器化。本文将深入探讨如何配置宿主机上的Nginx,以实现对Docker容器内部PHP-FPM服务的高效代理。

核心工作原理

Nginx与PHP-FPM之间的通信基于FastCGI协议。当Nginx接收到对PHP文件的请求时,它会通过FastCGI协议将请求转发给PHP-FPM进程。PHP-FPM处理完请求后,将生成的动态内容返回给Nginx,Nginx再将最终的HTTP响应发送给客户端。在Docker环境中,核心挑战在于Nginx如何通过宿主机网络连接到运行在隔离容器内部的PHP-FPM服务。这通常通过Docker的端口映射机制来实现。

步骤一:准备PHP-FPM Docker容器

首先,需要确保PHP-FPM容器正确运行,并且其FastCGI端口(默认为9000)已映射到宿主机。

1. 启动PHP-FPM容器

立即学习PHP免费学习笔记(深入)”;

以下示例使用Bitnami的php-fpm镜像,你也可以替换为其他PHP-FPM镜像或自定义镜像。关键在于通过-p参数将容器的9000端口映射到宿主机的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
  • -d: 使容器在后台运行。
  • –name my-php-fpm-app: 为容器指定一个易于识别的名称。
  • -p 9000:9000: 这是核心配置,它将容器内部的9000端口(PHP-FPM监听的端口)映射到宿主机的9000端口。Nginx将通过此宿主机端口与PHP-FPM通信。
  • -v /path/on/host/to/your/php/app:/app: 将宿主机上包含PHP应用程序代码的目录挂载到容器内部的/app目录。确保此宿主机路径与Nginx配置中的root指令保持一致。

2. 验证PHP-FPM服务状态

容器启动后,可以通过以下命令检查其运行状态:

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

AISEO

AI创作对SEO友好的文案和文章

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

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

docker ps -a

若要进一步确认PHP-FPM服务是否可达,可以在宿主机上尝试连接映射的端口:

nc -vz 127.0.0.1 9000

如果连接成功(通常显示succeeded!),则表示PHP-FPM服务已在宿主机9000端口上可用。

步骤二:配置宿主机Nginx进行代理

接下来,在宿主机上的Nginx配置文件中添加一个server块,以定义如何代理对PHP应用程序的请求。

1. Nginx配置示例

在Nginx的配置目录(例如/etc/nginx/sites-available/或/etc/nginx/conf.d/)中创建一个新的配置文件,例如my_php_app.conf。

server {     listen 80; # Nginx监听HTTP请求的端口     server_name your_domain.com www.your_domain.com; # 你的域名,或使用localhost进行本地测试     root /path/on/host/to/your/php/app; # 宿主机上PHP代码的根目录,必须与Docker挂载的宿主机路径一致      index index.php index.html index.htm; # 默认索引文件      error_log /var/log/nginx/my_php_app.error.log; # 错误日志路径     access_log /var/log/nginx/my_php_app.access.log; # 访问日志路径      # 处理所有非PHP文件的请求,尝试直接提供文件,否则重写到index.php     location / {         try_files $uri $uri/ /index.php?$query_string;     }      # 处理所有以.php结尾的请求     location ~ .php$ {         # 重要的安全措施:确保只有实际存在的PHP文件才会被发送到PHP-FPM处理         try_files $uri =404;          # 将FastCGI请求转发给PHP-FPM服务         # 使用宿主机的loopback地址和映射的端口         fastcgi_pass 127.0.0.1:9000;          # FastCGI参数配置         fastcgi_split_path_info ^(.+.php)(/.+)$; # 分割PHP脚本路径和额外路径信息         include fastcgi_params; # 引入Nginx默认的FastCGI参数集         # 重新定义SCRIPT_FILENAME,确保PHP-FPM能正确找到并执行脚本         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;         fastcgi_param HTTPS off; # 根据实际情况设置HTTPS状态         # fastcgi_param PATH_INFO $fastcgi_path_info; # 如果应用程序需要PATH_INFO,可启用此行     }      # 阻止对隐藏文件和目录的访问     location ~ /. {         deny all;     } }

配置详解:

  • listen 80;: Nginx监听HTTP默认端口。
  • server_name your_domain.com;: 定义此虚拟主机的域名。
  • root /path/on/host/to/your/php/app;: 至关重要! 此路径必须与你在docker run命令中挂载到PHP-FPM容器的宿主机路径完全一致。Nginx将在此目录中查找静态文件和PHP脚本。
  • location / { … }: 定义了如何处理非PHP文件的请求。try_files指令会尝试按顺序查找文件,如果找不到,则将请求内部重写到index.php,以便PHP应用程序处理路由
  • location ~ .php$ { … }: 这是处理所有以.php结尾的请求的核心块。
    • try_files $uri =404;: 确保只有真实存在的PHP文件才会被发送到PHP-FPM,防止不必要的处理和潜在的安全问题。
    • fastcgi_pass 127.0.0.1:9000;: 核心代理指令。它指示Nginx将FastCGI请求发送到宿主机上的9000端口。由于我们已将Docker容器的9000端口映射到宿主机的9000端口,Nginx就能通过此地址访问到PHP-FPM服务。
      • 注意: 在某些特殊的Docker网络配置或Docker Desktop环境中(例如,Docker Desktop在macOS/Windows上使用虚拟机),宿主机的IP可能不是127.0.0.1,而是Docker分配给宿主机VM的网桥IP(例如192.168.59.103或172.17.0.1)。如果`127.0.0.1:9000

以上就是在宿主机Nginx中代理Docker容器内的PHP-FPM程序的详细内容,更多请关注php html docker windows nginx app access 虚拟机 mac ai 路由 macos php nginx location windows docker macos http

php html docker windows nginx app access 虚拟机 mac ai 路由 macos php nginx location windows docker macos http

text=ZqhQzanResources