Garey's Blog–FreeBSD/PHP/GoLang

十一月 28th, 2010

[转]Nginx提示502和504错误的终极解决方案

No Comments, Nginx, PHP, by garey, 5,163 views.

一、错误提示说明:

Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。

Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

二、错误提示原因分析:

解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,

而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。

php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout” ,但是这个值不是通用的,而是需要自己计算的。

计算的方式如下:

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

三、临时解决办法:

综上所述,Nginx提示502和504错误的临时解决办法是:

1、调整php-fpm.conf的相关设置:

<value name=”max_children”>32</value>

<value name=”request_terminate_timeout”>30s</value>

2、调整nginx.conf的相关设置:

fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;

四、终级解决方案:

标题3中所示的解决方案只能临时解决问题,而如果网站的访问量确实非常非常大,而Nginx+FastCGI只能对处理瞬间或短时间内的高并发有很好的效果,所以目前唯一的终极解决方案是:定时平滑重启php-cgi。

具体配置如下:

1、写一个非常简单的脚本:

#vi /home/www/scripts/php-fpm.sh

内容如下:

#!/bin/bash
# This script run at */1
/usr/local/php/sbin/php-fpm reload

2、将脚本添加至计划任务:

#crontab -e

内容如下:

*/1 * * * * /home/www/scripts/php-fpm.sh

注:为了省事起见,也可以不写脚本,直接在crontab里写入php-fpm的平滑重启命令。

原文:http://blog.chinaunix.net/u3/118349/showart_2320786.html

十一月 22nd, 2010

FreeBSD NTP服务器配置笔记

2 Comments, FreeBSD, by garey, 9,310 views.

一组服务器里面配置一台NTP服务器也是必要的,可以让所有服务器的时间同步。

一、配置NTP服务器

vi /etc/rc.conf

ntpd_enable=”YES”

vi /etc/ntp.conf

server www.freebsd.org prefer
server time.windows.com
server 127.127.1.0
fudge 127.127.0.1 stratum 5

restrict default ignore
restrict 127.0.0.0 mask 255.0.0.0
restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap

driftfile /var/db/ntp.drift

启动NTP服务:

/etc/rc.d/ntpd start

二、客户端配置

vi /root/scripts/synctime.sh

#!/bin/sh
/usr/sbin/ntpdate 192.168.0.100 #内网NTP服务器地址

chmod +x /root/scripts/synctime.sh
crontab -e

*/30 * * * * cd /root/scripts;./synctime.sh

这样客户端服务器每半小时就会和NTP服务器同步一次。

十一月 20th, 2010

FreeBSD 8.0 NFS服务器配置笔记

1 Comment, FreeBSD, by garey, 7,550 views.

一组服务器系统里面必然存在一台NFS服务器,实现多服务器的文件共享。
NFS服务器:nfs_server
NFS客户端:host1,host2,host3
共享目录:/share

一、NFS服务器配置

vi /etc/rc.conf

rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_flags="-r"

二、客户端配置

vi /etc/rc.conf

nfs_client_enable="YES"

三、文件共享配置

vi /etc/exports

/share  -alldirs    host1 host2 host3

共享设置好了之后,重启NFS服务器以启动NFS服务。

四、客户端挂载NFS文件系统

mount nfs_server:/share /share

或者写进fstab让系统启动时自动挂载文件系统:
vi /etc/fstab

nfs_server:/share   /share  nfs rw  0   0

权限问题:最好让所有服务器上操作NFS共享文件的用户ID相同。

关于NFS的其他问题请参考FreeBSD手册。

十一月 16th, 2010

[转]Linux图形界面正在发生根本性的变化

2 Comments, Linux, by garey, 7,698 views.

此文来自袁萌的博客最新文章,全文如下:

实际上,现在Linux图形界面已经非常美丽(或漂亮)了,但是,这种美丽的代价过于沉重。尤其是,Linux桌面的精美度与Win 7不相上下(两者就差那么一小点点儿)。怎么说呢?

