blog迁移

[| 不指定 2011/10/27 02:02]
    经历了很长时间的准备后,终于把blog迁移了。哈哈,庆祝一下。

    考虑了很长时间,最后还是决定还在老服务器上开博客,先不动地方,因为新服务器最近网络变得非常差,失去了信心,而老服务器基本稳定,还能接受,稳妥起见,并且为了避免给搜索引擎带来太大的困扰,所以没有换服务器。


    迁移前先升级了下php,之前php还是5.1,实在太老了,加入了centos-test源,yum update提示我几个php依赖错误,卸掉那几个包后重新安装,好了,还有几个包源里没有,比如filter,查了下,原来从5.2起整合进php了,自然也不需要了。还有eaccelerate似乎也找不到,下了源码编译。然后把自己写的模块重新编译一遍,一切正常,restart php。哈哈,升级了。

    之前已经修改、测试好了博客,一些配置也配置好了,所以迁移显得非常简单,直接从代码库中拉出代码到指定位置,代码就部署完成。使用昨天编写的数据导入脚本,把数据导入(期间出了个小插曲,php会对同样连接条件的连接请求进行复用,导致数据库use错乱,后来一个用localhost一个用127.0.0.1才好了,这个是始料未及的,因为之前是在两台机器间迁移的)。然后根据之前写的rewrite规则修改nginx配置文件,重启~ok了。

    心情不错,写博客又有动力了。
Tags: ,
最近又看了几个vps,总感觉为啥相同配置,相同线路,人家跑wp,我跑自制小博客。人家都比我快得多。

之前一直想当然,认为是网络问题之类的。由于今天考虑到了博客迁移,所以这个问题就提上日程了。于是打开chrome调试工具,看了下时间。

一看不要紧,终于找到瓶颈了。。

首先是jquery.js,最早用本机,后来嫌大,用了google提供的,由于最近和谐,google的连接速度非常慢,导致页面一直卡在下载jquery.js上。
由于是静态文件,比较大的体积,且seo无关,这就需要考虑把文件放在一个网络连接比较快的地方,显然放到国内是值得考虑的。
首先试了一下一款云存储产品,发现速度倒是很快,但是无法开启gzip,这个无法忍受。转而考虑比较专业的web托管,一想,sae就是专门干这个的,直接放到sae上最好。于是在sae上申请了个应用,吧jquery.js和几个比较大的图片移过去了。立竿见影,速度提升极大。

再看,发现google的统计代码加载也很慢,反正我也不怎么看google的统计,注释掉。

再访问,飞一般的速度~~~~~~

zabbix安装

[| 2011/10/20 23:34]
今天看到一个非常强大的服务器监控程序:zabbix。装了一下。

首先下来源码,最新源码是1.8.8.解压开,configure。缺了一些库,一个一个装上。没啥大问题,唯一一个问题是在打开--enable-static后会报找不到libcurl,应该是libcurl没有提供静态库。时间不多,没有细究,去掉了--enable-static,编译成动态的了。

./configure --prefix=/home/abc/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp=/home/abc/snmpd/bin/net-snmp-config --with-libcurl --with-jabber --enable-ipv6 --with-ssh2

然后make install。这个比较怪,没有单独的make过程,直接make install了。

然后发现只有bin,sbin,share。zabbix是软件免费,服务收费的。怪不得做的这么不自动化,估计想提高门槛好收费。

zabbix依赖webserver、php、mysql。这些软件我之前已经有了,不用再装了。

先在mysql里建表,去源码里找到
create/schema/mysql.sql
create/data/data.sql
create/data/image_mysql.sql

依次导入到mysql里。

然后在zabbix里mkdir etc
将misc/conf/zabbix_*都拷贝到etc里。配置了一下mysql连接信息。

misc/init.d里面有启动用的脚本,我看了一下,感觉还是自己写比较好。

直接启动,告诉我找不到libnetsnmp.so.30。估计是我snmp是自己编译的,zabbix做的有问题,链接路径搞错了,于是先
export LD_LIBRARY_PATH=/*****/snmpd/lib

