- 浏览: 2540227 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 31817最近在配置本地nginx开 ... -
nginx 404会执行302跳转
2014-08-29 15:38 6018这个问题是应用中比较常见的一个问题了。尤其是对于静态文件, ... -
nginx配备中proxy_redirect的作用
2014-07-21 15:36 0http://www.docin.com/p-2925119 ... -
nginx配备中proxy_redirect的作用
2014-07-21 15:36 2637http://www.docin.com/p-292511 ... -
Linux运维常用命令 (转载)
2013-01-31 10:23 25261 删除0字节文件find-type f - ... -
[汇总]shell笔试
2013-01-24 17:32 3363http://president.blog.51cto.co ... -
检测 mysql 的sleep进程数
2013-01-04 14:13 1663#!/bin/sh 注:这个脚 ... -
【汇总】shell show收藏
2012-11-29 14:03 1269================== shell从文本取对应的 ... -
haproxy & LVS*(keepalived和heartbeat) & ng的比较
2012-11-29 10:04 7594http://network.51cto.com/art/ ... -
Shell中脚本变量和函数变量的作用域
2012-11-28 16:21 1375在shell中定义函 ... -
开发自动化系统管理脚本(界面式shell)
2012-11-28 16:00 1321此工具具有如下功能: (一)用户管理 1、修改root密码 ... -
你可能不知道的Shell
2012-11-26 13:41 1008!$ !$是一个特殊的环境变量,它代表了上一个命令的 ... -
批量修改远程linux服务器密码
2012-11-14 17:49 1535#!/bin/bash # BY kerryhu # MA ... -
清理/var/spool/clientmqueue目录下文件
2012-11-08 10:52 1143今天遇到和原文作者完全一样的情况:有一台机器需要改一下cron ... -
read case
2012-11-01 16:55 969read -p "请输入安装程序编号:" ... -
shell实现将2个文件逐行交替存入一个文件中
2012-10-24 15:31 1616#!/bin/bash P ... -
关于shell脚本编程的10个最佳实践
2012-09-20 11:37 1560每一个在UNIX/Linux上工作的程序员 可能都 ... -
导出bin log时间段脚本datarecover.sh
2012-09-06 13:34 1243修改 _binlogdir='/data/mysql/m ... -
增量文件内容other.php
2012-08-31 16:13 1194#增量文件内容other.php i ... -
Linux一个简单的每秒执行命令shell脚本
2012-08-17 15:02 3361迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器 ...
相关推荐
在构建PHP运行环境时,尤其是针对CentOS 64位操作系统,我们需要安装并配置一系列的组件,以便让PHP能够与Nginx web服务器协同工作...如果选择手动编译,你需要先安装必要的依赖,如`yum install php54 php54-php-fpm ...
4. **Nginx**:Nginx是一个高性能的HTTP和反向代理服务器,它在此环境中作为Web服务器,接收HTTP请求并将其转发到PHP-FPM处理PHP脚本,然后将结果返回给客户端。 【详细说明】: - **Docker**:Docker是一种轻量级...
本文将详细介绍如何在CentOS7操作系统上配置PHP+nginx+MySQL的环境,以及使用自动脚本来简化这一过程。这个环境是许多网站和应用程序的常用基础架构,它提供了强大的动态内容处理(PHP),高效的静态资源服务(nginx...
Nginx 是一款高性能的 HTTP 和反向代理 Web 服务器,而 PHP 是一种通用开源脚本语言,常用于 Web 开发,两者结合可以构建出高效稳定的 Web 应用环境。本文档将详细介绍如何在 CentOS 6.5 64位系统上安装与配置 Nginx...
PHP fpm运行状况检查脚本随着容器化应用程序的发展,拥有php-fpm healthcheck变得越来越有用。 此POSIX兼容的sh脚本使用cgi-fcgi工具获取php-fpm状态页面,解析其结果,并允许您选择要检查的指标,并且还提供ping...
在Web服务器领域,Nginx以其高性能、低资源消耗而受到广泛关注。Nginx通常与PHP(通过FastCGI进程管理器)结合使用,以处理动态内容,从而构建高效稳定的Web环境。本教程将详细介绍如何在Linux系统上进行Nginx+...
1. **Nginx**:一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在高并发连接方面表现突出。 2. **PHP (FastCGI)**:一种用于处理动态网页的脚本语言,通过FastCGI模式运行可以极大提高PHP...
在本教程中,我们将详细介绍如何在CentOS 6.0最小化安装环境下,手动编译安装Nginx、MySQL、PHP以及Zend Optimizer。这个过程主要用于学习和掌握服务器配置及软件编译安装技术,同时也适用于那些希望自定义配置组件...
此设置包含一台服务器( nodes/laravel.yml ),带有Nginx 、 PHP 5.5 (带有 php-fpm 和 composer)和MySQL 5.5 (带有“laravel”用户和“larvel”数据库) 我们还包含了一个任务( tasks/build-laravel.yml ):...
在企业级IT运维中,监控系统扮演着至关重要的角色,其中Zabbix是一个广泛使用的开源监控解决方案。本实践主要探讨如何利用Zabbix对企业级环境中的TCP、Nginx、PHP-FPM以及Tomcat进行高效监控。 1. **Zabbix监控TCP*...
在IT行业中,有时我们需要在同一个服务器上运行多个PHP版本,以支持不同应用的需求。这篇教程主要介绍了如何在已经安装了oneinstack并部署了PHP 5.6.0的CentOS 7系统上,添加一个新的PHP版本,例如PHP 7.3。下面将...
先决条件YUM安装在IBM i上( ) BASH终端(不要使用PASE) 通过具有适当特权的用户登录SSH入门Git克隆仓库或下载并将文件夹解压缩到目标服务器git clone ... 该脚本运行后,在5250会话上键入WWW以控制PHP-FPM和Nginx ...
### 知识点详解 #### 一、LNMP+FPM 安装脚本概述 **LNMP**(Linux + Nginx + MySQL + ...此外,脚本中还包括了一些错误处理机制,如检查软件是否已存在、安装失败后的退出机制等,这些都增强了脚本的健壮性和可用性。
以上是关于 Nginx 及其在分布式服务架构中的应用、与其他 Web 服务器的比较以及 LNMP 的安装配置过程的详细介绍。通过这些内容的学习,可以帮助读者更好地理解 Nginx 的特性和应用场景,以及如何搭建基于 Nginx 的 ...
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 web 服务器遇到 502 Bad Gateway 错误时的处理方法。502 错误通常意味着 NGINX 作为前端...
在一键安装脚本中,Nginx会自动配置为Web服务器,用于处理HTTP请求,并可选择性地用作其他应用服务器(如PHP-FPM)的反向代理,将动态请求转发到相应后端。 2. **PHP**: PHP是一种广泛使用的开源服务器端脚本语言...
在本文中,我们将深入探讨如何在CentOS 7.2系统环境下进行PHP服务器的部署,以便为Web应用程序提供服务。这个过程包括安装必要的依赖、PHP的版本安装与配置、OpenResty的安装以及PHP-FPM的配置。我们将遵循以下步骤...
如果编译过程中出现错误,可能需要安装额外的依赖包: ```bash yum install gcc gcc-c++ ncurses-devel perl ``` 5. **编译并安装 MySQL**: ```bash make && make install ``` 编译过程可能耗时较长,请...