`
zhengdl126
  • 浏览: 2539026 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

[SH][php-fpm自动拉起]从nginx的502错误出发谈锁机制在服务器自动监控脚本中的应用

阅读更多

http://my.nuaa.edu.cn/thread-120539-1-1.html

 

 

 

#!/bin/sh
#check php-fpm process and restart if down
#create by zhengdongliang
#path /data/sh/check_php_fpm.sh
#crontab time */1 * * * *

if [ -e /var/lock/subsys/502 ]
then
    killall -9 curl 2>/dev/null
    killall -9 php-fpm 2>/dev/null
    /usr/local/webserver/php/sbin/php-fpm start >/dev/null
    echo "[ `date +'%h %d %T'` ] PHP-FPM died with no response, all processes restarted">>/tmp/log
else
    touch /var/lock/subsys/502
    if [ `curl --connect-timeout 5 -I http://192.168.93.129/ 2>/dev/null | grep '502 Bad Gateway' -c` != '0' ]
    then
        killall -9 php-fpm 2>/dev/null
        /usr/local/webserver/php/sbin/php-fpm start >/dev/null
        echo "[ `date +'%h %d %T'` ] PHP-FPM died with 502 bad gateway, all processes restarted">>/tmp/log
    fi
    rm -f /var/lock/subsys/502
fi



添加为自动执行:
    #crontab -e
*/1 * * * * /bin/sh /data/sh/check_php_fpm.sh >/dev/null 2>&1

系统每1分钟会自动执行check_php_fpm.sh

 

 

 

 

------------------------------------

 

 

由于负载能力无法满足需求,纸飞机服务器从去年7月开始迁移到nginx服务器,不过PHP 5.2上安装了eAccelerator扩展后服务器经常发生500错误,无奈升级到了PHP 5.3系列,虽然说500错误没了,不过新的内建PHP-FPM稳定性不如打过FPM补丁PHP-CGI,经常发生所有PHP-FPM进程全部卡死不接受 任何请求,前端的nginx不停地显示502 Bad Gateway,除非手动kill掉PHP进程再重新启动才能恢复正常,让我非常郁闷。
在 网上逛了无数的论坛,在nginx英文论坛里面也转了很久,试过了文件描述符限制、转换到APC、修改各种FPM参数等等一系列方法依然没有效果,无意中 Google到一篇文章讲利用cron计划任务每分钟用curl监控一下服务器是否有502错误,如果有的话就自动重启PHP进程,最后只能选择这种方法 了。参考了网站上的PHP脚本,用Shell改写了一下(PHP挂了我再用PHP去干掉PHP不是自己找麻烦么,果断用Shell语言来执行),得到了以 下一段脚本:
#!/bin/sh

if [ `curl --connect-timeout 5 -I http://my.nuaa.edu.cn/ 2>/dev/null | grep '502 Bad Gateway' -c` != '0' ]
then
    killall -9 php-fpm 2>/dev/null
    service php-fpm start >/dev/null
    echo "[ `date +'%h %d %T'` ] PHP-FPM died with 502 bad gateway, all processes restarted">>/path/to/log
