服务器和网站类
如何选择合适的DNS解析服务器?
0最合适的DNS服务器就是最快的DNS服务器。当然安全性也需要考虑一下。本文的写作完全依赖于http://www.manu-j.com/blog/opendns-alternative-google-dns-rocks/403/ 给出的材料。
首先贴出大牛的脚本 by Stevan Bajić
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/sh isp=$(dig +noall +stats 2>&1 | awk '$2~/^SERVER:$/{split($3,dnsip,"#");print dnsip[1]}'); m="-------------------------------------------------------------------------------"; s=" "; h="+${m:0:25}+${m:0:12}+${m:0:12}+${m:0:12}+${m:0:12}+${m:0:12}+"; header=("Domain${s:0:23}" "Your ISP${s:0:10}" "Google${s:0:10}" "4.2.2.2${s:0:10}" "OpenDNS${s:0:10}" "DNS Adv.${s:0:10}"); echo "${h}"; echo "| ${header[0]:0:23} | ${header[1]:0:10} | ${header[2]:0:10} | ${header[3]:0:10} | ${header[4]:0:10} | ${header[5]:0:10} |"; echo "${h}"; for i in "lifehacker.com" "facebook.com" "manu-j.com" "reddit.com" "tb4.fr" "bbc.co.uk"; do ii="${i}${s:23}"; echo -ne "| ${ii:0:23} |"; for j in "${isp}" "8.8.8.8" "4.2.2.2" "208.67.222.222" "156.154.70.1"; do r="${s:10}$(dig +noall +stats +time=9 @${j} ${i} 2>&1 | awk '$2~/^Query$/{print $4" "$5}')"; echo -ne " ${r:${#r}-10} |"; done echo -ne "\n${h}\n"; done |
保存后chmod 700 ,执行, 然后贴出我的测试结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | zhuwenhao:~ # ./dns-speed-test.sh +-------------------------+------------+------------+------------+------------+------------+ | Domain | Your ISP | Google | 4.2.2.2 | OpenDNS | DNS Adv. | +-------------------------+------------+------------+------------+------------+------------+ | lifehacker.com | 139 msec | 27 msec | 2 msec | 0 msec | 9 msec | +-------------------------+------------+------------+------------+------------+------------+ | facebook.com | 140 msec | 27 msec | 1 msec | 0 msec | 9 msec | +-------------------------+------------+------------+------------+------------+------------+ | manu-j.com | 240 msec | 27 msec | 1 msec | 0 msec | 10 msec | +-------------------------+------------+------------+------------+------------+------------+ | reddit.com | 137 msec | 28 msec | 1 msec | 0 msec | 9 msec | +-------------------------+------------+------------+------------+------------+------------+ | tb4.fr | 177 msec | 27 msec | 2 msec | 0 msec | 9 msec | +-------------------------+------------+------------+------------+------------+------------+ | bbc.co.uk | 145 msec | 27 msec | 1 msec | 0 msec | 9 msec | +-------------------------+------------+------------+------------+------------+------------+ |
比较之下,看来最合适我的DNS就是OpenDNS了。修改配置脚本
/etc/resolv.conf 即可搞定.
1 2 | nameserver 208.67.222.222 nameserver 208.67.220.220 |
修改服务器的时区
0cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改前后用 date 命令查看一下,就知道成功了没.
全球路由DNS服务器
0全球只有13台路由DNS根服务器,在13台路由服务器中,名字分别为“A”至“M”,其中10台设置在美国,另外各有一台设置于英国、瑞典和日本。下表是这些机器的管理单位、设置地点及最新的IP地址。
名称 管理单位及设置地点 IP地址
A INTERNIC.NET(美国,弗吉尼亚州) 198.41.0.4
B 美国信息科学研究所(美国,加利弗尼亚州) 128.9.0.107
C PSINet公司(美国,弗吉尼亚州) 192.33.4.12
D 马里兰大学(美国马里兰州) 128.8.10.90
E 美国航空航天管理局[NASA](美国加利弗尼亚州) 192.203.230.10
F 因特网软件联盟(美国加利弗尼亚州) 192.5.5.241
G 美国国防部网络信息中心(美国弗吉尼亚州) 192.112.36.4
H 美国陆军研究所(美国马里兰州) 128.63.2.53
I Autonomica公司(瑞典,斯德哥尔摩) 192.36.148.17
J VeriSign公司(美国,弗吉尼亚州) 192.58.128.30
K RIPE NCC(英国,伦敦) 193.0.14.129
L IANA (美国,弗吉尼亚州) 198.32.64.12
DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成为网络可以识别的IP地址。
监控剩余内存,自动重启Apache和Mysql,使用Crontab和Daemon方法.
0写下文本,源于我最近一次失败的尝试。我的VPS是限定最高内存用量的,上限为2G,如果内存用完了,就会出现Cannot allocate memory无法获取可用内存的故障,导致SSH无法远程登录,也网站性能也急剧下降。这个问题可以通过限制Apache和Mysql的配置来预防。可以做保守配置来杜绝这样的问题。但是由于我的配置比较乐观,可能在某些木马攻击或者劣质网站爬虫的骚扰下,前几天出现过一次内存不足问题,导致不得不请求服务商帮我重启了一下运行了60多天的服务器,让我非常伤心。所以我尝试了一下,可否通过建立脚本,监控运行状况来自动重启Apache和Mysql来释放内存,避免重启服务器,好让我的uptime千秋万代地积累下去?
最容易想到的就是采用Crontab来做了,下面是我第一次的尝试。脚本如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #check free memory and decide how to maintain system. #Albert Zhu 朱文昊 V0.1 http://zhuwenhao.com MinFreeMem='100000' #only restart apache below this number BadFreeMem='10000' #retart apache and mysql below this number CurrentMem=$(cat /proc/meminfo | grep -i MemFree | cut -d ':' -f2 | cut -d 'k' -f1) CurrentMem=$(($CurrentMem+0)) #echo "CurrentMem="$CurrentMem #echo "MinFreeMem="$MinFreeMem #echo "BadFreeMem="$BadFreeMem if [ $BadFreeMem -gt $CurrentMem ]; then echo `date "+%Y-%m-%d-%H-%M-%S"` echo "CurrentMem="$CurrentMem echo "restarted two service" service apache2 restart; service mysql restart; else if [ $MinFreeMem -gt $CurrentMem ]; then echo `date "+%Y-%m-%d-%H-%M-%S"` echo "CurrentMem="$CurrentMem echo "restarted apache" service apache2 restart; fi echo `date "+%Y-%m-%d-%H-%M-%S"` echo "Free Memory is Good!" fi |
然后使用cron job来自动运行 crontab –e 后加入
1 | * * * * * ./memmonitor.sh >> ./memmonitor.log |
这样我的脚本会每分钟运行一下,怎么样?感觉很爽吧!于是压力测试,Apache在强大的并发连接下,很快内存飙升,2G内存立马没了。结果,当Cron job醒来后,内存不足,自己都运行不起来,崩溃~~~
分析一下,感觉是cron job每分钟运行一次,太慢!造成对内存感觉不灵敏,等到发现,已经晚了。cron设计最快也就是每分钟运行。于是改用死循环来做,也就是做成守护进程Daemon,对内存每秒钟检查一次,够好了吧?
继续压力测试,依然崩溃~~~~~
于是review脚本,发现 service apache2 restart这样的语句,本身需要较大的内存,而且貌似要等到apache的子进程把当前服务提供完后,才终止(这点我不是很确定,不要太相信)。如果在DDOS下,哪里有空等服务结束?应当直接kill掉。修改脚本为如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #check free memory and decide how to maintain system. #Albert Zhu 朱文昊 V0.2 http://zhuwenhao.com KillAllApacheSon () { ListPIDtoKill=$(ps -u wwwrun | grep httpd | cut -d ' ' -f1) echo "List PID to Kill "$ListPIDtoKill i=1 while [ true ]; do GetPIDtoKill=$(echo ${ListPIDtoKill} | cut -d ' ' -f${i}) GetPIDtoKill=$(($GetPIDtoKill+0)) if [ $GetPIDtoKill -gt 0 ]; then kill $GetPIDtoKill echo "kill "$GetPIDtoKill i=$(($i+1)) else break; fi done echo "Killed Apache Son Num: "$i } KillMysql () { GetPIDtoKill=$(ps -u mysql | cut -d ' ' -f1) GetPIDtoKill=$(($GetPIDtoKill+0)) if [ $GetPIDtoKill -gt 0 ]; then kill $GetPIDtoKill echo "kill mysql and PID is "$GetPIDtoKill fi } CheckMem () { MinFreeMem='100000' #only restart apache below this number BadFreeMem='10000' #retart apache and mysql below this number CurrentMem=$(cat /proc/meminfo | grep -i MemFree | cut -d ':' -f2 | cut -d 'k' -f1) CurrentMem=$(($CurrentMem+0)) #echo "CurrentMem="$CurrentMem #echo "MinFreeMem="$MinFreeMem #echo "BadFreeMem="$BadFreeMem if [ $BadFreeMem -gt $CurrentMem ]; then echo `date "+%Y-%m-%d-%H-%M-%S"` echo "CurrentMem="$CurrentMem echo "restarted two service" KillAllApacheSon KillMysql service mysql restart else if [ $MinFreeMem -gt $CurrentMem ]; then echo `date "+%Y-%m-%d-%H-%M-%S"` echo "CurrentMem="$CurrentMem echo "restarted apache" KillAllApacheSon fi echo `date "+%Y-%m-%d-%H-%M-%S"` echo "Free Memory is Good!" fi } renice -15 $$ >> ./second.log #echo $(nice) while [ true ]; do # sleep 1 usleep 100 CheckMem>>./second.log done |
这次修改比较幸苦,感觉一个小脚本写到这份上,对我来说也算得上是高级bash编程了吧?呵呵。拉出来溜溜?惨不忍睹。依然无法实现预期功能。为什么?难道1秒钟也太漫长?
于是请出usleep,每隔100毫秒就检查内存一次。我的cpu 10%都用在这个脚本上了,结果怎么样?没用! 写到这里,我心灰意冷了,彻底放弃。亲爱的朋友,有谁能帮帮我呢?
我写出上面的文字来,除了期待高手来解救我之外,还有一个原因。仔细想想看,我的这些脚本不能在VPS上实现功能,但应该可以在独立服务器或者PC上工作,为什么呢?因为VPS一旦接近耗尽内存,那真的是一点memory都allocate不处理,所以脚本本身就无法继续执行.但是对于独立服务器或者PC, 都有swap机制. 在物理内存耗尽的情况下, 会拿硬盘来充数,虽然速度慢很多,但以上的两个版本的脚本,都有可能正常工作.所以如果你测试以上脚本可用,请告诉我,抚慰一下我受伤的心吧
Cron Job为什么不执行?
0很多人搜索Cron Job未执行这样的关键字来到我的博客,可能是因为我写了几篇关于Cron Job旁门左道的文字吧.
根据我的经验,Cron Job在添加正确的情况没有执行, 最可能的原因是脚本的权限设置, 要设置为仅供拥有者可执行的,并且脚本有者和组都正确.
比如在我的服务器上,需要设置
1 2 | chmod 700 name-of-your-script chown wwwrun:www name-of-your-script |
如果还有问题,欢迎讨论.