0

0

宿主机Nginx代理Docker容器内php-fpm服务的配置指南

霞舞

霞舞

发布时间:2025-09-12 23:31:01

|

675人浏览过

|

来源于php中文网

原创

宿主机Nginx代理Docker容器内php-fpm服务的配置指南

本教程详细介绍了如何在宿主机上部署Nginx,并将其配置为代理运行在Docker容器内的php-fpm服务。我们将涵盖Docker容器的端口映射、Nginx的fastcgi配置,以及确保两者之间网络通信的关键步骤,旨在提供一个清晰、可操作的解决方案,实现宿主机Nginx与容器化php-fpm的无缝集成。

1. 理解部署架构

在开始配置之前,明确我们的部署架构至关重要。本教程的目标是:

  • Nginx服务运行在宿主机上:这意味着Nginx作为独立的进程直接安装在操作系统中,而非在Docker容器内。
  • php-fpm服务运行在Docker容器内:php-fpm被封装在一个或多个Docker容器中,负责处理PHP代码的执行。
  • 核心挑战:Nginx需要能够访问到Docker容器内部的php-fpm服务,以便将PHP请求转发过去。这主要通过Docker的端口映射和Nginx的FastCGI代理功能来实现。

2. 容器化php-fpm服务配置

首先,我们需要确保php-fpm容器正确运行并暴露其FastCGI端口。通常,php-fpm服务监听在9000端口。

2.1 运行php-fpm容器

我们可以使用如bitnami/php-fpm等现成的php-fpm镜像。关键在于通过Docker的端口映射功能,将容器内部的9000端口映射到宿主机的一个可用端口。

示例Docker运行命令:

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

命令解析:

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

  • -d: 后台运行容器。
  • --name my-php-fpm: 为容器指定一个名称,方便管理。
  • -p 9000:9000: 将容器内部的9000端口映射到宿主机的9000端口。这是Nginx能够访问php-fpm的关键。如果宿主机9000端口已被占用,可以选择其他端口,例如-p 8000:9000。
  • -v /path/to/your/php/app:/app: 将宿主机上存放PHP应用代码的路径(例如/var/www/html)挂载到容器内部的/app路径。确保这个路径与Nginx配置中的root指令以及php-fpm处理脚本的路径一致。
  • bitnami/php-fpm:latest: 使用Bitnami提供的php-fpm镜像。

运行此命令后,php-fpm服务将在Docker容器中启动,并通过宿主机的9000端口对外提供服务。

3. 宿主机Nginx代理配置

接下来,我们需要配置宿主机上的Nginx,使其能够将PHP请求转发给运行在Docker容器内的php-fpm服务。这涉及到Nginx的FastCGI代理模块。

Veggie AI
Veggie AI

Veggie AI 是一款利用AI技术生成可控视频的在线工具

下载

3.1 Nginx站点配置

创建一个新的Nginx站点配置文件(例如/etc/nginx/conf.d/your_app.conf)或修改现有的配置文件。

示例Nginx配置:

server {
    listen 80;
    server_name localhost your.domain.com; # 替换为你的域名或IP

    # 你的PHP应用代码在宿主机上的根目录
    # 确保这个路径与Docker挂载的宿主机路径一致,例如 /path/to/your/php/app
    root /path/to/your/php/app; 
    index index.php index.html index.htm;

    error_log /var/log/nginx/your_app.error.log;
    access_log /var/log/nginx/your_app.access.log;

    # 尝试直接访问文件,如果文件不存在,则重写到index.php
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # 处理所有以.php结尾的请求
    location ~ \.php$ {
        # 确保文件存在,否则返回404
        try_files $uri =404;

        # 将请求转发给php-fpm服务
        # 如果php-fpm容器映射到宿主机9000端口,则使用localhost:9000
        # 如果php-fpm容器运行在不同IP的宿主机上,则替换为相应IP
        fastcgi_pass 127.0.0.1:9000; 

        # 匹配请求URI,提取脚本名称和路径信息
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        # 引入FastCGI参数,通常位于/etc/nginx/fastcgi_params或fastcgi.conf
        include fastcgi_params;

        # 设置SCRIPT_FILENAME参数,告知php-fpm要执行的脚本路径
        # $document_root是Nginx配置中的root指令定义的路径
        # $fastcgi_script_name是fastcgi_split_path_info提取出的脚本名称
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # 可选:设置HTTPS状态,如果Nginx处理HTTPS,此处可设为on
        fastcgi_param HTTPS off; 
    }

    # 阻止访问隐藏文件和目录
    location ~ /\. {
        deny all;
    }
}