fi
并且在/etc/crontab中加入一行:
* * * * * root /path/to/script
使脚本在每分钟0秒时自动被执行。
因为PHP进程卡死的时候已经无法接受任何信号,即使使用service php-fpm stop命令也无法停止了,所以这里只能选择使用killall命令来结束PHP进程。为了方便诊断以及未来在稳定性上再作优化,在脚本中增加了日志记录的命令。
不 过PHP进程卡死到nginx报502错误其实是有一个时间差的,因为PHP和nginx通过TCP或SOCKET进行连接,当PHP卡死不接受请求 时,nginx并不会收到请求被拒绝的类似信息,而是把请求积压在SOCKET或TCP上,此时浏览器所得到的响应就是一个“正在等待响应”的提示,除非 SOCKET报错或浏览器关闭否则等待永远都不会停止,curl也一样。当积压到一定值时(Linux下SOCKET backlog的值默认为1024),Linux系统会认为该SOCKET已失效,再试图发送请求会收到Resource temporarily unavailable,直到这时nginx才会报502错误。也就是说如果在网站流量比较小的时候从PHP卡死到nginx报502错误可能需要数分钟 甚至更久,而在这段时间里上述脚本运行curl命令时curl将一直处于等待状态,而每分钟会有一个新的curl进程出现,这样当最终SOCKET上的请 求达到backlog值时这一群curl将全部得到502错误返回值,并且同时kill掉所有的PHP进程并且启动PHP服务,也就是说,PHP服务被启 动了很多遍。因为PHP-FPM配置文件中启动的工作进程数是根据内存实际情况确定的,如果说PHP服务被启动了很多遍的话就会直接导致内存的占用过多造 成不良后果,因此为了避免这种情况我在该脚本第一行加入了:
killall -9 curl 2>/dev/null
这样就避免了 多个PHP服务被启动,几倍于正常值的PHP进程在运行的情况。不过在实际使用过程中又发现在PHP卡死到nginx报502错误之间的时间差有时可能需 要数十分钟到半小时,大大超出了我们所能忍受的范围,想到Linux下很多服务通过在/var/lock/subsys/文件夹下创建以自己名字命名的空 文件来表明自己是否处于运行状态,我决定在502错误的监控脚本中也加入锁机制,使得脚本能够识别出PHP卡死而nginx没有报502错误的情况并且及 时地重启PHP进程,于是监控脚本变成了这个样子:
#!/bin/sh

if [ -e /var/lock/subsys/502 ]
then
    killall -9 curl 2>/dev/null
    killall -9 php-fpm 2>/dev/null
    rm -f /var/lock/subsys/502
fi
touch /var/lock/subsys/502
if [ `curl --connect-timeout 5 -I http://my.nuaa.edu.cn/ 2>/dev/null | grep '502 Bad Gateway' -c` != '0' ]
then
    killall -9 php-fpm 2>/dev/null
    service php-fpm start >/dev/null
    echo "[ `date +'%h %d %T'` ] PHP-FPM died with 502 bad gateway, all processes restarted">>/path/to/log
fi
rm -f /var/lock/subsys/502
脚 本每次运行curl前在/var/lock/subsys/下创建一个锁文件“502”,结束运行时删除锁文件。当每次运行时发现锁文件存在就意味着上一 分钟的脚本仍未运行完毕,也就是说PHP卡死但nginx还未报502错误,此时依次结束掉curl和php-fpm进程并删除锁文件,随后在之后的命令 中重新启动PHP服务。这里curl和php-fpm进程的结束顺序不能颠倒,因为上一个脚本仍在运行,如果先结束php-fpm进程会导致curl收到 502错误并且重新启动PHP,和当前脚本之后的启动PHP操作很可能会同时发生,导致PHP服务被多次启动的情况。
不过仔细思考了一下就发现, 如果说上一个脚本在curl被结束掉之后运行速度太慢,直到当前脚本的创建锁操作完成之后才运行到删除锁操作一行,而当前脚本创建锁之后又一次在curl 命令上发生卡死,那么就会导致当前脚本实际上处于运行状态但锁文件已经不存在,也就是说锁已经无法发挥作用,下一个脚本又会重新创建锁并且启动curl探 测服务器状态,如果此时发生502错误又会导致PHP服务被多次启动。再三考虑后决定如果当前脚本运行时发现上一脚本运行的锁依然存在,那么就不再尝试创 建锁也不删除锁,而是结束掉curl命令使得上一脚本继续运行到删除锁,而当前脚本在不创建锁的情况下重启PHP服务并记录错误信息后直接退出,在未来直 到上一脚本的锁被删除才创建锁,使得锁能够正确指示脚本的执行情况。于是我又得到了以下脚本:
#!/bin/sh