大家知道,Linux系统源于”仿真”Unix操作系统,体格强壮,稳健异常,很像非洲的大河马,你根本别想把它“搬倒”。但是,它的图形界面使用的却是X.org系统,笨重无比,就像QQ那样,这是客观事实。X.org是二十多年前的老系统了,比Linux本身还要“老资格”,一老一小,两者不“般配”。X.org过于复杂,过于沉重,系统文件太多,致使Linux桌面系统运行速度上不去(当然,目前已经算是很快了),拖住了Linux桌面进一步提高品质的后腿。

2008年11月3日,Kristian Hogsberg提出一个大胆设想,给X“瘦身”,用C语言重写X服务器的全部源代码,搞一套轻型的X服务器,同时,Kristian给它其了个很好听的名字:Wayland(美国地名)显示服务器。那时,他为Wayland显示服务器搭起了一个非常粗糙的框架,只有3,200行C源代码。但是,Wayland开发计划的方向对头,思路正确,后面立即跟上一大帮追随者,大家动手干了起来。(注:请见“Wayland: A New X Server for Linux”,2008年11月3日)

Wayland: A New X Server for Linux  

现在的互联网“可牛”了,即时通讯(ICQ、IRC)非常便利,无论你在世界何处,干起活儿来就如同在一间办公室里面,说说笑笑真愉快,多人干活不觉累。如今两年才过去了,Wayland开发计划已经初见成效,展露头角。今年11月4日,Wayland轻型显示服务器就被Ubuntu奠基人Mark Shuttleworth先生“一眼看中”,决定吸收到Ubuntu 11.04新版本(2011.04.28发布)里面。对此,有不少人大发议论,“太冒进了”,“不可思议”,“简直是发疯”,……可见,老外也有这种“拖后退腿”的人。

刚才,我查看了几幅用Wayland制作的截图,感觉就是不一般,有一种很“轻快”的感觉,我以前从来没有见过这种类型所“人造图形”。我十分惊叹人类的智慧,竟然能够运用极为抽象的C语言编写出如此美妙的人间从来没有过的“图画”(或画面),真是绝了!11月14日,在最近召开的“Linux Plumbers Conference”(“Linux开发者大会”)上,又传出消息,Fedora 15(2011.05.10发布)新版本亦将采用Wayland显示服务器。如此一来,各种不同的声音就要少多了。但是,摆在Wayland前面的工作(或道路)还是很艰巨的,知难而上,这才是Linux开发者的本色!

说明:在不久将来(或在1~2年之后),Linux桌面的“容貌”必定会越来越漂亮(或亮丽),比Win 7更加漂亮(比苹果也不差!),就像一位体格健美的大姑娘,不愁嫁不出去,连XP用户也得瞅上一眼,说不准儿也会偷偷地把XP黄脸婆踢出去另寻新欢呢!

原文:http://www.oschina.net/news/13134/linux-gui-changing

十一月 13th, 2010

Web页面通过PHP脚本实现远程管理系统

1 Comment, FreeBSD, PHP, by garey, 11,352 views.

开发过程中,可能会出现一种情况,开发人员需要不停的重启服务器上的某个服务来进行测试,以便调试代码,当开发人员没有远程管理系统权限的时候,就需要系统人员进行配合,因此考虑在Web服务器上架设一个简易的远程管理系统,以便开发人员能够管理远程服务器。

实现想法:

远程管理系统的脚本可以使用expect来实现,再由Web执行PHP程序调用shell脚本实现远程管理。

实现过程:

1、安装expect程序

Web系统为FreeBSD,expect需要安装

cd /usr/ports/lang/expect
make install clean

2、编写expect脚本

vi /home/garey/scripts/rebootService.sh

#!/usr/local/bin/expect
set timeout 30
spawn ssh user@xxx.xxx.xxx.xxx
expect “password:”
send “1234r”
expect “~]$”
send “cd scriptsr”
expect “scripts]$”
send “./restartService.shr”
expect eof
exit

3、编写Shell脚本

vi /home/garey/scripts/php_rebootService.sh

#!/bin/sh
/home/garey/scripts/rebootService.sh > /dev/null &

4、编写PHP脚本

vi rebootservice.php

<?php
$cmd = ‘/home/garey/scripts/php_rebootService.sh’;
passthru($cmd);
?>

5、注意

SSH登陆需要证书,所以Web服务器执行PHP脚本的用户目录下,.ssh/known_hosts文件中必须存在xxx.xxx.xxx.xxx ssh-rsa XXXXXX…字样,没有的话,用该账号登陆一次远程服务器就可以了。

