Nginx / PHP FPM 优雅停止(SIGQUIT):不太优雅

2024-01-04

运行 nginx 1.9.* / PHP 7.0.* (但 5.6.* 中的行为也完全相同)

尝试优雅地停止 PHP-FPM / nginx 组合以在维护期间关闭节点。为此,我将 SIGQUIT 发送到 php-fpm,这should提供优雅的关闭。

为了测试这一点,我做了一个愚蠢的脚本

<?php sleep(5); echo 'done';

使用以下curl在本地进行测试

curl -I x.x.x.x:8080

通常会产生输出:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 04:48:00 GMT
Content-Type: text/html; charset=UTF-8
Connection: close

期望:在任何正在进行的请求中间,当请求正常关闭时,当前请求应该完成,但任何其他请求都应该失败。

不幸的是,当我尝试通过发送 SIGQUIT (http://manpages.ubuntu.com/manpages/precise/man8/php5-fpm.8.html http://manpages.ubuntu.com/manpages/precise/man8/php5-fpm.8.html) 到 PHP-FPM 主进程:

kill -s SIGQUIT $FPMPID

连接立即地下降,导致 nginx 502

HTTP/1.1 502 Bad Gateway
Server: nginx
Date: Tue, 12 Apr 2016 04:48:07 GMT
Content-Type: text/html
Content-Length: 166
Connection: close

有什么建议吗?我很想让系统的这一部分尽可能无缝。谢谢!


在与同样的情况斗争了一段时间后,我相信我已经找到了神奇的配置设置,可以使子进程在死亡之前完成处理请求。

http://php.net/manual/en/install.fpm.configuration.php#process-control-timeout http://php.net/manual/en/install.fpm.configuration.php#process-control-timeout

进程控制超时

子进程等待主进程信号反应的时间限制

基本上,通过将其设置为类似的东西10s,子进程将等待那么长时间,同时在退出之前处理现有请求。

不幸的是,似乎php-fpmmaster进程立即退出,所以,受到代码的启发here https://github.com/php/php-src/blob/1c295d4a9ac78fcc2f77d6695987598bb7abcb83/sapi/fpm/init.d.php-fpm.in,我写了一个包装脚本:

#!/bin/bash

PHP_FPM_PID='/php-fpm.pid'

wait_for_pid () {
    try=0

    while test $try -lt 35 ; do
        if [ ! -f "$1" ] ; then
            try=''
            break
        fi

        echo -n .
        try=`expr $try + 1`
        sleep 1
    done
}

function clean_up {

    echo "Killing $(cat $PHP_FPM_PID)"

    kill -QUIT `cat $PHP_FPM_PID`
    wait_for_pid $PHP_FPM_PID

    echo "Done!"

    exit 0
}

trap clean_up EXIT

nohup php-fpm --daemonize --pid $PHP_FPM_PID 2>&1 &

while true; do sleep 1; done
# ^ do nothing forever

它等待 35 秒或直到该 pid 文件被删除(大概是由子进程之一删除?我仍然不清楚how它已被删除)。

无论如何,这个包装脚本工作得很好CMD为了我们的php-fpm我们使用 Kubernetes 运行的 docker 容器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx / PHP FPM 优雅停止(SIGQUIT):不太优雅 的相关文章

  • 按通用值对值进行分组:userid 和 ipaddress

    我正在解决数据库中的一个问题 我正在尝试查找使用多个帐户的用户 我有一个用户 ID 和使用的 IP 地址的列表 如下所示 用户 ID IP 地址 1 IP 地址 13 2 IP 地址 23 1 IP 地址 12 4 IP地址56 9 IP
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • 在值中包含换行符

    我有一个 Word 模板 其中 php 代码中定义了值 在PHP代码中 document gt setValue Value1 value1 在word模板中 Value1 如何将包含两个值之间的断线的值包含在单词的值中 Replace n
  • PHP - 获取base64图像字符串解码并保存为jpg(生成空图像)

    嗨 我实际上是通过 ajax 发送一个 base64 图像字符串到一个 php 脚本 该脚本只是解码字符串并将内容保存为 jpg 文件 但结果是一张空图像 这怎么可能 PHP脚本 uploadedPhotos array photo 1 p
  • Yii2 异常:ApcCache 需要加载 PHP apc 扩展

    在高级模板前端的主配置中配置缓存组件时 我收到异常 在我的 php ini 上启用了扩展 rsults 如何解决此问题 前端 config main php cache gt class gt yii caching ApcCache ke
  • PHP 开发相当于 Mongrel/Webrick 吗?

    PHP 开发中是否有与 Rails 开发期间使用 Mongrel Webrick 等效的方法 我通常在端口 3000 上使用 Mongrel 在开发过程中为我的 Rails 应用程序提供服务 我从事 PHP 开发已经有几年了 据我所知 方法
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 如何通过php的require()或include()函数传递变量?

    当我使用这个时 require diggstyle code php page page no 警告是 无法打开流 第 198 行 C xampp htdocs 4ajax gallery core php 中没有错误 错误是 Failed
  • 如何在类似 MVC 的页面中加载基于漂亮 URL 的类?

    我想请教一些关于如何解决这个问题的提示 我正在尝试构建自己的 MVC 网站 我了解了 URL 的基础知识 http example com blog cosplay cosplayer expo today 博客 gt 控制器cosplay
  • 强制 Composer 下载 git repo 而不是 zip

    我对作曲家有一些问题 require php gt 5 3 2 kriswallsmith buzz 0 7 Repo https github com kriswallsmith Buzz tree v0 7 https github c
  • postgreSql 中特定时间后表更新

    我已经在 postgres 中创建了表 现在我想在特定时间 例如 1 小时 后更新一行 我看到很多问题 例如 https dba stackexchange com questions 56424 column auto updated a
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio

随机推荐

  • 查找多个变量的所有组合总和为 1

    我正在尝试解方程 x1 x2 x3 xn 1 其中所有的值xi仅限于 0 0 1 0 2 0 9 1 目前 我通过首先生成一个n维数组来解决问题mat 其中每个元素位置的值是轴值的总和 其变化范围为axisValues 0 0 1 1 ma
  • 在 Chrome 浏览器中调整 svg 图像的大小作为背景

    我使用 svg 图像作为背景 并通过背景大小拉伸 SVG 图像 我希望它仅在宽度方向上拉伸 它在 Firefox IE9 中工作完美 但在 Chrome 中工作得很好 请建议我如何实现它 homecallouts ul li backgro
  • 有没有办法释放 xarray.Dataset 的文件锁?

    我有一个生成 NetCDF 文件的进程fn每 5 分钟使用一次netcdf4 Dataset fn mode a 我还有一个 NetCDF 文件的散景服务器可视化 使用xarray Dataset 我想保留它 因为它太方便了 问题是 Net
  • 如何修复我的“itoa”实现,使其不打印反向输出?

    我想在C中将一个整数转换为一串数字字符 我尝试过使用itoa 但它是非标准的 并且不是由我的 C 库提供的 我尝试实现自己的itoa 但它无法正常工作 include
  • Hadoop 一次读取多行

    我有一个文件 其中每四行一组代表一条记录 例如 前四行代表记录 1 接下来的四行代表记录 2 依此类推 如何确保Mapper一次输入这四行 另外 我希望 Hadoop 中的文件分割发生在记录边界 行号应该是四的倍数 这样记录就不会跨越多个分
  • 访问服务的异步变量

    这是我的第一个 Angular 4 项目的一部分 我目前可以从搜索栏很好地调用 searchCall 函数 但存储在 tweetsData 中的数据似乎不在 app component html 中的 ngFor 调用范围内 并且作为异步后
  • 如何为使用 jQuery Mobile、PhoneGap 和 Django 实现的移动 Web 应用程序实现仅首次登录方案?

    我正处于开发移动 Web 应用程序的早期 预编码 阶段jQuery 移动 http en wikipedia org wiki JQuery Mobile 我们看了煎茶触摸 http en wikipedia org wiki Sencha
  • 发布查询,包括元数据和大于日期

    我正在努力寻找可行的解决方案wp query 我目前有一些分配给帖子的自定义设置 一是帖子是否 精选 二是帖子结束的日期和时间 不再显示在结果中 我有使用该功能的查询 但只需要将此结束日期纳入其中 这是使用 特色 查找的查询 WP Quer
  • 向 C++ 控制台应用程序添加状态栏

    我正在使用 C 制作一个 Linux 应用程序 它会将信息打印到控制台 程序的某些部分将需要一段时间来计算 我想在控制台中添加一个类似于 wget 中使用的状态栏 我在下面放置了我自己的描述 complete gt eta 实现这一目标的最
  • 绑定参数 4 时出错 - 可能是不受支持的类型

    我首先要提到的是 我通过 Flask SqlAlchemy 使用 SqlAlchemy 我不认为这会影响该问题 但如果会影响 请告诉我 这是我在 SqlAlchemy 中运行 create all 函数时收到的错误消息的相关部分 Inter
  • Android - 丢失传入(高速)USB 数据

    使用 Android 时 我会丢失传入 USB 数据流上的数据 而在 Windows 中读取同一设备 流时不会丢失这些数据 我知道 Android 不是实时操作系统 但 Windows 也不是 并且 Windows 在 跟上 数据方面没有任
  • 使用正则表达式检查字符串是否只包含一位数字

    我正在编写一个算法 我需要检查字符串是否包含only one数字 不超过一位 目前我有 if current Operation matches d 有更好的方法来做这件事吗 谢谢 您可以使用 D d D match beginning o
  • 如何将数据从托管程序集流式传输到本机库并再次返回?

    如何将数据 文本 从托管程序集流式传输到本机库并将数据 文本 流回托管程序集 具体来说 我想揭露一个System IO Stream NET 端的某种类型 并且 最重要的是 a FILE 在本机方面 本机方法的签名应该是 FILE foo
  • DataTable 上的 Linq:选择特定列到数据表中,而不是整个表

    我正在运行 LINQ 查询datatable in c 我想选择特定列而不是整行并将结果输入到datatable 我怎样才能做到这一点 My Code public DataTable getConversions string c to
  • 如何更新猫鼬中嵌入文档中的嵌入文档?

    我正在使用 mongodb 和 mongoose 在 node js 中构建一个 API 目前 我有一个嵌入文档中的嵌入文档 架构中的架构 它根本没有保存到数据库中 我已尽我所能 但没有运气 我在猫鼬中将架构定义为 var BlogPost
  • Volley AppController 类对象返回 null

    我正在制作一个应用程序JsonObjectRequest并使用 Android 版 Volley Networking Library 从 URL 检索 JSON 数据 应用控制器 java public class AppControll
  • 在 Visual Studio Code for Mac 中设置 TFVC 存储库

    我正在尝试在我的 Visual Studio Code for Mac 上的 VSTS 中设置托管的 Team Foundation 版本控制 TFVC 存储库 我根本没用过Visual Studio 显然 我的客户正在使用 TFVC 系统
  • Array.Clone() (复制还是不复制?)

    我怀疑我只是误解了 Array 类的 Clone 方法 然而它显示 创建 System Array 的浅拷贝 所以我认为这意味着新的对象指针 而不是相同的对象指针 下面的事情真的应该发生吗 假设测试对象 public class testO
  • 使用主机路径与 Kind Kubernetes Cluster 共享本地目录

    我想与 kind 集群共享我的非空本地目录 基于这里的答案 如何在 Kind 中引用本地卷 docker 中的 kubernetes https stackoverflow com questions 62694361 how to ref
  • Nginx / PHP FPM 优雅停止(SIGQUIT):不太优雅

    运行 nginx 1 9 PHP 7 0 但 5 6 中的行为也完全相同 尝试优雅地停止 PHP FPM nginx 组合以在维护期间关闭节点 为此 我将 SIGQUIT 发送到 php fpm 这should提供优雅的关闭 为了测试这一点