putty vs SecureCRT

Posted: 2009年5月15日星期五
作为一名linux的sa,每天都会跟ssh终端打交道,选择配置好一个优秀的ssh终端工具对提高工作效率有很大的帮助。一般情况下有两种选择,一种是免费的putty和收费的SecureCRT。最初我选择的是免费putty,当我管理几台服务器时,确实是比较好的一种选择putty,不会记住用户名,密码,安全性好。在没有配置的情况下,putty的显示效果要比SecureCRT好。再者文件小,功能齐全,而且不需要安装,可以随时的打开使用。当我管理的不是几台linux服务器,而是几十台服务器后发现就不好了,每次都要输入IP地址,打开多台服务器时,不能作为tab显示,结果显示的窗口过多,当打开多个窗口是在任务栏上显示的标题不能标示对应打开的服务器,而是需要打开每个窗口去确认,确实不方便。而采用SecureCRT就没有这些问题。同时通过配置SecureCRT能够基本达到putty的显示效果,下面是我的配置SecureCRT的参数
1,配置终端类型,显示颜色
Options->SessionOptions ->Emulation,然后把Terminal类型改成xterm,并点中ANSI Color复选框。
2,配置字体,编码方式
字体设置:Options->SessionOptions->Appearance->font然后改成新宋体,文字大小设置为11号。
character改成utf-8的方式。
3,去掉显示的下划线
Options->SessionOptions->Appearance->Current color选择编辑,在新打开的窗口去掉show underline
4,vi中颜色显示效果
在打开的终端中,编辑/etc/profile 在文末添加如下内容
export TERM=xterm-color
添加完毕后执行如下内容,使之生效
source /etc/profile
同时用vi打开文件转入命令形式,输入如下命令
syntax on
如果是c语言的文件就接着输入set filetype=c,如果是jsp的话就输入,set filetype=jsp,对shell语言的话,不设置也能颜色显示,其它同理。就完成终端vi的颜色显示,不过遗憾的是对vi颜色显示支持不是很好,需要配置很多的系统参数。

采用tokyo cabinet搭建表格型DBM

Posted: 2009年5月12日星期二
DBM(DataBase Manager)的特征是:按键-值对的方式进行存储,使用hash进行查找,由于没有提供更高级的sql功能,它的效率远远超过传统的关系型数据库。现主流的dbm有:Berkeley DB(现属于oracle公司,是互联网部署最多的一款dbm),Gdbm(GNU Database Manager) QDBM: Quicker Database Manager,Tokyo cabinet,CDB:Constant Databases,Tokyo cabinet是基于QDBM再开发的一款DBM,它本身也只提供数据库引擎,所谓数据库引擎是指它提供了除SQL处理层以外的所有关系数据库的功能(如事务性(ACID)支持,数据存储,数据恢复等)。前面提到dbm的特征是一些键-值对的形式出现,那么Tokyo Cabinet作为一款dbm,它也不例外,怎么样才能实现跟普通的关系数据库一样的表格功能呢?Tokyo Cabinet的作者开发了一款Tokyo Tyrant的工具,可以采用它调用Tokyo Cabinet数据库引擎,实现跟管理数据库一样的数据库表格的功能,下面通过一个普通的员工信息表进行演示说明
表格内容如下

在普通的关系数据库mysql中建立这个表格的sql语句如下
create table staffs (
id int primary key,
name varchar(255),
sex enum ( 'male', 'female' ),
birthday date,
div varchar(255)
);

而根据上面所说的按键-值对方式进行存储,那么这样想的话,那不是得分成,几个db,分别是名字db,性别db,出生年月db和职务db,那这样的话表格的逻辑不是乱了吗!如果这样的话,估计没有几个人用,下面介绍采用tokyo tyrant的命令就可以做成这个表格,实现与普通关系型数据库提供的sql使用方式。
建立数据库
tctmgr create casket
插入数据

tctmgr put casket 1 "name" "张三" "sex" "male" \
"birthday" "19900101" "div" "brd,dev"
tctmgr put casket 5 "name" "李四" "sex" "female" \
"birthday" "19850523" "div" "dev"
tctmgr put casket 23 "name" "王五" "sex" "male" \
"birthday" "19881013" "div" "hr"

查询所有数据
tctmgr list -pv casket
--------
1 name 张三 sex male birthday 19900101 div brd,dev
5 name 李四 sex female birthday 19850523 div dev
23 name 王五 sex male birthday 19881013 div hr