if [ -e /var/lock/subsys/502 ]
then
    killall -9 curl 2>/dev/null
    killall -9 php-fpm 2>/dev/null
    service php-fpm start >/dev/null
    echo "[ `date +'%h %d %T'` ] PHP-FPM died with no response, all processes restarted">>/path/to/log
else
    touch /var/lock/subsys/502
    if [ `curl --connect-timeout 5 -I http://my.nuaa.edu.cn/ 2>/dev/null | grep '502 Bad Gateway' -c` != '0' ]
    then
        killall -9 php-fpm 2>/dev/null
        service php-fpm start >/dev/null
        echo "[ `date +'%h %d %T'` ] PHP-FPM died with 502 bad gateway, all processes restarted">>/path/to/log
    fi
    rm -f /var/lock/subsys/502
fi
这样一来就可以保证由于PHP进程卡死造成服务器不能正常工作的时间总小于1分钟了。
不过PHP-FPM的稳定性总是让人感觉蛋疼,希望新服务器尽快上线,有足够的性能运行Apache获取更好的稳定性。
以上如有错误,欢迎大家拍砖~

分享到:
评论

相关推荐

    PHP运行环境配置Centos 64位 PHP5.4 Nginx

    在构建PHP运行环境时,尤其是针对CentOS 64位操作系统,我们需要安装并配置一系列的组件,以便让PHP能够与Nginx web服务器协同工作...如果选择手动编译,你需要先安装必要的依赖,如`yum install php54 php54-php-fpm ...

    docker-laravel:使用docker-compose的Dockerized Gulp,PHP-FPM,MySQL和nginx的Laravel 5

    4. **Nginx**:Nginx是一个高性能的HTTP和反向代理服务器,它在此环境中作为Web服务器,接收HTTP请求并将其转发到PHP-FPM处理PHP脚本,然后将结果返回给客户端。 【详细说明】: - **Docker**:Docker是一种轻量级...

    centOS7 配置php+nginx+mysql 环境脚本

    本文将详细介绍如何在CentOS7操作系统上配置PHP+nginx+MySQL的环境,以及使用自动脚本来简化这一过程。这个环境是许多网站和应用程序的常用基础架构,它提供了强大的动态内容处理(PHP),高效的静态资源服务(nginx...

    nginx php配置

    Nginx 是一款高性能的 HTTP 和反向代理 Web 服务器,而 PHP 是一种通用开源脚本语言,常用于 Web 开发,两者结合可以构建出高效稳定的 Web 应用环境。本文档将详细介绍如何在 CentOS 6.5 64位系统上安装与配置 Nginx...

    php-fpm-healthcheck:符合POSIX的sh脚本,用于健康检查PHP fpm状态,只能用于ping或检查特定指标

    PHP fpm运行状况检查脚本随着容器化应用程序的发展,拥有php-fpm healthcheck变得越来越有用。 此POSIX兼容的sh脚本使用cgi-fcgi工具获取php-fpm状态页面,解析其结果,并允许您选择要检查的指标,并且还提供ping...

    Nginx+php(FastCGI)一键安装

    在Web服务器领域,Nginx以其高性能、低资源消耗而受到广泛关注。Nginx通常与PHP(通过FastCGI进程管理器)结合使用,以处理动态内容,从而构建高效稳定的Web环境。本教程将详细介绍如何在Linux系统上进行Nginx+...

    构架Nginx+PHP(Fastcgi)+MySQL+Memcache高性能web服务器

    1. **Nginx**:一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在高并发连接方面表现突出。 2. **PHP (FastCGI)**:一种用于处理动态网页的脚本语言,通过FastCGI模式运行可以极大提高PHP...

    CentOS 6.0最小化编译安装Nginx+MySQL+PHP+Zend

    在本教程中,我们将详细介绍如何在CentOS 6.0最小化安装环境下,手动编译安装Nginx、MySQL、PHP以及Zend Optimizer。这个过程主要用于学习和掌握服务器配置及软件编译安装技术,同时也适用于那些希望自定义配置组件...

    laravel:Laravel 应用程序的样板设置(NGINX、PHP-FPM 和 MySQL)

    此设置包含一台服务器( nodes/laravel.yml ),带有Nginx 、 PHP 5.5 (带有 php-fpm 和 composer)和MySQL 5.5 (带有“laravel”用户和“larvel”数据库) 我们还包含了一个任务( tasks/build-laravel.yml ):...

    企业级Zabbix应用监控实践1

    在企业级IT运维中,监控系统扮演着至关重要的角色,其中Zabbix是一个广泛使用的开源监控解决方案。本实践主要探讨如何利用Zabbix对企业级环境中的TCP、Nginx、PHP-FPM以及Tomcat进行高效监控。 1. **Zabbix监控TCP*...

    oneinstack安装多版本PHP

    在IT行业中,有时我们需要在同一个服务器上运行多个PHP版本,以支持不同应用的需求。这篇教程主要介绍了如何在已经安装了oneinstack并部署了PHP 5.6.0的CentOS 7系统上,添加一个新的PHP版本,例如PHP 7.3。下面将...

    ibmi-www-techstack-automation:[IBM i] [Nginx + PHP-FPM + ODBC + WWW菜单]自觉化的安装和配置自动化

    先决条件YUM安装在IBM i上( ) BASH终端(不要使用PASE) 通过具有适当特权的用户登录SSH入门Git克隆仓库或下载并将文件夹解压缩到目标服务器git clone ... 该脚本运行后,在5250会话上键入WWW以控制PHP-FPM和Nginx ...

    lnmp+fpm安装脚本

    ### 知识点详解 #### 一、LNMP+FPM 安装脚本概述 **LNMP**(Linux + Nginx + MySQL + ...此外,脚本中还包括了一些错误处理机制,如检查软件是否已存在、安装失败后的退出机制等,这些都增强了脚本的健壮性和可用性。

    nginx学习笔记

    以上是关于 Nginx 及其在分布式服务架构中的应用、与其他 Web 服务器的比较以及 LNMP 的安装配置过程的详细介绍。通过这些内容的学习,可以帮助读者更好地理解 Nginx 的特性和应用场景,以及如何搭建基于 Nginx 的 ...

    nginx-1.15.8.tar

    Nginx与PHP(通过php-fpm)或其它动态语言结合,常用于构建高性能的Web应用服务器架构,例如LAMP(Linux, Apache, MySQL, PHP)或LEMP(Linux, Nginx, MySQL, PHP)。 总的来说,"nginx-1.15.8.tar.gz"是一个用于在...

    dreamhost:在 NGINX 出现 502 错误时重新启动 Dreamhost PS

    标题 "dreamhost:在 NGINX 出现 502 错误时重新启动 Dreamhost PS" 涉及到的问题是关于 Dreamhost 服务器平台上的 NGINX web 服务器遇到 502 Bad Gateway 错误时的处理方法。502 错误通常意味着 NGINX 作为前端...

    阿里云的centos/linux服务器一键安装环境脚本

    在一键安装脚本中,Nginx会自动配置为Web服务器,用于处理HTTP请求,并可选择性地用作其他应用服务器(如PHP-FPM)的反向代理,将动态请求转发到相应后端。 2. **PHP**: PHP是一种广泛使用的开源服务器端脚本语言...

    PHP服务器部署x_部署到服务器

    在本文中,我们将深入探讨如何在CentOS 7.2系统环境下进行PHP服务器的部署,以便为Web应用程序提供服务。这个过程包括安装必要的依赖、PHP的版本安装与配置、OpenResty的安装以及PHP-FPM的配置。我们将遵循以下步骤...

    编译安装PHP7+LNMP+扩展技术文档

    如果编译过程中出现错误,可能需要安装额外的依赖包: ```bash yum install gcc gcc-c++ ncurses-devel perl ``` 5. **编译并安装 MySQL**: ```bash make && make install ``` 编译过程可能耗时较长,请...

Global site tag (gtag.js) - Google Analytics