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对这个请求失效,这样返回的绝对是新鲜的资源

HTTP1.0下HTTP_HOST允许为空

[| 2011/09/21 22:04]
今天遇到lighttpd的一个奇异问题,幸亏高人指点,原来HTTP1.0下允许host为空,而1.1协议则要求host必须有值,否则返回400错误。

贴鸟哥帖子一篇:http://www.laruence.com/2008/08/28/483.html 写的很好,我就不重新轮一个帖子了。

昨天xuepeng师兄提出一个问题是 $_SERVER['HTTP_HOST']为空, 经过我翻看RFC文档以及测试,得出结论如下:
在http 1.1中, host字段是不能为空的,如果为空, 服务器会认为是bad request

但是在http 1.0中, host字段是可以为空的. 如:

<?php
$fp = fsockopen("localhost", 80, $errno, $errstr, 30);

$header = "GET /index.php";
$header .= " HTTP/1.0
";

$header .= "Connection:Close

";
fwrite($fp, $header);
echo fread($fp, 1024);
fclose($fp);
?>
其中,主机的index.php只是var_dump($_SERVER['HTTP_HOST']);

可以看到,当你指明使用http 1.0协议的时候, 请求正常,返回结果是false;

但是如果你指明协议是http 1.1 :

<?php
$fp = fsockopen("localhost", 80, $errno, $errstr, 30);

$header = "GET /index.php";
$header .= " HTTP/1.1
";

$header .= "Connection:Close

";
fwrite($fp, $header);
echo fread($fp, 1024);
fclose($fp);
?>
则结果是400 bad request;

究其原因是因为在HTTP1.0的时候, 并没有设想到现在有这么多服务器共用一个IP的情况(virtual host), 而在HTTP1.1的时候,加入了对多个HOST共用一个IP的支持.

以下文字摘自RFC2616:

14.23 Host

The Host request-header field specifies the Internet host and port
number of the resource being requested, as obtained from the original
URI given by the user or referring resource (generally an HTTP URL,

Fielding, et al. Standards Track [Page 128]

RFC 2616 HTTP/1.1 June 1999

as described in section 3.2.2). The Host field value MUST represent
the naming authority of the origin server or gateway given by the
original URL. This allows the origin server or gateway to
differentiate between internally-ambiguous URLs, such as the root “/”
URL of a server for multiple host names on a single IP address.

Host = “Host” “:” host [ ":" port ] ; Section 3.2.2

A “host” without any trailing port information implies the default
port for the service requested (e.g., “80″ for an HTTP URL). For
example, a request on the origin server for
would properly include:

GET /pub/WWW/ HTTP/1.1
Host: www.w3.org

A client MUST include a Host header field in all HTTP/1.1 request
messages . If the requested URI does not include an Internet host
name for the service being requested, then the Host header field MUST
be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
request message it forwards does contain an appropriate Host header
field that identifies the service being requested by the proxy. All
Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
status code to any HTTP/1.1 request message which lacks a Host header
field.

以下省略…..

博客加上301到www域名跳转

[| 2011/09/19 20:33]
我比较喜欢上网站时省略前面的www,在做博客的时候整体设计上url也都是不带www的,后来统计发现用户和搜索引擎都是带www和不带www一起访问和收录的,导致非常乱,一直比较懒,没有加301跳转,今天忍无可忍,加上了。

非常简单,在nginx配置文件里加上:

if ($host = 'snooda.com' )
{
rewrite ^/(.*)$ http://www.snooda.com/$1 permanent;
}

在博客ci框架里设置:
$config['base_url'] = 'http://www.snooda.com/';


重启nginx后ok了。

不过需要注意,在一些统计脚本里我还写的是不带www的,这样会导致很多跳转,需要手动改过来。
分页: 2/23 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]