十月 18th, 2010

[摘]A记实录200 双百纪念:复仇伯明翰

No Comments, Arsenal, by garey, 3,524 views.

    俗话说,“人比人得死,货比货得扔”,比如昨天晚上几场比赛同时开球,就一下子看出差距了。广体、上体、北体扎堆儿直播曼联对西布朗,弄得阿森纳只能在网络上展示人体,还TM是分解动作图片展,怎么看都像是在放幻灯片。据此可以判断,阿森纳的影响力远不如曼联,当红魔球迷坐在电视机前惊呼范德萨被阿穆尼亚黄油附体的时候,我只能模模糊糊地看着宋大侠把赫莱布放倒,然后很NB地定格在那里,纹丝不动。所以我非常庆幸西甲没有像英超这么俗,让球员们大中午跑出来给亚洲踢球,否则恐怕国内各大电视台每周末都只能有两个选择:要么巴萨剧,要么皇马褂。

    感谢国家,感谢沙马赫,阿森纳没有三连败,我也终于可以名正言顺地开始第200次扯蛋。

    据有关领导说感谢的时候国家必须放到第一位,而我是发自肺腑地感谢。因为不久前我们高大威猛而且帅气的男足、男篮向全世界庄严宣布:“足球是踢的,篮球是打的,但是我们的足球是踢人的,我们的篮球是打架的。”我一边看着辽宁公安像捡破烂一样往局子里抓人,一边看着篮协像护犊子一样把美国鬼子揪出来罚款了事,一个不好的预感是:辽宁公安把足协的人抓利索了,大概就轮到篮协了。所以我衷心地感谢国家,让我死心塌地、别无选择地支持阿森纳,而且这样的感觉和那些在CCTV镜头前表示超高的通胀率对自己的幸福生活没有影响的大叔大妈不一样——我这个是真的,他们是托儿。

    沙马赫是另一个需要感谢的,这个新人的适应能力让我瞠目结舌,我说的适应不是指阿森纳,而是指英超。沙马赫的身体看起来并不十分强壮,在英超那些猛男后卫面前,毫无优势可言,但是本场比赛,沙马赫在对方禁区里只手遮天,一个人羞辱了伯明翰整个后防。有人说第一个点球涉嫌假摔,根据我当时观看的直播画面,查无此图,所以我不确定沙马赫的摔法能否直追埃布埃。托网络的福,三个进球我只看到了一个,就是沙马赫空中转体182度向后翻腾三周零一个多月的那个,他没把自己转蒙而且还能找到球门,简直是奇迹。截止目前,阿森纳一共进了18个球,其中11个跟沙马赫有血缘关系,NB闪闪,不服不行。

    事实上绝大部分阿森纳球迷都会对伯明翰印象深刻,当年马丁泰勒一脚飞铲让爱德华多恋上病床18个月,并从此花不再开,如果我没记错,那个赛季伯明翰最后降级了,也算是恶有恶报。今天伯明翰卷土重来,马丁泰勒已经不知所踪,却扑面而来一个赫莱布,真是人生何处不相逢。这个去巴萨前跃跃欲试,去巴萨后郁郁寡欢的盘带王已经没有了当初的风采,看来林子大了什么鸟都有,但不是什么鸟都可以进大林子,很容易迷路。

    威尔希尔最后时刻恶铲日基奇被直接红牌,这个场面我也没看到,不过连教授都说这个红牌罪有应得,估计动作肯定相当狂野,不知道是打开心了孩子气发作,还是真的想替爱德华多报仇雪恨。下一场对曼城,病床上还有那么多卧床不起的,威尔希尔又在读秒阶段自断经脉,这样下去,人不够使啊。

    那个叫陈贵的房地产学会会长表示,像北京这样的特大城市,就应该高房价、高租金、高生活成本,这样才能控制北京人口的无序增长,提高市民整体素质。我没兴趣评价这样的屁话有多少道理,至少像我这样的贱民出现在北京,在陈贵会长看来都属于瞎J8漂的一族。我只是忽然觉得陈贵会长的这番话套在现在的英超上非常合适,像英超这样的特级联赛就应该由切尔西或者曼城这样的大亨球队来玩,像曼联、利物浦这些欠一屁股债的得降级,西汉姆、伯明翰这样的流浪汉得拘留,阿森纳这样10万元以下的低档车得禁止上路,这样才能体现英超的身份,才能千年不倒,万古长青。千万别以为我在羡慕嫉妒恨,你就是真把阿森纳开除出英超,我也是阿森纳球迷,就如同我开一辆七手夏利,你陈会长不让我上路不给我上牌,那我就开回老家去,你母亲的陈会长带着你的房地产学会会员亲自来修路盖房子吧。