条件查询
通过主键进行查询,查询用户id为23的职员信息
tctmgr get casket 23
--------
name 李四
sex female
birthday 19850523
div dev

通过不是主键进行查询

#查询以王开头的用户
tctmgr search -pv casket name STRBW "王"
-------
23 name 王五 sex male birthday 19881013 div hr
#查询以85年出生以后的男职员
tctmgr search -pv casket birthday NUMGE 19850101 sex STREQ "male"
--------
1 name 张三 sex male birthday 19900101 div brd,dev
23 name 王五 sex male birthday 19881013 div hr

附查询条件表达式(前面加~,相当于标准sql中的非)
* STREQ : 完全包含字符串,相当于标准sql中的where 字段=‘字符串’
* STRINC : 包含此字符串,相当于标准sql中like ‘*字符串*’
* STRBW : 以此字符串开头的内容,相当于标准sql中like ‘字符串*’
* STREW : 以此字符串结尾的内容,相当于标准sql中like ‘*字符串’
* STRAND : 包含在某区间内的内容,如标准sql中like ‘a-z’,那么他只能是a到z的字母
* STROR : 不包含在某区间内的内容,如标准sql中like ‘!a-z’,那么他只能是数字或其他的符号
* STRRX : 组合式结构,如标准sql中like “a“!b-m”#”
* NUMEQ : 数值大小一样 相当于标准sql中 where a=‘1’
* NUMGT : 数值大于某一值 相当于标准sql中 where a>‘1’
* NUMGE : 数值大于等于某一值 相当于标准sql中 where a>=‘1’
* NUMLT : 数值小于某一值 相当于标准sql中 where a<‘1’
* NUMLE : 数值小于某一值 相当于标准sql中 where a<=‘1’
* NUMBT : 数值处于某一数值区间,相当于标准sql中 where a> 1 and a < 10
* NUMOREQ : 数值不处于某一数值的区间,如果是a大于1,小于10的话,那这个表达式右边的内容应该相当于标准sql中 where a< 1 or a > 10
附排序
* STRASC : 按字面大小的升序排序
* STRDESC : 按字面大小的降序排序
* STRASC : 按数字大小的升序排序
* STRDESC : 按数字大小的降序排序
删除操作

tctmgr out casket 23
#确认结果
tctmgr list -pv casket
--------
1 name 张三 sex male birthday 19900101 div brd,dev
5 name 李四 sex female birthday 19850523 div dev

服务器故障[原创]

Posted: 2009年5月11日星期一
今天下午放在idc机房的机器无缘无故的就down掉了,打电话给机房的人要求重启,并要求告知原因,机房人告知机器没有打开,我把服务器上的日志分析了半天,发现没有任何down掉了日志,排除了机器故障,而处在同一个机柜里的服务都是好的,排除了供电故障,那么只有一种可能就是有人人为的把我的服务器的电源给拔掉了。我严重鄙视做这种事情的人。

web站点优化的理解[原创]

