- 浏览: 2509601 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (676)
- linux运维 (157)
- php (65)
- mysql (78)
- nginx (27)
- apche (18)
- framework (6)
- windows (9)
- IDE工具 (23)
- struts2 (7)
- java (13)
- 移动互联网 (14)
- memcache redis (23)
- shell基础/命令/语法 (37)
- shell (50)
- puppet (4)
- C (11)
- python (9)
- 产品经理 (27)
- Sphinx (4)
- svn (12)
- 设计构建 (12)
- 项目管理 (44)
- SEO (1)
- 网站架构 (26)
- 审时度势 (42)
- 网络 (14)
- 激发事业[书&视频] (81)
- 其它 (12)
- 摄影 (8)
- android (21)
最新评论
-
zhongmin2012:
原文的书在哪里
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
renzhengzhi:
你好,请问个问题,从master同步数据到slave的时候,s ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
ibc789:
你好,看了你的文章,我想请教个问题, 我在用 redis的时候 ...
redis 的两种持久化方式及原理 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
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获取更好的稳定性。
以上如有错误,欢迎大家拍砖~
发表评论
-
nginx access_log 完全关闭
2015-04-14 14:40 31746最近在配置本地nginx开 ... -
nginx 404会执行302跳转
2014-08-29 15:38 5952这个问题是应用中比较常见的一个问题了。尤其是对于静态文件, ... -
nginx配备中proxy_redirect的作用
2014-07-21 15:36 0http://www.docin.com/p-2925119 ... -
nginx配备中proxy_redirect的作用
2014-07-21 15:36 2543http://www.docin.com/p-292511 ... -
Linux运维常用命令 (转载)
2013-01-31 10:23 24811 删除0字节文件find-type f - ... -
[汇总]shell笔试
2013-01-24 17:32 3316http://president.blog.51cto.co ... -
检测 mysql 的sleep进程数
2013-01-04 14:13 1592#!/bin/sh 注:这个脚 ... -
【汇总】shell show收藏
2012-11-29 14:03 1220================== shell从文本取对应的 ... -
haproxy & LVS*(keepalived和heartbeat) & ng的比较
2012-11-29 10:04 7514http://network.51cto.com/art/ ... -
Shell中脚本变量和函数变量的作用域
2012-11-28 16:21 1333在shell中定义函 ... -
开发自动化系统管理脚本(界面式shell)
2012-11-28 16:00 1288此工具具有如下功能: (一)用户管理 1、修改root密码 ... -
你可能不知道的Shell
2012-11-26 13:41 969!$ !$是一个特殊的环境变量,它代表了上一个命令的 ... -
批量修改远程linux服务器密码
2012-11-14 17:49 1497#!/bin/bash # BY kerryhu # MA ... -
清理/var/spool/clientmqueue目录下文件
2012-11-08 10:52 1097今天遇到和原文作者完全一样的情况:有一台机器需要改一下cron ... -
read case
2012-11-01 16:55 916read -p "请输入安装程序编号:" ... -
shell实现将2个文件逐行交替存入一个文件中
2012-10-24 15:31 1571#!/bin/bash P ... -
关于shell脚本编程的10个最佳实践
2012-09-20 11:37 1523每一个在UNIX/Linux上工作的程序员 可能都 ... -
导出bin log时间段脚本datarecover.sh
2012-09-06 13:34 1182修改 _binlogdir='/data/mysql/m ... -
增量文件内容other.php
2012-08-31 16:13 1150#增量文件内容other.php i ... -
Linux一个简单的每秒执行命令shell脚本
2012-08-17 15:02 3255迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器 ...
相关推荐
PHP fpm运行状况检查脚本随着容器化应用程序的发展,拥有php-fpm healthcheck变得越来越有用。 此POSIX兼容的sh脚本使用cgi-fcgi工具获取php-fpm状态页面,解析其结果,并允许您选择要检查的指标,并且还提供ping...
此设置包含一台服务器( nodes/laravel.yml ),带有Nginx 、 PHP 5.5 (带有 php-fpm 和 composer)和MySQL 5.5 (带有“laravel”用户和“larvel”数据库) 我们还包含了一个任务( tasks/build-laravel.yml ):...
先决条件YUM安装在IBM i上( ) BASH终端(不要使用PASE) 通过具有适当特权的用户登录SSH入门Git克隆仓库或下载并将文件夹解压缩到目标服务器git clone ... 该脚本运行后,在5250会话上键入WWW以控制PHP-FPM和Nginx ...
关于此脚本旨在使用 Nginx 堆栈在全新的 DV Developer 服务器安装上自动部署 WordPress。概述此脚本需要 Ubuntu 14.04。 它为 WordPress 安装和配置所需的操作系统包和 Percona MySQL/Nginx/PHP-FPM/Postfix 部署...
该脚本旨在使用Nginx堆栈在全新的(ve)服务器安装上自动化WordPress的部署。 概述 该脚本需要Ubuntu 11.04。 它为WordPress安装和配置所需的OS软件包以及MySQL / MySQL / Nginx / PHP-FPM / Postfix部署堆栈。 所有...
Linux平台一键部署Apache / Nginx + PHP + MySQL环境支持系统CentOS / RedHat 6/7环境类型以下为支持的环境类型,请选择一种环境进行部署Nginx的阿帕奇MySQL Nginx + PHP + PHP-FPM 阿帕奇+ PHP Nginx + PHP + ...
Debian6系统下使用之前发布的“DebianLNMP”服务器软件套件,DebianLNMP一键安装包是一个快捷的服务器套件,轻轻松松全自动安装LNMP(Nginx、MySQL、PHP、phpMyAdmin)可直接用再生产环境。现在我们已经在Debian/...
请不要在Ubuntu 18.04上使用此版本。 适用于Ubuntu 16.04的LaraScale软件包(14.04) 适用于Ubuntu 16.04(14.04)的简单且高性能的Laravel 5.4安装软件包(shell脚本) 配套 PHP7 + MySQL 5.5(Percona XtraDB...
21、改进面板amh.sh安装脚本,解决IP获取、安装状态准确判断等问题,与优化安装脚本,初始软件包最小化安装等。 22、面板增加在线显示软件安装进度。 23、改进面板扩展程序,软件安装时间不受限制,同时关闭当前...
自制的nginx,PHP5.6和mysql安装脚本。 它能做什么? 通过Homebrew安装NGINX,PHP和MYSQL。 用php-fpm配置nginx。 配置默认的nginx虚拟主机。 使/var/www您的文档根目录。 ##笔记 当前将这些服务添加到用户...
请在执行任何脚本之前下载所有文件。 它们之间有几个依赖关系。 您可以使用: sudo yum install wget unzip -y wget https://github.com/simplyjarod/server/archive/master.zip unzip master.zip && cd server-...
Symfony 5的完整堆栈 基本信息 以前的要求 该堆栈需要安装和 。 正在安装 克隆此存储库 修改配置: ... nginx :安装了应用程序卷的Nginx Web服务器容器。 app :也安装了应用程序卷PHP-FPM容器。 postgr
无业游民的大麻锅炉板一个带有ubuntu 14.04,nginx,php5-fpm,mysql服务器的流浪汉样板#... 在Provisioner.sh运行时,脚本会删除系统上的库存副本,并在其位置上创建指向位于_vagrant目录中的自定义副本的符号链接。
适用于全新Debian(甚至可能类似于Debian)环境的安装程序脚本,可用于在Google Cloud Platform上快速启动Web开发。 sudo ~/devenv/install.sh 使用 ? 改为运行以下命令: sudo ~/devenv/cloudshell.sh 配套 该...
######JDK:无需改动jdk-7u67-linux-x64.rpm包由于过大,建议手动下载######NGINX:无需改动######PHP:在conf目录下包含两个配置文件 php-fpm.conf php.ini, 可以自行进行优化配置, 也可以选择不改动这两个文件######...
威胁情报查询前端iplocationPHP语言开发,IP地理位置查询API,包含Nginx配置blackwtredis读取威胁情报,写入Redis Shell的脚本,以及Crontab使用说明本项目威胁情报会定期自动更新,威胁情报存储到Redis,请自行安装...
使用shell脚本安装lnmp,纯粹是偷懒,平时安装一些东西都写成脚本了,方便以后在其他机器安装的时候不用再去查找文档。 PHP版本5.6.6 MYSQL版本5.6.26 NGINX版本1.15.6 2、环境说明 阿里云ECS(1G1核)CentOS 7.4...
`` $ curl -fsSL get.docker.com -o get-docker.sh ```` $ sudo sh get-docker.sh --mirror Aliyun ``执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。启动 Docker ...