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

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

本文旨在提供一份详尽的教程,指导您如何在宿主机上安装的Nginx反向代理Docker容器内部运行的php-fpm程序。核心内容涵盖了Nginx与Docker容器间的网络通信机制、FastCGI协议配置要点,以及如何确保文件路径在宿主机Nginx和Docker容器内php-fpm之间正确映射,从而实现高效稳定的PHP应用服务。

理解Nginx与Docker容器网络通信

nginx运行在宿主机上,而php-fpm运行在docker容器内部时,首要解决的问题是nginx如何找到并连接到php-fpm服务。docker通过其网络层为容器提供了隔离的环境。为了让宿主机上的nginx能够访问容器内的php-fpm,通常有两种主要方法:

端口映射 (Port Mapping):这是最常见且推荐的方式。Docker容器将内部的某个端口(例如php-fpm默认监听的9000端口)映射到宿主机的某个端口。这样,宿主机上的Nginx就可以通过localhost或宿主机的IP地址加上映射的端口来访问php-fpm。Docker桥接网络IP:在某些Linux环境中,宿主机可以直接通过Docker桥接网络的IP地址访问容器。例如,Docker默认的bridge网络通常会有一个网关IP(如172.17.0.1),容器在此网络中会有自己的IP。Nginx可以直接使用容器的IP地址进行连接。然而,容器的IP地址可能会动态变化,因此端口映射是更稳定的选择。

本教程将主要采用端口映射的方式进行配置,因为它更具通用性和稳定性。

Docker php-fpm容器准备

首先,确保您的php-fpm容器已正确运行,并监听了FastCGI协议的端口(通常是9000)。同时,为了让php-fpm能够访问到您的PHP应用代码,需要将宿主机上的应用代码目录挂载到容器内部。

以下是一个使用bitnami/php-fpm镜像的示例:

docker run -d   --name my-php-fpm   -p 9000:9000   -v /path/to/your/app:/app  # 将宿主机上的应用代码目录挂载到容器内的/app  bitnami/php-fpm:latest

说明:

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

-d: 后台运行容器。–name my-php-fpm: 为容器指定一个名称。-p 9000:9000: 将容器内部的9000端口映射到宿主机的9000端口。-v /path/to/your/app:/app: 这是一个关键步骤。它将宿主机上存放PHP应用代码的路径(例如/var/www/html/my-php-app)挂载到容器内部的/app目录。确保此路径与Nginx配置中的root指令相匹配。bitnami/php-fpm:latest: 使用Bitnami提供的php-fpm镜像。您可以根据自己的需求选择其他php-fpm镜像。

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

Nginx配置核心:FastCGI代理

接下来,我们需要在宿主机上的Nginx中配置FastCGI代理,将PHP请求转发给Docker容器内的php-fpm。