配置详解:

  • listen 80;: Nginx监听80端口。
  • server_name localhost your.domain.com;: 定义服务器名称。
  • root /path/to/your/php/app;: 非常重要,指定PHP应用代码在宿主机上的根目录。这个路径必须与Docker容器挂载的宿主机路径(即docker run命令中的/path/to/your/php/app)完全一致。
  • location / { ... }: 处理非PHP文件的请求,并实现URL重写(如Laravel、Symfony等框架的入口文件通常是index.php)。
  • location ~ \.php$ { ... }: 专门处理所有以.php结尾的请求。
    • try_files $uri =404;: 检查请求的PHP文件是否存在,如果不存在则返回404错误。
    • fastcgi_pass 127.0.0.1:9000;: 核心指令。它将PHP请求转发到FastCGI服务器。127.0.0.1:9000(或localhost:9000)指向宿主机上由Docker映射出来的php-fpm服务端口。如果php-fpm容器运行在不同的宿主机上,或者你使用了Docker的高级网络模式,可能需要替换为相应的IP地址。
    • fastcgi_split_path_info ^(.+\.php)(/.+)$;: 正则表达式用于将请求URI分割成两部分:PHP脚本路径和额外路径信息(PATH_INFO)。
    • include fastcgi_params;: 引入Nginx的FastCGI参数文件,其中包含了许多标准FastCGI环境变量。
    • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;: 设置SCRIPT_FILENAME环境变量,这是php-fpm用来定位和执行PHP脚本的关键。$document_root是Nginx配置的root路径,$fastcgi_script_name是fastcgi_split_path_info提取出的PHP脚本名。

3.2 重载Nginx配置

保存Nginx配置文件后,需要检查配置语法并重载Nginx服务:

sudo nginx -t # 检查Nginx配置语法
sudo systemctl reload nginx # 重载Nginx服务

4. 关键注意事项与故障排除

  • 网络连通性
    • 确保Nginx能够通过127.0.0.1:9000(或你配置的其他IP和端口)访问到php-fpm。如果宿主机有防火墙(如ufw或firewalld),请确保9000端口是开放的。
    • 在某些Docker网络配置中,localhost可能无法直接解析到宿主机。但对于-p 9000:9000这种标准端口映射,Nginx在宿主机上通过127.0.0.1:9000访问通常是可行的。
  • 文件路径映射:root指令在Nginx配置中和Docker的-v挂载中必须保持一致。如果Nginx的root路径是/var/www/html,那么Docker挂载时也应该是-v /var/www/html:/app,并且容器内部的php-fpm也要知道PHP文件在/app下。
  • SCRIPT_FILENAME的重要性:这个参数是php-fpm找到并执行PHP脚本的关键。如果配置错误,php-fpm可能报告文件不存在或权限问题。
  • 权限问题:确保Nginx运行用户(通常是www-data或nginx)对PHP应用代码目录及其内容具有读取权限。同时,Docker容器内部的php-fpm进程也需要对挂载的/app目录有相应的执行权限。
  • 日志分析
    • 检查Nginx的错误日志(/var/log/nginx/your_app.error.log或/var/log/nginx/error.log)以获取Nginx侧的问题。
    • 检查php-fpm容器的日志(docker logs my-php-fpm)以获取PHP执行或php-fpm服务的问题。

5. 总结

通过上述步骤,你已经成功配置了宿主机上的Nginx来代理运行在Docker容器内的php-fpm服务。这种部署方式结合了Docker的隔离性和宿主机Nginx的灵活性,使得PHP应用的部署和管理更加高效。关键在于正确配置Docker的端口映射、Nginx的fastcgi_pass指令以及确保Nginx root路径与Docker挂载路径的一致性。在遇到问题时,详细检查Nginx和php-fpm的日志将是快速定位和解决问题的有效方法。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2707

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1667

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1527

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1444

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1529

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.8万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号