Posted: 2009年5月10日星期日
在网上看到很多文章在介绍web站点的优化方案,确实有作用,但都是片面的单独从一个角度去写的一个优化方案,很少有人比较全面的写一个优化方案,几乎都是要不从web页面上讲优化的条条款款,要不单独的从服务器上讲优化的条条款款,要不从db上写优化的条条款款。但这些优化方案局限性很大,很少有文章能提到一个全面的优化方案,下面是我自己所理解的一点web站点优化方案,个人认为前端优化是最重要的。当你的一个页面很大,到了一个页面2M,你服务器端优化做得再好,也是空的,你能及时的响应用户的请求,但是国内的用户现在的一个带宽情况你应该知道,光打开一个也面要多久时间,同时你服务器端的带宽是多少,带宽能承受得多少个用户同时并发,算算就知道了。再如果一个页面链接请求几百个,你服务器端优化得再好,承受的并发单台也只能做到不到十万个并发连接,同时浏览器还有对同一域名的并发限制,多域名的话,查询dns也是需要时间的。而国内做前端做得好的不是很多,包括alex排名非常高的各大网站(去掉google,baidu,页面元素太少,它们也确实做得很好),几乎前端做得很烂,真正做得好的是美国yahoo网站,大家可以去看看他的做法。yahoo工程师写了web前端优化的34条建议可以去看看,同时通过yahoo工程师写的firefox插件yslow去分析优化结果及优化建议。
再一个就是后端db的优化,因为db的连接是有限的,当数据量达到一定得规模,及出现db大并发时,db应该也是一个最慢的,当一个不合理的sql,很有可能就导致你网站的性能大打折扣,前端的web服务器优化得再好,也是空的,后端的db反应不过来,前端永远等待后端的结果,最好的做法就是少用db,能静态化页面,尽量静态化,能把数据缓存到cache中尽量缓存到cache中,优化sql链接,优化sql语句,当数据达到一定得数量级就分库,分表等操作。
第三个就是服务器的优化,这个做好,能基本提高大的并发,优化的方法应该用压力工具压(如:ab,webbench)几个简单的测试页面,进行调优,不是水平特别菜的sa的话,通过搜索引擎去查找别人的方案,依葫芦画瓢,基本上能达到一个不是很坏的结果。
再往后优化的话就是从架构上去做服务器的优化,不在本文讨论范围之类,这基本是包括最基本的优化方案,也是大部分站点能做的事情。做了以上的优化为老板节省了服务器及带宽资源。同时也使sa的工作量变少,因为管理的服务器越少,花在服务器维护的时间就越少,节省出来的时间可以做更多有意义的事情。
附yahoo的调查结果,后台只占5%,而前端高达95%之多,其中有88%的东西是可以优化的。

yslow更新到2.0[原创]

Posted: 2009年5月8日星期五
今天早上启动firefox发现yslow更新了新的版本,做为一个前端页面分析的一个好工具,更新后,界面变了,功能也变强了,首先在grad选项卡上,优化的内容增多了,以前是13条,现在又增加了,增加到22个,以前只是一个简单的列表,现在对各个选项进行分类,这样的话,就能对开发人员更明确,要优化的地方在那。评分选项上,各个参数如果不是A的话,会列出各个选项中做得不好的内容,不像以前点击后直接到yahoo deverloper的建议页面,现在得出的结果更明确。componets选项上,以前只是做一个列表。能做各个选项进行一个排序,现改成了分类列出,对于css中的图片,以前也是作为一个图片列表,不能很好明白这个图片到底出现在那,现在就能更仔细的得出结果,同时多了cookie发送和接收大小的列,headers显示及expires的列,每个文件响应时间及etage,action选项,功能更强,显示更好。statistics变化不大,准确的说,到现在还没有发现有变化在那。对于tools选项功能不多,值得一提的是有一个叫all smush.it的小工具,它是一个在线批量压缩图片工具,支持批量压缩图片,在无损图片质量的前提下达到图片大小的最优化压缩。压缩完毕之后下载zip格式压缩包,解压后便可以使用图片了。

为php添加pdo_oci模块的几种方法[原创]

Posted: 2009年5月7日星期四
最近公司的一部分开发决定采用框架进行开发,需要php_oci的php扩展模块。比较遗憾的最新的pdo_oci的版本还是05年开发的,安装过程如不注意会有比较多的问题,本人总结了一下它的几种安装方法,写下来进行备忘。
第一种就是在编译时添加--with-pdo-oci参数,这种方式的话,如果是刚开始搭建php环境的话应该是一种比较好的一种方式,具体安装步骤如下
首先安装oracle客户端,安装方法请查看我以前写的"Linux下编译安装PHP的oracle扩展",
值得注意的是,如果你采用rpm包安装的是64位的客户端的话,必须得为oracle客户端的include建立一个软连接,具体建立方法如下

ln -s /usr/lib/oracle/10.2.0.4/client64 /usr/lib/oracle/10.2.0.4/client

ln -s /usr/include/oracle/10.2.0.4/client64 /usr/include/oracle/10.2.0.4/client