server {    listen 80;    server_name your_domain.com; # 替换为您的域名或IP地址    root /path/to/your/app;      # 替换为宿主机上PHP应用代码的根目录    # 错误日志和访问日志路径    error_log /var/log/nginx/your_domain.error.log;    access_log /var/log/nginx/your_domain.access.log;    index index.php index.html index.htm; # 默认索引文件    location / {        # 尝试直接提供文件,如果不存在则回退到index.php        try_files $uri $uri/ /index.php?$query_string;    }    location ~ .php(/|$) {        # FastCGI代理到php-fpm服务        fastcgi_pass 127.0.0.1:9000; # 或 localhost:9000,取决于您的系统配置        # 如果宿主机与容器在同一网络且没有端口映射,可能需要使用Docker桥接IP,例如:        # fastcgi_pass 172.17.0.1:9000;         fastcgi_split_path_info ^(.+.php)(/.*)$;        include fastcgi_params; # 包含FastCGI标准参数        # 确保SCRIPT_FILENAME正确指向PHP脚本在容器内的路径        # $document_root 对应 Nginx 的 root 指令,即宿主机上的 /path/to/your/app        # 容器内通过卷挂载,此路径在容器内也存在,如 /app        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        fastcgi_param HTTPS off; # 根据您的HTTPS配置调整    }    # 可选:禁止访问某些敏感文件    location ~ /.ht {        deny all;    }}

关键配置项解析

server_name: 设置Nginx监听的域名或IP地址。root /path/to/your/app;: 至关重要。此指令指定了Nginx查找静态文件和PHP脚本的根目录。这个路径必须是宿主机上PHP应用代码的实际存放路径,并且这个路径必须与Docker容器启动时通过-v参数挂载到容器内部的路径相对应。例如,如果容器内部是/app,则宿主机上的root也应指向/path/to/your/app。index index.php index.html index.htm;: 定义了默认的索引文件。location /: 负责处理非PHP文件的请求,并使用try_files指令实现URL重写,将所有请求路由到index.php,这对于现代PHP框架(如Laravel, Symfony)非常常见。location ~ .php(/|$): 这是一个正则表达式匹配块,用于处理所有以.php结尾的请求。fastcgi_pass 127.0.0.1:9000;: 这是Nginx连接php-fpm的关键。如果您的Docker容器将9000端口映射到宿主机的9000端口,那么127.0.0.1:9000或localhost:9000是正确的地址。在某些Linux环境中,如果您没有进行端口映射,而是直接通过Docker桥接网络IP访问,您可能需要查找Docker宿主机的桥接网卡IP(例如ifconfig docker0或ip a show docker0)或容器的实际IP地址。但如前所述,端口映射更为稳定。*`fastcgi_split_path_info ^(.+.php)(/.)$;`**: 这个指令用于正确解析PHP脚本的路径信息,将脚本路径和附加路径信息分开。include fastcgi_params;: 引入Nginx自带的FastCGI参数文件,其中包含了许多必要的FastCGI变量。fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;: 这是另一个关键参数。它告诉php-fpm要执行的PHP脚本的完整路径。$document_root在Nginx中解析为root指令设置的路径(即宿主机上的/path/to/your/app),而$fastcgi_script_name是请求的PHP文件名。由于您已经通过卷挂载将宿主机的/path/to/your/app映射到容器内的/app,因此php-fpm在容器内可以通过/app/your_script.php找到并执行脚本。确保Nginx的root路径和Docker容器内部挂载的路径能够正确对应,这是避免“File not found”错误的关键。

部署与测试

启动php-fpm容器: 按照上述docker run命令启动您的php-fpm容器。

配置Nginx: 将上述Nginx配置保存到您的Nginx配置文件中(例如/etc/nginx/conf.d/your_app.conf)。

检查Nginx配置: 运行sudo nginx -t检查Nginx配置是否有语法错误。

重载Nginx: 如果配置无误,运行sudo systemctl reload nginx或sudo service nginx reload重载Nginx服务。

创建测试文件: 在宿主机上您的应用代码根目录(例如/path/to/your/app)中创建一个index.php文件,内容如下:


访问测试: 在浏览器中访问http://your_domain.com(或您配置的IP地址),如果一切配置正确,您应该能看到phpinfo页面。

注意事项

文件路径一致性: Nginx的root指令指向的宿主机路径,必须通过卷挂载(-v)的方式,与php-fpm容器内部访问PHP脚本的路径保持一致。这是最常见的配置错误来源。网络连通性: 确保宿主机上的Nginx能够通过fastcgi_pass指定的地址和端口连接到Docker容器内的php-fpm。防火墙规则(如firewalld或ufw)可能会阻止这种连接,请检查并放行相关端口。权限问题: 确保Nginx进程和php-fpm进程对应用代码目录及其文件拥有足够的读写权限。日志监控: 定期检查Nginx的error_log和php-fpm的日志,以便及时发现和解决问题。生产环境考虑: 在生产环境中,建议使用Docker Compose来管理多个容器(如Nginx、php-fpm、数据库等),并利用Docker内部网络进行服务发现,这样可以避免直接使用宿主机IP或localhost,使配置更具可移植性。

总结

通过本教程,您应该已经掌握了在宿主机Nginx中代理Docker容器内php-fpm的核心方法。关键在于正确配置Nginx的FastCGI代理指令,并确保宿主机Nginx与Docker容器php-fpm之间的网络连通性以及文件路径的映射一致性。遵循这些步骤,您将能够高效地利用Docker容器的隔离性来运行php-fpm,同时保持Nginx在宿主机上的灵活性。

以上就是宿主机Nginx代理Docker容器内php-fpm的配置指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1294251.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 10:04:42
下一篇 2025年12月11日 10:04:58

相关推荐

  • HTMLrev 上的免费 HTML 网站模板

    HTMLrev 是唯一的人工策划的库专门专注于免费 HTML 模板,适用于由来自世界各地慷慨的模板创建者制作的网站、登陆页面、投资组合、博客、电子商务和管理仪表板世界。 这个人就是我自己 Devluc,我已经工作了 1 年多来构建、改进和更新这个很棒的免费资源。我自己就是一名模板制作者,所以我知道如…

    2025年12月24日
    300
  • 如何使用 Laravel 框架轻松整合微信支付与支付宝支付?

    如何通过 laravel 框架整合微信支付与支付宝支付 在 laravel 开发中,为电商网站或应用程序整合支付网关至关重要。其中,微信支付和支付宝是中国最流行的支付平台。本文将介绍如何使用 laravel 框架封装这两大支付平台。 一个简单有效的方法是使用业内认可的 easywechat lara…

    2025年12月24日
    000
  • Laravel 框架中如何无缝集成微信支付和支付宝支付?

    laravel 框架中微信支付和支付宝支付的封装 如何将微信支付和支付宝支付无缝集成到 laravel 框架中? 建议解决方案 考虑使用 easywechat 的 laravel 版本。easywechat 是一个成熟、维护良好的库,由腾讯官方人员开发,专为处理微信相关功能而设计。其 laravel…

    2025年12月24日
    500
  • 如何在 Laravel 框架中轻松集成微信支付和支付宝支付?

    如何用 laravel 框架集成微信支付和支付宝支付 问题:如何在 laravel 框架中集成微信支付和支付宝支付? 回答: 建议使用 easywechat 的 laravel 版,easywechat 是一个由腾讯工程师开发的高质量微信开放平台 sdk,已被广泛地应用于许多 laravel 项目中…

    2025年12月24日
    000
  • 使用Laravel框架如何整合微信支付和支付宝支付?

    使用 Laravel 框架整合微信支付和支付宝支付 在使用 Laravel 框架开发项目时,整合支付网关是常见的需求。对于微信支付和支付宝支付,推荐采用以下方法: 使用第三方库:EasyWeChat 的 Laravel 版本 建议直接使用现有的 EasyWeChat 的 Laravel 版本。该库由…

    2025年12月24日
    000
  • 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中?

    如何简洁集成微信和支付宝支付到 Laravel 问题: 如何将微信支付和支付宝支付无缝集成到 Laravel 框架中? 答案: 强烈推荐使用流行的 Laravel 包 EasyWeChat,它由腾讯开发者维护。多年来,它一直保持更新,提供了一个稳定可靠的解决方案。 集成步骤: 安装 Laravel …

    2025年12月24日
    100
  • 如何在 VS Code 中解决折叠代码复制问题?

    解决 VS Code 折叠代码复制问题 在 VS Code 中使用折叠功能可以帮助组织长代码,但使用复制功能时,可能会遇到只复制可见部分的问题。以下是如何解决此问题: 当代码被折叠时,可以使用以下简单操作复制整个折叠代码: 按下 Ctrl + C (Windows/Linux) 或 Cmd + C …

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 学会从头开始学习CSS,掌握制作基本网页框架的技巧

    从零开始学习CSS,掌握网页基本框架制作技巧 前言: 在现今互联网时代,网页设计和开发是一个非常重要的技能。而学习CSS(层叠样式表)是掌握网页设计的关键之一。CSS不仅可以为网页添加样式和布局,还可以为用户呈现独特且具有吸引力的页面效果。在本文中,我将为您介绍一些基本的CSS知识,以及一些常用的代…

    2025年12月24日
    200
  • 揭秘Web标准涵盖的语言:了解网页开发必备的语言范围

    在当今数字时代,互联网成为了人们生活中不可或缺的一部分。作为互联网的基本构成单位,网页承载着我们获取和分享信息的重要任务。而网页开发作为一门独特的技术,离不开一些必备的语言。本文将揭秘Web标准涵盖的语言,让我们一起了解网页开发所需的语言范围。 首先,HTML(HyperText Markup La…

    2025年12月24日
    000
  • 揭开Web开发的语言之谜:了解构建网页所需的语言有哪些?

    Web标准中的语言大揭秘:掌握网页开发所需的语言有哪些? 随着互联网的快速发展,网页开发已经成为人们重要的职业之一。而要成为一名优秀的网页开发者,掌握网页开发所需的语言是必不可少的。本文将为大家揭示Web标准中的语言大揭秘,介绍网页开发所需的主要语言。 HTML(超文本标记语言)HTML是网页开发的…

    2025年12月24日
    400
  • 常用的网页开发语言:了解Web标准的要点

    了解Web标准的语言要点:常见的哪些语言应用在网页开发中? 随着互联网的不断发展,网页已经成为人们获取信息和交流的重要途径。而要实现一个高质量、易用的网页,离不开一种被广泛接受的Web标准。Web标准的制定和应用,涉及到多种语言和技术,本文将介绍常见的几种语言在网页开发中的应用。 首先,HTML(H…

    2025年12月24日
    000
  • 网页开发中常见的Web标准语言有哪些?

    探索Web标准语言的世界:网页开发中常用的语言有哪些? 在现代社会中,互联网的普及程度越来越高,网页已成为人们获取资讯、娱乐、交流的重要途径。而网页的开发离不开各种编程语言的应用和支持。在这个虚拟世界的网络,有许多被广泛应用的标准化语言,用于为用户提供优质的网页体验。本文将探索网页开发中常用的语言,…

    2025年12月24日
    000
  • 深入探究Web标准语言的范围,涵盖了哪些语言?

    Web标准是指互联网上的各个网页所需遵循的一系列规范,确保网页在不同的浏览器和设备上能够正确地显示和运行。这些标准包括HTML、CSS和JavaScript等语言。本文将深入解析Web标准涵盖的语言范围。 首先,HTML(HyperText Markup Language)是构建网页的基础语言。它使…

    2025年12月24日
    000
  • CSS 超链接属性解析:text-decoration 和 color

    CSS 超链接属性解析:text-decoration 和 color 超链接是网页中常用的元素之一,它能够在不同页面之间建立连接。为了使超链接在页面中有明显的标识和吸引力,CSS 提供了一些属性来调整超链接的样式。本文将重点介绍 text-decoration 和 color 这两个与超链接相关的…

    2025年12月24日
    000
  • 看看这些前端面试题,带你搞定高频知识点(一)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:给定一个元素,如何实现水平垂直居中?…

    2025年12月24日 好文分享
    300
  • 看看这些前端面试题,带你搞定高频知识点(二)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:页面导入样式时,使用 link 和 …

    2025年12月24日 好文分享
    200
  • 看看这些前端面试题,带你搞定高频知识点(三)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:清除浮动有哪些方式? 我:呃~,浮动…

    2025年12月24日 好文分享
    000
  • 看看这些前端面试题,带你搞定高频知识点(四)

    每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。 面试官:请你谈一下自适应(适配)的方案 我:…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信