再启动即可。


然后配置web管理页面。

frontends/php/*里的php文件拷贝到指定位置。开始配置,发现zabbix有个特点,要求php的最大执行时间超长,估计是数据多了处理比较慢。不配好就不能安装,配好后进入管理后台,默认账号和密码是admin和zabbix。进去后配置了下。网页做得比较土,不过功能很强大,很多配置项。

刚开始只启动了zabbix_server,管理后台老是提示无法连接云云,启动了zabbix_agentd后可以监控了。感觉跟文档不符,文档似乎说server也能够监控的。没打算细研究,所以没有细究。

管理页面还支持中文,不错。

现有的小破vps还不至于用这么重量的监控,试试而已。
之前一直以为shell脚本中没法处理信号,所以也没有探究过,突然发现是可以的。

#!/bin/bash

abc(){
echo "signal receive"
}
trap 'abc' INT
sleep 100

这个脚本会在收到ctrl+c的时候打印signal receive。

linux系统打开core文件设置

[| 不指定 2011/10/14 23:30]
  默认linux系统是不开启core文件的,不过对于运行较多自己写的程序的服务器,开启core文件还是很有必要的。

  首先设置ulimit允许core文件,默认0,不允许。
  使用ulimit -c可以设置,但不是永久的。通过编辑/etc/security/limits.conf 文件可以永久改变这一设置。

  加入两行:
*               soft    core            unlimited
root           soft    core            unlimited

  要对root单独设置,刚开始只设置了*,后来发现没有对root生效。

  默认core文件路径和core文件名都不太好,放到固定位置,使用固定规则生成core文件是比较好的选择。

  /proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
  echo 1 > /proc/sys/kernel/core_uses_pid

  /proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,默认文件内容是core
  可以这样修改:
  echo "/corefile/core-%e-%p-%t" > core_pattern
  将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
  以下是参数列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加当前uid
    %g - insert current gid into filename 添加当前gid
    %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
    %h - insert hostname where the coredump happened into filename 添加主机名
    %e - insert coredumping executable name into filename 添加命令名
今天在压力测试一个vps性能时,发现大量Failed requests,非常疑惑,跑脚本curl了很多次,查看结果,发现结果确实有不一致,原来wordpress一个主题上面的主图片是动态变换的,每次请求返回的是随机一个图片地址。ab发现各请求返回内容不一致,所以判断有错误。换成一个普通的主题,正常了。

查看进程所属组(gid)

[| 2011/10/14 00:39]
今天想看某个进程所述的组,发现常用的ps,top等命令都显示不出来。头大,直接去/proc/***/status里面看,有了,Uid,Gid两栏。查到后去passwd和group文件里面对照即可。
今天有同事问到为什么supervise启动lighttpd的时候,lighttpd的pid文件是空的。我试了下,发现果然如此。

首先猜想是不是supervise动了手脚导致程序getpid得到空值,写了个printf getpid的小例子跑了下发现正常。

后来尝试用supervise启动lighttpd,发现supervise每隔1s就尝试启动lighttpd,即使lighttpd已经正常运行了。用刚才的小例子时不会重复尝试,只有被保护程序挂掉后才尝试重启。

后来突然想到lighttpd的两次fork。由于lighttpd进程是以daemon进程形式运行的,在启动过程中有两次fork子进程,然后父进程退出的操作。

supervise中,启动被监控程序的流程是supervise先fork一个自己,子进程调用execvp来启动被监控程序。父进程记录fork时获得的进程号,监控起来。显然,lighttpd第一次fork后,子进程就已经退出了,故supervise以为被监控进程挂了,于是尝试再次启动lighttpd。由于端口被占用的缘故,lighttpd未能启动,由于lighttpd的启动会清空pid文件,而启动失败又没有往里面写入有效进程号,所以pid文件就是空的了。

不使用supervise,通过普通方式两次启动lighttpd,第二次报端口被占用,此时pid文件为空,验证了以上的推论。