再就是在编译时添加如下编译选项进行编译安装
--with-pdo-oci=instantclient,/usr,10.2.0.4
具体说明一下,instantclient即oracle的instant client的意思,/usr 就是oracle instant client安装目录,10.2.0.4 是oracle instant client版本,默认情况下如果写成这样的话,它会自动到/usr/include/oracle/10.2.0.4/client和/usr/lib/oracle/10.2.0.4/client查找依赖库文件,如果安装的64位的oracle instant client的话就必须得建立上面的一个软链接,不然就找不到所依赖的oci.h头文件而报错。其它的也就是跟普通的php安装一样,不需要任何特别的操作就能安装好php的PDO_OCI的扩展。
第二种方式即通过php的pear执行安装,这种适合于已经部署好了php环境,需要添加一个pdo_oci的扩展
如果在编译过程中没有添加--enable-sigchild参数的话,安装起来应该是最快的,最简单,最灵活。如果编译时添加了此参数的话,这种方式就不适合你,就别浪费时间了,安装时会报错。安装方法如下
添加oracle环境
export ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64/lib
添加oracle instant client的头文件的软链接
for i in /usr/include/oracle/10.2.0.4/client64/*;do;ln -s $i /usr/include;done
下载PDO_OCI进行安装
curl -O http://pecl.php.net/get/PDO_OCI-1.0.tgz
pear install PDO_OCI-1.0.tgz

在php.ini文件当中修改extension的路径及添加pdo_oci的扩展,
将extension_dir = "./"修改为extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"同时在它后面添加如下内容
extension=pdo_oci.so
重新启动http服务器即完成pdo_oci的安装,如不需要了,可以通过直接执行
pear uninstall PDO_OCI进行卸载
第三种安装方法直接编译pdo_oci的扩展包
安装前,如果你采用rpm包安装的是64位的客户端的话,必须得为oracle客户端的include建立一个软连接,具体建立方法如下

ln -s /usr/lib/oracle/10.2.0.4/client64 /usr/lib/oracle/10.2.0.4/client

ln -s /usr/include/oracle/10.2.0.4/client64 /usr/include/oracle/10.2.0.4/client

下载PDO_OCI进行安装
curl -O http://pecl.php.net/get/PDO_OCI-1.0.tgz
tar xf PDO_OCI-1.0.tgz
cd PDO_OCI-1.0
/usr/local/php/bin/phpize
./configure --with-pdo-oci=instantclient,/usr,10.2.0.4 --with-php-config=/usr/local/php/bin/php-config
make
make install

在php.ini文件当中修改extension的路径及添加pdo_oci的扩展,
将extension_dir = "./"修改为extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"同时在它后面添加如下内容
extension=pdo_oci.so
重新启动http服务器即完成pdo_oci的安装.
以上几种安装方法,安装完成后通过以下两种方式可以检验是否安装成功
安装完成执行php -m应该可以查看到PDO_OCI这么一行文字,表示安装成功,或通过phpinfo可以看到如下图所示的内容


表示安装成功。至此就是我总结的几种安装方法。

Linux下编译安装PHP的oracle扩展[原创]

Posted: 2009年5月5日星期二
oralce做为全球最大的数据库软件,php作为全球应用最广的web站点开发语言,两者结合开发的软件的开源软件不是很多,在互联网上大部分都是采用的LAMP平台即Linux+Apache+Mysql+PHP的组合方式进行软件开发与部署,真正采用Linux+Apache+Oracle+PHP的WEB应用站点并不是特别的多,甲骨文公司一直想把lamp平台上的那个M(mysql)变成O(Oracle)。下面通过一个实例编译安装PHP的Oracle扩展。本示例采用的2台服务器进行部署,一台专门跑web程序,一台专门跑Oracle DB。下面的示例是搭建一个能连接oracle的web应用服务器。
部署方法分一下几种步骤
1.下载安装oracle客户端
2.下载安装apache
3.下载安装php
4.配置apache
5.测试
下载安装Oracle 客户端
从oracle官网下载oracle的rpm客户端,具体下载页面如下
http://www.oracle.com/technology/software/tech/oci/instantclient/index.html
根据你的oracle db版本及操作系统下载相应版本的oracle客户端,本示例中采用64位centos操作系统oracle 10.2.1的oracle db,为安装简便话建议采用下载rpm软件包进行安装,具体只需要下载以下两个软件包,
oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
oracle-instantclient-devel-10.2.0.4-1.x86_64.rpm
安装软件需注册,免费注册登录后可免费下载oracle 客户端。下载完成后上传到服务器进行安装,通过简单的rpm命令即可完成安装
rpm -ivh oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
rpm -ivh oracle-instantclient-devel-10.2.0.4-1.x86_64.rpm
下载apache,安装apache
wget http://apache.etoak.com/httpd/httpd-2.2.11.tar.bz2
tar xf httpd-2.2.11.tar.bz2
cd httpd-2.2.11
./configure --prefix=/usr/local/apache --enable-module=so
make
make install

建立启动脚本
cp build/rpm/httpd.init /etc/rc.d/init.d/httpd
修改启动脚本/etc/rc.d/init.d/httpd
找到以下几行

apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
CONFFILE=/etc/httpd/conf/httpd.conf

分别对应修改为:

apachectl=/usr/local/apache/bin/apachectl
httpd=${/usr/local/apache/bin/httpd}
CONFFILE=/usr/local/apache/conf/httpd.conf

设定apache自启动

chmod +x /etc/init.d/httpd
chkconfig --add httpd
chkconfig httpd on

下载安装php

yum -y install zlib zlib-devel gd gd-devel libjpeg libjpeg-devel libpng libpng-devel
wget http://cn.php.net/get/php-5.2.9.tar.bz2/from/cn2.php.net/mirror
tar xf php-5.2.9.tar.bz2
cd php-5.2.9
./configure \
--with-oci8=instantclient,/usr/lib/oracle/10.2.0.4/client64/lib \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-zlib \
--enable-mbstring \
--with-gd \
--with-jpeg-dir
make
make install
cp php.ini-dist /usr/local/php/etc/php.ini

配置apahce使它支持php,编辑/usr/local/apache/conf/httpd.conf文件,在AddType application/x-gzip .gz .tgz后添加如下内容

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

编辑apache的启动脚本是它启动时加载到oracle的客户端文件,编辑/usr/local/apache/bin/envvars在文件的开头添加如下内容
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export PATH
export ORACLE_BASE=/usr/lib/oracle
export ORACLE_HOME=$ORACLE_BASE/10.2.0.4/client64
export ORACLE_SID=oracle_sid
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"

以上就完成了LAOP平台的搭建,可以启动apache进行测试

/etc/init.d/httpd start

在网站的根目录中建立phpinfo文件进行测试
phpinfo();
?>

打开phpinfo页面可以看到有一个oci8的选项,说明php的oracle扩展已经安装成功。
也可以通过下面的这个命令检查输出的内容是否包含oci选项确认php的oracle扩展安装是否成功
/usr/local/php/bin/php -m

多子网的dhcp服务器[原创]

Posted: 2009年5月4日星期一
在局域网建设当中,为便于管理,经常会搭建多个子网,对于多子网的dhcp服务器,也许有人会采用dhcp中继,或三层交换机或路由器自带的dhcp功能进行搭建,以上的成本比较的高,通过安装一台廉价的Linux PC就能解决这些问题,Linux自带的dhcp软件结合虚拟网卡就能够实现多子网的dhcp服务器,现在通过一个实例进行说明
本次实例的拓扑图如下

说明:
实例中两个子网的地址分别为:192.168.0.0/24和192.168.1.0/24
dhcp服务器的两个网卡地址分别为:192.168.0.1/24和192.168.1.1/24

配置dhcp服务器
先配置dhcp服务器的网卡地址eth0.0
ifconfig eth0:0 192.168.0.1 netmask 255.255.255.0 up
配置dhcp服务器的网卡地址eth0.1
ifconfig eth0:1 192.168.1.1 netmask 255.255.255.0 up
安装配置dhcp服务
1) 安装DHCP服务器包(RPM包名:dhcpd)。
2)配置服务器IP地址
3) 编辑DHCP服务器配置文件 /etc/dhcp.conf。

ddns-update-style interim;
ignore client-updates;
option time-offset -18000; # Eastern Standard Time
default-lease-time 21600;
max-lease-time 432000;
option domain-name-servers 192.168.0.1;
subnet 192.168.0.0 netmask 255.255.255.0 {
pool{
range 192.168.0.2 192.168.0.254;
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
option subnet-mask 255.255.255.0;
}
}
subnet 192.168.1.0 netmask 255.255.255.0 {
pool{
range 192.168.1.2 192.168.1.254;
option routers 192.168.1.1;
option broadcast-address 192.168.1.255;
option subnet-mask 255.255.255.0;
}
}

编辑提供dhcp的服务网卡地址/etc/sysconfig/dhcpd
DHCPDARGS="eth0:0 eth0:1"
启动dhcp服务
/etc/init.d/dhcpd start

以上就通过单台廉价的linux PC完成对2子网的dhcp服务器的配置,同样使用于更多个子网的dhcp服务器的配置。