摘自:“arsenal_1997”的文章“A记实录200双百纪念:复仇伯明翰”

原文:http://news.arsenal.com.cn/html/a/8BOTM/

十月 12th, 2010

FreeBSD升级可得小心使用mergemaster

No Comments, FreeBSD, by garey, 5,328 views.

我的服务器9月30号升级了一次,结果挂了一个礼拜,直到10月9号才恢复过来。挂这么长时间最主要的问题当然是联通机房十一期间封网,但挂机的直接原因却是使用mergemaster不当造成的。

mergemaster的作用是合并配置文件,很多系统的配置文件已经被我们修改过了,但系统升级的时候很多配置文件也需要升级,这样就会有很多配置文件需要进行新旧版本的合并。我们在执行mergemaster的时候,都要去看这个配置文件是否经过修改,要比较更新版本对系统是否有影响,根据需要选择合并、安装或者保留操作。

我的服务器在升级完成之后,网络就起不来了,网卡没有IP地址,网络服务都没启动。在手动启动/etc/netstart的时候,报“ifn_start: not found.”。后来才发现,就是mergemaster的时候,/etc下面的netstart和/etc/rc.d下面的netif等网络相关的脚本都更新了版本,而/etc下面的network.subr这个文件却没更新,检查network.subr新版本的时候,才知道增加了ifn_start()等很多函数。把这个新版本覆盖旧版本之后,执行/etc/netstart,网络就正常了。

在没发生这个问题以前,在做系统升级使用mergemaster的时候,总没那么细心的看具体的每个文件,而是大概的随便选择i或者d,这样就容易造成这类问题发生。经过这件事之后,发现mergemaster这步千万不能小视了他。

八月 27th, 2010

Nginx目录自动加斜线”/”

No Comments, Nginx, by garey, 3,763 views.

将服务器的Web服务器从Apache换成Nginx后,发现子目录结尾不加“/”会造成无法访问。

如:http://garey.bsdart.org/test 就无法正常访问,而http://garey.bsdart.org/test/ 却可以正常访问。

在网上找到一个很好的解决方法:

在nginx.conf中增加:

http{

server_name_in_redirect off;

}

原文:http://www.vpser.net/manage/nginx-auto-add-slash.html

八月 23rd, 2010

FreeBSD安装HTTP_Upload库

No Comments, FreeBSD, PHP, by garey, 4,877 views.

FreeBSD ports安装php默认是没有安装pear库集的,需要另外安装:

cd /usr/ports/devel/pear
make install clean
rehash

然后通过pear安装HTTP_Upload库:

pear install HTTP_Upload

# pear install HTTP_Upload
downloading HTTP_Upload-0.9.1.tgz …
Starting to download HTTP_Upload-0.9.1.tgz (9,460 bytes)
…..done: 9,460 bytes
install ok: channel://pear.php.net/HTTP_Upload-0.9.1

安装完成之后,可以通过pear list查看已经安装了的pear库:

# pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.3   stable
Console_Getopt   1.2.3   stable
HTTP_Upload      0.9.1   stable
PEAR             1.9.0   stable
Structures_Graph 1.0.2   stable

八月 22nd, 2010

试试wordpress新浪微博插件

1 Comment, 未分类, by garey, 7,854 views.

应用介绍:

基于sina微博及WordPress的一个可以在WordPress快速发布微博的功能。用户发布在Wordpress文章同时,会自动发布一条消息到新浪微博,及时,而且省去手动同步成本。
(部分自建博客的用户可能无法直接用关联博客的形式同步文章)

http://wordpress.org/extend/plugins/wp-tsina/