gdb查看结构体更美观

[| 2011/10/09 14:42]
直接p *abc的话会出来一大团东西,好处是最短的垂直空间内能显示完,坏处是层次结构不好找。

在gdb里运行一下set print pretty on
再输出就是层次结构了。
以前只知道ctrl+f5是忽略缓存强制刷新所有内容,对f5的作用一直不太清晰,这篇文章讲的很清晰。
并且学到一点,原来ctrl+f5还可以强制网络上的proxy也更新内容


http://www.cnblogs.com/cxd4321/archive/2009/03/11/1408425.html
Browser: F5 vs Ctrl+F5
在浏览器里中,按F5键或者点击Toobar上的Refresh/Reload图标(简称F5),和做F5同时按住Ctrl键(简称Ctrl+F5),效果是明显不一样的,通常Ctrl+F5明显要让网页Refresh慢一些,到底两者有什么区别呢?
在上一篇技术文章中,说到了Expires、Last-Modified/If-Modified-Since和ETag/If-None-Match这些HTTP Headers,F5/Ctrl+F5和这些有莫大关系。
假如我第一次访问过http://www.example.com,这个网页是个动态网页,每次访问都会去访问Server,但是它包含一个一个静态资源http://www.example.com/logo.gif,浏览器在显示这个网页之前需要发HTTP请求获取这个logo.gif文件,返回的HTTP response包含这样的Headers:
Expires: Thu 27 Nov 2008 07:00:00 GMT
Last-Modified: Fri 30 Nov 2007 00:00:00 GMT
那么浏览器就会cache住这个logo.gif文件,直到2008年11月27日7点整,或者直到用户有意清空cache。
下次我再通过bookmark或者通过在URI输入栏直接敲字的方法访问http://www.example.com的时候,浏览器一看本地有个logo.gif,而且它还没过期呢,就不会发HTTP request给server,而是直接把本地cache中的logo.gif显示了。
F5的作用和直接在URI输入栏中输入然后回车是不一样的,F5会让浏览器无论如何都发一个HTTP Request给Server,即使先前的Response中有Expires Header。所以,当我在当前http://www.example.com网页中按F5的时候,浏览器会发送一个HTTP Request给Server,但是包含这样的Headers:
If-Modified-Since: Fri 30 Nov 2007 00:00:00 GMT
实际上Server没有修改这个logo.gif文件,所以返回一个304 (Not Modified),这样的Response很小,所以round-trip耗时不多,网页很快就刷新了。
上面的例子中没有考虑ETag,如同在上一篇技术文章中所说,最好就不要用ETag,但是如果Response中包含ETag,F5引发的Http Request中也是会包含If-None-Match的。
那么Ctrl+F5呢? Ctrl+F5要的是彻底的从Server拿一份新的资源过来,所以不光要发送HTTP request给Server,而且这个请求里面连If-Modified-Since/If-None-Match都没有,这样就逼着Server不能返回304,而是把整个资源原原本本地返回一份,这样,Ctrl+F5引发的传输时间变长了,自然网页Refresh的也慢一些。
实际上,为了保证拿到的是从Server上最新的,Ctrl+F5不只是去掉了If-Modified-Since/If-None-Match,还需要添加一些HTTP Headers。按照HTTP/1.1协议,Cache不光只是存在Browser终端,从Browser到Server之间的中间节点(比如Proxy)也可能扮演Cache的作用,为了防止获得的只是这些中间节点的Cache,需要告诉他们,别用自己的Cache敷衍我,往Upstream的节点要一个最新的copy吧。
在IE6中,Ctrl+F5会添加一个Header
Pragma: no-cache

在Firefox 2.0中,Ctrl+F5会添加两个
Pragma: no-cache
Cache-Control: max-age=0
作用就是让中间的Cache对这个请求失效,这样返回的绝对是新鲜的资源
分页: 12/31 第一页 上页 7 8 9 10 11 12 13 14 15 16 下页 最后页 [ 显示模式: 摘要 | 列表 ]