Archive for 服务器管理

防止Apache并发连接太多、超负荷运行导致崩溃的方法

Monday, June 23rd, 2008

此方法是定期检查Apache的进程数,发现连接过多然后自动重启Apache,虽然有些笨,但还是比较有效的。
新建一Shell脚本文件,命名为checkapache,内容如下:
#!/bin/sh -e
#
# Check overload apache2
#

#最大Apache进程数,超过则重启Apache
maxpids=600
#检查进程时间间隔
interval=10
#日志文件
logfile=”/var/log/checkapache.log”
echo ” Starting CheckApache MaxConn: $maxpids  ” >> $logfile
date >> $logfile
while [ 1 ]
do
pnums=$(ps ax | grep “[/]usr/sbin/apache2″ | wc -l)
if [ “$pnums” = “0″ ]; then
sleep 5
echo “**********************************************”  >> $logfile
date  >> $logfile
echo “———Starting apache2….—————”  >> $logfile
/etc/init.d/apache2 start  >> $logfile
fi
#pids=$(ps ax | grep “[/]usr/sbin/apache2″ | awk ‘{print $1}’)
if [ $pnums -gt […]

VPS虚拟专享主机使用经历

Thursday, June 19th, 2008

VPS(Virtual Private Server),虚拟私有主机,专享主机,即把一台服务器分割成好几部分,每一部分都是一个完整的操作系统,共用这台机器的硬件资源。
使用VPS就像在使用一台完整的服务器一样,可以自由的安装软件,建任意个站点,一般来讲还会分配一个独立的IP地址,还是一件蛮不错的事情。
VPS大部分使用者为拥有多个网站的站长,但各网站访问量都不大,因为每个网站的访问量都不大,如果去购买虚拟主机空间的话,成本是非常高的,比如我要建20个站,哪么得买20个虚拟主机空间(国内绝大部分的虚拟主机空间都只能建一个站),就算每个虚拟主机空间一年500元计算,也得10000元一年,这个成本也是不低了,很不划算。
如果租一台VPS,则一年的费用大概3000左右(不同的服务器、空间和带宽价格相差会很大) ,在这台VPS上,可以建任意多个站点,只要你愿意,只要网站访问量引起的内存资源足够用。
因为VPS是一台服务器分割成若干个部份,硬件资源都是共享的,所以现实中还是不能建任意多个站点,受限于这台VPS的内存和硬盘空间。,硬盘一般来讲不是很大问题,大部分是内存问题了。
比如服务器为单CPU Xeon3.0,内存256,10G的VPS配置,一般来讲250元(每月)就可以租到了,如果能分配到512M内存就更好,所以,对于VPS来讲最大的性能瓶颈就是内存了,分配的这256M内存被操作系统占去不少,余下给程序网站的可用的内存就非常少了,所以优化网站程序也是很关键的事情。
在VPS上,再一点就是PHP+MySQL会比Access+ASP消耗更少的资源和更加稳定,Access文件几乎全部被加载到内存,而且不容易释放,比如一个MDB数据库文件有2M,如果有10个这样的网站,每个网站访问量日PV100,哪就非常不稳定了,内存很容易就告急,导致无法建立新链接。但MySQL+PHP会好不少,在使用过程,有一网站数据库大概为2G,日访问3千PV,非常稳定,而且消耗VPS的资源很少。所以建议用ASP+Access的站长在租用VPS之前要考虑清楚。

两款国外空间比较:DreamHost与Bluehost

Monday, June 9th, 2008

选择国外空间无非是以下三个原因:不想备案、迎合国外用户访问、便宜且可以在一块空间上建立多个站点。当然,也不排除有些站长是为了做色情类网站。
同很多站长一样,希望能够找到便宜、速度快、服务好的国外空间。经过长时间的比较和阅读网友们对国外空间的评价,我最初选择的国外空间是Bluehost, 然后弃Bluehost奔DreamHost了。以下列出两个主机提供商的一些比较:
A,功能
Bluehost的所拥有的功能:(每月6.95美元)
UNLIMITED Hosting Space (NEW!)空间不限!
UNLIMITED File Transfer (NEW!)文件传输(流量)不限!
web hostingHost UNLIMITED Domains!!!可以建任意个站点!
2,500 POP/Imap Email Accounts 最多可以建2500个信箱
SSH (Secure Shell), SSL, FTP, Stats 可以支持SSL,FTP以及SSH(远程控制,这个比较爽)
CGI, Ruby (RoR), Perl, PHP, MySQL 支持PHP+MySQL,不支持ASP
2000/2002 Front Page Extensions
Free Domain Forever! 免费送一个国际域名
Free Site Builder (NEW) 傻瓜建站系统
24/7 Superb/Responsive Sales/Support 7*24服务支持
DreamHost所拥有的功能:(大概每月5.95美元左右)
500 GB Disk Storage 500G的空间
5 TB Monthly Bandwidth 每月5T流量限制
97-Day Money-Back Guarantee 97天不满意退款保证
支持无限建站,无限MySQL等数据库
其实从两个主机商所提供的功能来看,DreamHost与Bluehost相差不多,Bluehost近期推出的不限空间,似乎很吸引人,但实际上,根本就用不到500G的空间,如果你的站的数据量这么大,哪么,相信网站的收入也能足够去购置单独的服务器了,还有一点就是Bluehost提供的功能中,不限带宽,这一点貌似很吸引人,但在实际的使用中,根本用不了多少带宽,实际上,如果网站访问量稍大一些,肯定占用不少CPU和资源,Bluehost停你账号就是家常便饭了,所以,从表面上看来,Bluehost是比Dreamhost提供的服务要强,但实际上根本用不上这么多。
Bluehost一个非常令人头痛的问题就是对CPU限制得太严格了,在Bluehost上做采集站或者WEB代理服务基本上很难,更别说做下载站了,流量稍微一大,就被提示CPU超负荷,被挂起,要不就直接把你的整个空间都给停了,根本不通知你,就直接把账号给停了,我在使用Bluehost过程中,估计有五分之一的时间是被他们封停状态,这也是我后来转到Dreamhost上的原因,从这点上来讲,Bluehost非常的垃圾,垃圾中的精品!
B,价格
Bluehost每月6.95美元, 但Dreamhost每月是5.95美元,但这里存在一个误区,Bluehost的空间初始注册和空间续费都是6.95美元每月,而Dreamhost却只是在初始注册空间的时候每月5.95美元(如果有优惠码可以更便宜),但Dreamhost在一年后再续费的话,价格就贵很多了(每月10美元左右),并且不能使用优惠码,有人说这是一个营销策略也有人说是Dreamhost的一个陷阱,对于Bluehost,一定要注意一点就是如果空间到期,他会自动续费并自动信用卡里面扣款(如果是用信用卡支付的话)。
C,服务
Bluehost提供在线服务,可以在线与Bluehost的工作人员交谈,如果你的英文过得去的话,但要注意美国的工作时间与国内有一个时差的,Dreamhost不提供网络在线服务(Online Chat),在这一点上与Bluehost相比有些欠缺,但Dreamhost的邮件回复速度还是蛮快的,总体来讲,两家公司的服务态度都还蛮不错的。
D,访问速度
从国内的网通或者电信综合起来,访问Dreamhost速度要比Bluehost稍微快一些,但Bluehost经常被封,这一点也是要注意的,Dreamhost还没有被封过吧。
推荐:虽然Dreamhost价格贵一点,但强烈推荐大家不要使用Bluehost的空间,还有就是hostmonster.com(和Bluehost提供一样的服务,据说是一家公司来的)。

35互联(中频)的DNS服务器(DNS-DIY)崩溃了…

Thursday, March 6th, 2008

在这之前,一直认为DNS-DIY是国内最好的DNS服务,但近几个月来,本人在上面的好几个域名,每天有都有好几个小时无法解析,今天更为离谱,从13:40开始,域名完全无法解析了,试过国内多个DNS服务器都没有解析记录了,打电话给35互联,得知他们的DNS服务器被人大规模攻击,已经完全无法解析,崩溃了,恢复日期无法得知,,,郁闷啊。

Apache崩溃的几个很可能的原因

Thursday, December 20th, 2007

近来网站访问量增加很快,于是出来一大堆问题,折腾了好几天,记下一些操作总结,共享之,先说说Apache崩溃的一些可能性和相应的处理方法,从最简单的排查:
1,磁盘空间不足
这是最容易忽视的问题,现在的磁盘便宜,一般人的机器磁盘的空间都是有很多剩余的,不要想当然的认为不是你磁盘空间的问题,也许是日志?或者是你的缓存文件突然吃光了你的磁盘呢?df -h一下很容易的事情,磁盘空间不足会造成很多怪异的现象,Apache进程不断堆积不释放,由于出现“could not make child process * exit,attemption to continue anyway…”之类的错误日志,最后Apache吃掉整个机器的内存,SSH不能登录,不能Reboot,不能Kill进程,,只能强行重启了
2,检查Apache的日志达到2G!!
通常对自己的日志都有一个大概的估计,但检查一下Apache的日志大小也是很有必要的,特别是Apache的Access日志,但近来一些极端无聊的所谓的垃圾人,不断扫描你的机器的目录,试图在你机器上下载你的Wwwroot.rar,下载你的Data.mdb,草,还在你的PHP的脚本目录里面扫描你的Upload.asp文件,(做个Rewrite,喂给这些扫描一些木马或者广告,呵呵,我就是这么干的),这样的垃圾人给Apache的Error日志产生很多垃圾信息。 如果Apache日志达到2G(限制),Apahce很可能出现一些无法解释的怪异的现象,Httpd进程无法启动,或者一启动,马上又停掉。
3,DDos攻击
通常这类的方法检查和处理比较麻烦,排除了你机器本身原因,Apache配置的原因,发现Apache的还是不停的崩溃,哪监测一下服务器网络连接情况,用脚本看一下连接情况:netstat -na|grep ESTABLISHED|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -r -n,或者统计一下请求过多的的IP(netstat -an | grep -v LISTEN | awk ‘{print $5}’ | awk ‘BEGIN { FS=”:” } { Num[$1]++ } END { for(i in Num) if(Num[i]>8) { print i} }’ | xargs -i[] iptables […]

两种方法有效解决MySQL server has gone away问题

Tuesday, September 18th, 2007

近来在做一些小站,其中要用到一个WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了MySQL的wait-timeout时间,然后当网页内容被抓回来后,准备插入到MySQL的时候,发现MySQL的连接超时关闭了,于是就出现了“MySQL server has gone away”这样的错误提示,解决这个问题,我的经验有以下两点,或许对大家有用处:
第一种方法,当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接(mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到(show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小时。情况由你的服务器和站点来定。
第二种方法:
这也是我个人认为最好的方法,即检查MySQL的链接状态,使其重新链接。
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧:
这是我的的数据库操作类中间的一个函数
function ping(){
if(!mysql_ping($this->link)){
mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键
$this->connect($this->t_dbhost,$this->t_dbuser,$this->t_dbpw,$this->t_dbname,$this->t_pconnect);
}
}
我需要调用这个函数的代码可能是这样子的
for($i=0;$i<10;i++){
$str=file_get_contents(’http://www.aol.com’);
}
$db->ping(); //经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接
$db->query(’select * from table’);
ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。