2010年1月18日星期一

nginx

nginx,一般用来做七层的负载均衡或者代理。
今天是第一次写nginx,对于任何的webserver服务器来讲,我们需要好好的处理rewrite.和服务器的状态。

location ~* ^.+\.(js|css|php|jpg|jpeg|gif|png|pdf|zip|rar)$ {
root /var/www/apps/myapp/public;
access_log off;
expires 7d;
}

一般有上面代理的例子,特别需要里面的是正则一句 ~* 不区分大小写匹配,具体其他可以搜索
我们需要取到nginx的服务器状态

Active connections: 171
server accepts handled requests
21252 21252 30419
Reading: 2 Writing: 9 Waiting: 160


location /nginx_status {
stub_status on;
}

2009年6月10日星期三

mysql取随机 order by rand()

当随便看看成为在各个页面的应用中出现后,order by rand()越来越多的出现后台sql中.
首先看看这条sql的作用
EXPLAIN SELECT * FROM TABLE ORDER BY rand( ) LIMIT 1

从表TABLE中随机的取出一行
做explain 后为

1 SIMPLE table ALL NULL NULL NULL NULL 607 Using temporary; Using filesort

建立临时表,并做文件排序,最后取一行,这个事得不偿失

2009年2月10日星期二

svn不支持http

新编译的svn不支持http

svn: Unrecognized URL scheme

需要安装neno
neon-0.28.3.tar.gz
把neno解压后重命名为neno,放入subversion的代码的顶级目录下重新config && make && make install
支持 http的svn客户端表现如下

[dba@mysqldba ~]# svn --version
svn, version 1.5.5 (r34862)
compiled Feb 10 2009, 17:58:37

Copyright (C) 2000-2008 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
- handles 'http' scheme

* ra_svn : Module for accessing a repository using the svn network protocol.
- with Cyrus SASL authentication
- handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme


所以安装ra_neno就可以支持http

2009年1月12日星期一

bazaar安装问题

mysql的源码库更换了版本控制工具,使用了bazaar
好不容易把bazaar的源码找到,编译时,出现下面错误
Failed to build "bzrlib._btree_serializer_c".
Use --allow-python-fallback to use slower python implementations instead.
这样,需要在编译中添加--allow-python-fallback
如下
python setup.py install build_ext --allow-python-fallback
参考:https://bugs.launchpad.net/bzr/+bug/295826

2008年12月19日星期五

mysql编译相关参数


--enable-assembler
Use assembler versions of some string functions if available.
--enable-profiling
Build aversion with query profiling code (req. community-features)

--with-charset=CHARSET
Default character set, use one of:binary armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257 cp850 cp852 cp866 cp932 dec8 eucjpms euckr gb2312 gbk geostd8 greek hebrew hp8 keybcs2 koi8r koi8u latin1 latin2 latin5 latin7 macce macroman sjis swe7 tis620 ucs2 ujis utf8

--with-extra-charsets=CHARSET,CHARSET,...
Use charsets in addition to default (none, complex, all, or a list selected from the above sets)
--with-big-tables
Support tables with more than 4 G rows even on 32bit platforms
--with-embedded-server Build the embedded server (libmysqld)


上面的 big-tables对于我们一般32位系统

2008年12月17日星期三

mysql变量之max_connect_errors

max_connect_errors

默认值:10
作用:当某台主机尝试连接超过max_connect_errors后,mysql将屏蔽掉这个主机.
日志:mysqld启动时开启了--log-warnings,会得到一下信息

Host 'host_name' is blocked because of many connection errors.


解决方法:
1 shell> mysqladmin flush-hosts
shell> mysqld_safe --max_connect_errors=10000 &
2 mysql> flush hosts;
mysql> set global max_connect_errors=10000;

2008年11月26日星期三

mysql复制-SQL_SLAVE_SKIP_COUNTER

当mysql replication 的slave出现些可以忽略但是又影响同步的错误的时候,我们通常会执行
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N (N=1 .2 .3...)
来解决同步问题。
1.执行这条sql的时候需要slave的同步进程是关闭的
2.跳过bin-log的某个sql对于事务和非事务的处理是不同的,非事务眺一条sql,事务的话直接跳过这个事务
参考手册

2008年11月10日星期一

给自己制定的学习计划

为了更好的了解数据库,更好的学习mysql!
决定给自己指定学习计划,开始学习postgresql
基本上是每天翻两页手册,并且和mysql做一下类比:)

2008年10月20日星期一

innodb学习-innodb_thread_concurrency

innodb_thread_councurrency
innodb试图保证并发线程小于或者等于这个设置的值,一旦线程数达到这个限制值,则另外生成的线程将被放入一个FIFO的队列中等待执行,而这些被等待中的线程将不会被计算入并发线程。
而怎么样设置这个值是依赖系统环境和系统负载,我们需要尝试在一个范围内的不同的值来决定我们的系统应该设置成什么值。
这个范围是从0-1000,在某些版本如果这个值等于大于20,被认为是无限大,而某些版本,我们可以通过设置为0来禁用并发检查。
这个默认值在5.1.11之前是20,从5.1.11开始是8.
所以innodb_thread_concurrency,我们需要实际的测试才能决定使用什么样的值:)
下附上一个关于innodb_thread_concurrency的bug37411
Threads staying in the "Sending Data" for long periods of time

2008年10月17日星期五

mysql 4g问题

mysql的有4g最大表限制,这个限制是来源于操作系统

mysql> show table status like 'example_table'\G
*************************** 1. row ***************************
Name: example_table
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 2750508
Avg_row_length: 472
Data_length: 1300304684
Max_data_length: 281474976710655
Index_length: 516225024
Data_free: 0
Auto_increment: 2800006
Create_time: 2008-02-27 10:45:44
Update_time: 2008-07-11 15:41:30
Check_time: 2008-02-27 11:05:27
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:

mysql> alter table example_table max_rows=210000000 avg_row_length = 1024;
Query OK, 2750508 rows affected (15 min 28.11 sec)
Records: 2750508 Duplicates: 0 Warnings: 0


mysql> show table status like 'example_table'\G
*************************** 1. row ***************************
Name: example_table
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 2750508
Avg_row_length: 472
Data_length: 1300304536
Max_data_length: 1099511627775
Index_length: 461033472
Data_free: 0
Auto_increment: 2800006
Create_time: 2008-10-17 13:27:33
Update_time: 2008-10-17 13:29:47
Check_time: 2008-10-17 13:42:58
Collation: utf8_general_ci
Checksum: NULL
Create_options: max_rows=210000000 avg_row_length=1024


这个修改可真是消耗时间,有时间还是应该早做处理,早做打算。
当然,在迁移数据的时候,我们应该有可以变通的方法。

2008年10月13日星期一

转贴:上传漏洞(php.rar格式文件)

原文地址:http://zhixinku.com/home/space.php?uid=4&do=blog&id=20

一般的网站都会开放rar附件上传,并可能会保留原来文件名称,这从而可能导致一个很严重的问题,xxx.php.rar文件会被Apache当作php文件来执行, 造成极大的安全隐患 .

如何测试? 将你的某个php程序文件后缀名修改成 xxx.php.rar , 这时测试一下, 还是按照PHP文件解析执行,Apache并不会认为这是一个rar文件, 这是为什么呢?

原来,每遇到一种后双重后缀名(如xxx.php.rar)的文件,Apache都会去conf/mime.types 文件中检查最后一个后缀,如果最后一个后缀并没有在mime.types文件中定义, 则使用前一个后缀来解释 ,因为在默认情况下,rar并未在mime.types中定义, 故Apache会使用php后缀来解释文件, 这就是漏洞的原因所在.

由此类推,如果使用xxx.jsp.ppp.rar 则会认为是jsp文件, 如果修改成xxx.shtml.rar ,则会识别成shtml文件.

a.php.c.d.e.rar 也是会被当成PHP文件解释的!
想想,不知道有多少网站存在这个问题?

那么针对网络管理员,如何杜绝这个隐患 ?
1.修改mime.types文件,在最后面加一条:
application/rar rar
然后重新启动Apache,即可.

针对WEB管理员及WEB程序开发者,如何更安全?
1.只允许上传指定后缀名的文件,当然,要禁止掉rar格式文件上传.(但这条往往行不通,一般的网站都需要上传rar文件)
2.对上传后的文件进行强制重命名, 强制使用最后一个扩展名,如原始文件名为xxx.php.rar ,上传后强制重命名为 20080912.rar即可避免这个隐患.

早期版本的phpcms 2007, discuz, ecshop都存在这个漏洞, 或许你的网站被挂马,就是因此引起.

希望本文对你有用.


不要指出的是只要不能解释的后缀都会重新解释前一个后缀
这样a.php.rar2 或者 a.b.php.gzip111都有可能直接解释成php
除了文中给出的方法外,最好能把上传的文件单独用没有添加php扩展的webserver来提供服务!

apache模块之mod_mime_magic

mod_mime_magic 在mod_mime不能确定文件类型的时候,读取文件的头几个字节来判断文件类型,觉得用处不是很大,还影响性能!
详见手册mod_mime_magic

2008年10月12日星期日

nfs的server端没有响应

突然接到alert:apache进程数过多!
查看server apache进程数过多,查看mysql的状态,正常。查看apache日志,正常,但是又有alter,该台server连不上内网中的一台nfs!
本能的df了一下,卡在某个nfs那里!
查看了nfs server,正常!
于是决定重新挂载nfs
这里需要注意的是,需要详细的写清楚nfs的路径ip:path ,而不能直接卸载映射到本地的目录!
卸载后再挂载,这时一切正常!
继续查看原因
在nfs server 的message中有网卡重启的信息

Oct 12 11:46:39 **** kernel: NETDEV WATCHDOG: eth1: transmit timed out
Oct 12 11:46:40 **** kernel: bnx2: eth1 NIC Link is Down
Oct 12 11:46:41 **** kernel: bnx2: eth1 NIC Link is Up, 100 Mbps full duplex
主机名用****代替

nfs client 的message中同样有相关信息

Oct 12 11:11:23 **** kernel: nfs: server *.*.*.* not responding, st
ill trying
Oct 12 11:11:56 **** last message repeated 13 times
Oct 12 11:12:01 **** last message repeated 2 times

问题:
1.相互出问题的时间并不一致
2.交换机并不存在问题,连接在同一交换机上的其他设备没有这样的日志.
结论:迷惑中:暂时只能先解决问题,初步认为网卡有些问题,需要再观察!

2008年10月10日星期五

查看mysql中当前用户

今天突然想看看连接mysqld的是哪个用户,于是随手 show user();发现不能用!
切记:
mysql下查看当前session的用户是

select user();
select current_user;
select current_user();
都是一样的效果。

而orcale 可以用
SHOW USER

有时候用得少,真混乱了,记录下:)
mysql中查看所有用户

SELECT * from mysql.user;

2008年10月9日星期四

libtoolize 与libtool

今天在找libtoolize属于哪个rpm包的时候,发现邮件列表里面有一段不错的话,特此记录下。

libtool and libtoolize are two very different things. But since libtoolize
is an add-on of libtool, it's included in the libtool package. Renaming
the package to libtoolize would be stupid because the package is way more
than that.
Renaming the libtoolize command to libtool would be stupid because it's
named libtoolize everywhere else, and because libtool is something else.

顺便说下libtoolize是属于libtool这个包的,我的系统libtool-1.5.6-4.EL4.2

2008年10月7日星期二

php的pdo_mysql的扩展

最近有朋友重新安装了服务器,发现连接mysql出问题,不能使用pdo_mysql.查看了下phpinfo,发现仁兄编译的时候没给zlib,后期动态扩展pdo_mysql的时候貌似是加入了php_mysql,但是连接的时候还是报异常!
简要讲下pdo_mysql的安装

./configure --with-zlib --with-pdo-mysql[=DIR]

或者参考手册动态加载,但是一定要注意,pdo-mysql需要zlib
参考手册

2008年9月27日星期六

vim环境ctags taglist 整合

需要在linux改c程序,所以需要弄下vim的环境.
系统 centos 5.2
安装ctags

yum install ctags

获得taglist

wget "http://www.vim.org/scripts/download_script.php?src_id=7701"
unzip taglist_45.zip
在你的用户目录下创建.vim目录(如/home/gogo407/.vim ; /root/.vim)
分别把taglist_45.zip解压出来的doc,plugin移入.vim文件夹中,如果.vim中已经存在doc和plugin文件夹,则讲doc中的文档和plugin中的插件,移入.vim中的相应位置
修改plugin中的taglist.vim中的76行,添加 let Tlist_Ctags_Cmd = "/usr/bin/ctags"
72 " function is not available, then don't load the plugin.
73 if !exists('*system')
74 echomsg 'Taglist: Vim system() built-in function is not available. ' .
75 \ 'Plugin is not loaded.'
76 let Tlist_Ctags_Cmd = "/usr/bin/ctags"
77 let loaded_taglist = 'no'
78 let &cpo = s:cpo_save
79 finish
80 endif


用cronolog为例子

cd cronolog-1.6.2/
cd src/
ls *.c|ctags -R



准备就绪,我们看看效果

vim cronolog.c
:set nu
:TlistToggle


这个就是我们能看到的图像了
还有一些基本的命令,是我以前没有到的如

ctrl +ww 切换窗口
还有就是最有用的
:help
:help tag

参考资料 :http://www.softpanorama.org/Editors/ctags.shtml

2008年9月26日星期五

系统问题:Set_rtc_mmss: can’t update from 0 to 59

一朋友的服务器频繁的报:Set_rtc_mmss: can’t update from 0 to 59,帮朋友处理下

/usr/bin/rdate -s rdate.darkorb.net 先和标准世界时间同步下 linux下
hwclock -w
date
hwclock --show

把系统时间和cmos时间同步下就可以了!问题解决了。
具体代码

2008年9月16日星期二

nfs优化

参考: IBM的lamp优化文档
每个客户机应该用 rsize=32768,wsize=32768,intr,noatime 挂装远程文件系统,从而确保:

* 使用大的读/写块(数字指定最大块大小,在这个示例中是 32KB)。
* 在挂起时 NFS 操作可以被中断。
* 不持续更新 atime。

对 intr我可是深有感触,查看没有使用intr导致的问题及其处理
下面是起用noatime,并添加到fstab中
/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
LABEL=/boot /boot ext3 defaults,noatime 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=SWAP-hdb2 swap swap defaults 0 0
LABEL=SWAP-hda3 swap swap defaults 0 0

mysql性能之内存

通过最近的工作,发现内存对mysql来讲是相当重要的!以前觉得只要满足mysql的基本需要,就应该没有问题。所谓满足mysql的基本需要,就是基本上没有使用到swap.
而实际上系统cache对mysql的性能也会有比较大的帮助。
以前一台mysql 3G 内存(32系统默认的内存不支持4G以上大内存),在insert 或者update的高峰期,会导致系统负载从1上升到几十,而且这种情况多发生在cache不够用(我们的应用是cache<2500M),同时出现扫表或者建立硬盘临时表的时候。
当给系统的内存加至4G后(cache始终〉3000M),系统负载很少大于1,几乎没有超过2的。
所以我比较迷惑的有两点
1.cache对mysql的帮助?减少硬盘扫描的时间,怎么减少?
2.如何判断多少的cache值才是当前系统的合理值

php之allow_url_fopen

默认的php配置文件中有
allow_url_fopen = On
allow_url_include = Off

很显然,默认配置中是关闭了include远端的php文件,但是还是支持url_open.所以可能还是可以通过一些操作,通过url_fopen实现url_include。这样可能会引发一些webserver的安全问题。
但直接关闭url_fopen可能又会影响一些正常应用。
总之url_fopen和url_include需要稍加注意。

2008年9月9日星期二

怎么样在mysql中建表中使用IDENTITY

  时常有人需要在mysql中使用identity.如
create table admin
(
adminId int not null identity(1000,1),
adminName varchar(40) not null,
adminPass varchar(40) not null,

);

总是identity出错...想请教下为什么? 在mysql数据库下 把identity(1000,1),去掉就行.

可是我语法有错误么?

 从t-sql手册中这里可以了解identity的意思。
 换句话说,其实就是mysql中的auto_increment,详细方法参考这里
 对于问题的解决
 

  create table admin ( adminId int not null auto_increment,adminName varchar(40) not null, adminPass varchar(40) not null ,primary key (adminId) );
  alter table admin AUTO_INCREMENT=1000

  特记录:)

2008年9月8日星期一

linux发行版本号查看

以前不太知道的,但是想知道的

cat /etc/issue
CentOS release 5 (Final)
Kernel \r on an \m

这两个不是同一台:)

cat /etc/redhat-release
CentOS release 4.5 (Final)


cat /proc/version
Linux version 2.6.18-8.el5 (mockbuild@builder4.centos.org) (gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)) #1 SMP Thu Mar 15 19:57:35 EDT 2007


uname -a
Linux db-mysql-1 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux


一台centos 4.5
lsb_release -a
LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: CentOS
Description: CentOS release 4.5 (Final)
Release: 4.5
Codename: Final
另一台centos 5.0
lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5 (Final)
Release: 5
Codename: Final


以前不清楚,标记下:)

2008年9月1日星期一

nfs故障处理

状况: 因为各种原因导致一台nfs不能使用,而以前挂这这nfs的前端web负载节节升高,经过观察发现,每当执行地方这个命令的时候,总是执行不完.
情况类似于Blog ^A jianingy's
解决:
killall -KILL rpciod
杀掉rpcio的话可以解决df堆积的问题,但是不能根除,因为下次执行df的时候rpcio还是会出现.特别是如果你在crond中使用了df的时候.
根本解决,卸载出问题的nfs,如果你出问题的nfs为
222.222.222.222:/opt/nfs
,那你可以直接卸载掉,
umount 222.222.222.222:/opt/nfs
这样执行df的时候就不会再出问题了.
反思:

soft If an NFS file operation has a major timeout then report an I/O error to the calling program. The default is to continue retrying NFS file operations indefinitely.
hard If an NFS file operation has a major timeout then report "server not responding" on the console and continue retrying indefinitely. This is the default.
intr If an NFS file operation has a major timeout and it is hard mounted, then allow signals to interupt the file operation and cause it to return EINTR to the calling program. The default is to not allow file operations to be interrupted.

使用intr应该不会出现类似的问题.不过还好,我们可以解决问题.所以做sa&dba一定要思考严密

linux下切换用户启动服务

在linux用其他用户启动进程
如启动svn服务


#!/bin/sh
su svnuser -c '/opt/svn/bin/svnserve -d -r /opt/www/svnroot'


切换到svnuser这个用户去启动svn服务

2008年8月27日星期三

free-linux下基本命令

linux下面的内存查看,有时候让我比较迷茫

# free
total used free shared buffers cached
Mem: 3107520 1930720 1176800 0 732640 1050708
-/+ buffers/cache: 147372 2960148
Swap: 4194296 60 4194236

第一行是比较好理解的 总共的内存 3107520k 用掉了1930720k 空闲的1176800k 废弃 0K buffers 732640k cached 1050708k
第二行的理解有时候就让我迷糊,不过从扶凯的blog上,让我了解得比较清楚了
用掉了1930720k-buffers(732640k)-cached(1050708k)=147372K 这是程序已经使用了的内存,
而空闲的1176800k+buffers(732640k)+cached(1050708k)=2960148k (这表示是可以使用的,也许没有cached后,性能会降低,但是系统还是认为这些内存是可以使用的)。
顺便
-s update every [delay] seconds
-c update [count] times
这两个参数是比较好用的



参考:扶凯的blog

2008年8月21日星期四

mysql replication常见问题及其解决(一)

mysql replication同步出现问题的原因很多,其中有部分原因是因为master本身就出现了问题,今天遇到的问题就是master上的索引和数据出现了不一致,导致slave上同步也出现了问题。
解决问题很比较容易,按出错提示修复了下。
如下:
0:55:06 [ERROR] Slave: Error 'Incorrect key file for table 'space'; try to repair it' on query. Default da
tabase: ‘abc_table'. Query: 'update space set modified = '08-7-30 16:31:38' where id='11111'', Error_code: 1034


mysql> repair table space;
+-----------------+--------+----------+-------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-----------------+--------+----------+-------------------------------------------------+
| aa.abc_table | repair | info | Wrong bytesec: 0- 0- 0 at 13830188; Skipped |
| aa.abc_table | repair | status | OK |
+-----------------+--------+----------+-------------------------------------------------+
2 rows in set (8.40 sec)

问题虽然解决了,问题怎么样杜绝或者怎么样更好的预防和监控才是关键。
btw:我很想知道Error_code: 1034的具体意思

2008年8月13日星期三

windows XP home是没有组策略(Gpedit.msc)

windows XP home是没有组策略(Gpedit.msc)
我想删除administrator,怎么办呢!
开始菜单中运行
control userpasswords2

删除用户就可以:)

awk实际应用


netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

查看当前的连接,一直都不太清楚awk,所以基本上都只是会用的级别。
awk 后面的接的命令可以有
'或者"括起来
,这个都是允许的。
NF 当前行有多少列
NR 当前是第几行
FS 分割字符
这样就容易理解了netstat -n 出来的数据交给awk处理,
当awk读入一行数据,看开头是不是匹配tcp ,如果匹配,则在S[某种状态]自增,最后全部算完后,弄个 for循环,读出来.
在我的机子上等同于

netstat -n | awk '/^tcp/ {++S[$6]} END {for(a in S) print a, S[a]}'

类似的还有
awk ' { arr[$1]=arr[$1]+$2 } END { for( key in arr) { print key , arr[key] } } ' filename


弄来弄去,总算是感觉自己awk算入门了.

2008年7月18日星期五

[持续更新]各大爬虫的ip表--yahoo系

yahoo中国或者叫阿里yahoo的爬虫。
title是Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html


202.160.178.104
202.160.178.108
202.160.178.111
202.160.178.112
202.160.178.114
202.160.178.116
202.160.178.136
202.160.178.140
202.160.178.144
202.160.178.145
202.160.178.161
202.160.178.166
202.160.178.170
202.160.178.183
202.160.178.185
202.160.178.189
202.160.178.193
202.160.178.198
202.160.178.201
202.160.178.206
202.160.178.208
202.160.178.21
202.160.178.210
202.160.178.214
202.160.178.236
202.160.178.243
202.160.178.248
202.160.178.26
202.160.178.28
202.160.178.37
202.160.178.61
202.160.178.65
202.160.178.70
202.160.178.74
202.160.178.83
202.160.178.84
202.160.178.88
202.160.178.89
202.160.179.100
202.160.179.122
202.160.179.130
202.160.179.134
202.160.179.140
202.160.179.142
202.160.179.145
202.160.179.152
202.160.179.155
202.160.179.164
202.160.179.23
202.160.179.24
202.160.179.3
202.160.179.40
202.160.179.47
202.160.179.5
202.160.179.6
202.160.179.63
202.160.179.67
202.160.179.70
202.160.179.71
202.160.179.84
202.160.179.89
202.160.179.92
202.160.180.111
202.160.180.115
202.160.180.121
202.160.180.128
202.160.180.138
202.160.180.14
202.160.180.141
202.160.180.142
202.160.180.148
202.160.180.153
202.160.180.161
202.160.180.163
202.160.180.164
202.160.180.179
202.160.180.180
202.160.180.181
202.160.180.186
202.160.180.187
202.160.180.208
202.160.180.23
202.160.180.34
202.160.180.43
202.160.180.54
202.160.180.57
202.160.180.58
202.160.180.64
202.160.180.73
202.160.180.77
202.160.180.80
202.160.180.81
202.160.180.99
202.160.181.184
202.160.181.189
202.160.181.190

还有yahoo,应该算是美国
title是Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp

74.6.22.112
74.6.16.161
74.6.16.171
74.6.17.125
74.6.17.233
74.6.17.24
74.6.18.113
74.6.18.166
74.6.18.183
74.6.18.99
74.6.18.99
74.6.19.109
74.6.19.230
74.6.19.87
74.6.20.114
74.6.20.116
74.6.20.161
74.6.20.61
74.6.22.48
74.6.23.118
74.6.23.118
74.6.23.152
74.6.23.179
74.6.23.36
74.6.23.87
74.6.24.101
74.6.24.101
74.6.25.187
74.6.25.252
74.6.25.252
74.6.25.52
74.6.26.175
74.6.26.244
74.6.26.28
74.6.26.44
74.6.26.44
74.6.28.158
74.6.28.224
74.6.28.246
74.6.28.29
74.6.29.177
74.6.29.234
74.6.29.239
74.6.29.47
74.6.29.62
74.6.7.160
74.6.7.229
74.6.7.254
74.6.7.254
74.6.7.89
74.6.9.44
74.6.9.52
74.6.9.58

2008年7月14日星期一

lamp-隐藏php的版本

默认的lamp假设起来的web服务器,头信息中会显示

X-Powered-By: PHP/5.2.6

需要在php.ini中设置
expose_php = Off

并且重启apache
参考 1.apache tip
2.资料

[虚惊]硬盘挂了

早上来公司,同事在msn上留言,说测试服务器上的mantis,数据库出问题了!
连上服务器,top ,dmesg...几乎大多数命令都不能用,以为是path设置有问题,强强行输入全路径,还是不能用,跑到目录里面一看,文件夹里面很多打不开。cd 进去ssh就断。
出错信息和这位兄弟的类似
心想,这下硬盘糟了!看看mysql目录下面的数据库还能看见,马上copy了一份到另外的机子上!
测试服务器连上显示器,满屏幕的error.
重启后,更本不认这块硬盘了!(一共有两块硬盘,第一块已经不认了),把硬盘取下,连到自己的机子上面,发现能认出来,也能进入硬盘,东西还在!(高兴)。立马把需要的东西,全都copy出来,对硬盘fsck一下,没有问题!
把这块硬盘挂回去,好了!
故障分析,可能连接硬盘的线没有插好,导致系统找不到硬盘(类似硬盘坏掉的现象)
虽然是测试服务器,但我也真吓了一跳。
虚惊一场,不过不管做啥,备份很重要:)

2008年6月19日星期四

linux系统服务-acpid

acpid是管理系统电源的,通常笔记本需要启动
acpid :acpid(Advanced Configuration and Power Interface)是为替代传统的APM电源管理标准而推出的新型电源管理标准。通常笔记本电脑需要启动电源进行管理。
作为服务器可以关闭

2008年6月17日星期二

apache日志中记录X-Forwarded-For

有些时候,我们会在squid后面接apache,或者lighttpd等webserver.我们希望原始服务器能够记录下真实用户的ip,于是有需要头信息中的X-Forwarded-For。
当然,需要squid能把X-Forwarded-For传出来(squid当然可以替换掉X-Forwarded-For或者修改X-Forwarded-For)
那么apache的日志格式如下
原来的

LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

修改后

LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\"%>s%b\"%{Referer}i\" \"%{User-Agent}i\"" combined


参考:1
apache日志文档

2008年6月9日星期一

mysql版本

今天在csdn上看见有人在问mysql alpha,beta ,RC,GA等版本号之间的区别,感觉自己知道,但是也不是非常清楚,就翻了下手册,看了下,顺便做个记录。
alpha 暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性

beta 以后的beta版、发布版或产品发布中,所有API、外部可视结构和SQL命令列均不再更改,不再向代码中添加影响代码稳定性的新特性。

rc 是指 Release Candidate. Release candidates被认为是稳定的, 通过了mysql所有的内部测试, 修正了所有已知的致命bug. 但是rc版本还没有经历足够长的时间来确认所有bug都已经发现,但是对rc版本只会做些小的bug修正

GA如果没有后缀,则暗示这是一个大多数情况下可用版本或者是产品版本。. GA releases是稳定的, 并通过了早期版本的测试,并显示其可用性, 解决了所有严重的bug, 并且适合在生产环境中使用. 只有少数较为严重的bug修改才会添加到该版本中。

通常来讲我们在生产环境中还是建议使用GA版本:)






参考来源:英文5.1手册
翻译的手册

2008年6月3日星期二

net-snmp启动不起来

今天遇到一问题
系统centos5
net-snmp net-snmp-5.3.1-19.el5_1.4

[dba@db-mysql2 log]# service snmpd stop
Stopping snmpd: [FAILED]
[dba@db-mysql2 log]# service snmpd start
Starting snmpd: [ OK ]
[dba@db-mysql2 log]# service snmpd restart
Stopping snmpd: [FAILED]
Starting snmpd: [ OK ]

snmpd 启动不起来,但是也没有出错日志
google了下,资料不多,
1有人通过重新编译源码包解决了问题.
2 在centos的bug中,有人提到
Seems to be a dependency problem - just updating net-snmp doesn't update net-snmp-libs. The combination of net-snmp 5.3.1-19.el5_1.4 and net-snmp-libs 5.3.1-19.el5_1.3 leads to the described error, updating net-snmp-libs solves it
.也就是rpm包依赖性的问题,通过 install net-snmp-libs 可以解决问题。
所以未避免出现问题 net-snmp-libs 和 net-snmp需要同时安装


centos bug2700

2008年5月29日星期四

乱码-utf8

乱码,乱码!乱马1/2
做web难免会遇到乱码,可最近迁移完服务器后,用户post上来的数据有人出现的是乱码(几率很小)。
squid -> apache ->php->mysql
apache 中页面编码的设置为utf8
真是奇怪了,mysql

mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+

mysql> show variables like 'character\_set\_%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |


apache 的页面是设置的utf8
实在是头疼不知道问题出现在哪里,不过有传输的地方就有编码的不一直,只有先在每一段设置下监控,看乱码最先是在哪里产生的!
初步猜测应该是在squid->apache这里由于网络问题产生的:)
先在这里记录下,前端稍微也做下调整。
update(2008-06-09):可能是别人写得发帖机器人post过来数据的编码存在一些问题。
update(2008-11-26):问题已经彻底解决,原因是之前有个和电信互联星空的一个合作项目,他们的页面编码是gb2312的,服务器是以前的老web服务器(域名不一样),由于我们迁移后,数据库的编码做了统一,而从合作项目post过来的数据作为gb2312过来的,所以插入数据库的时候数据乱码了!把post过来的数据做了下处理就好了:)

2008年5月27日星期二

mysql 安装

安装mysql时可能会遇到下面的问题(os :centos 5.0)
checking for termcap functions library... configure: error: No curses/termcap library found

解决方法:
yum install ncurses-devel

2008年5月5日星期一

header信息不一致

遇到一个trouble
一个css 访问的过程是squid ->apache(deflate)
直接访问apache是可以得到正确的header

HTTP/1.1 200 OK
Date: Mon, 05 May 2008 07:32:32 GMT
Server: Apache
Last-Modified: Thu, 27 Mar 2008 02:32:28 GMT
ETag: "278c15c-19da-ff234700"
Accept-Ranges: bytes
Cache-Control: max-age=5184000
Expires: Fri, 04 Jul 2008 07:32:32 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 1834
Connection: close
Content-Type: text/css


而经过了squid 后,时而好,时而不好
下面是不好

Date: Mon, 05 May 2008 07:30:29 GMT
Server: Apache
Content-Type: text/plain; charset=UTF-8
Last-Modified: Thu, 27 Mar 2008 02:32:28 GMT
ETag: "278c15c-19da-ff234700"
Accept-Ranges: bytes
Content-Length: 6618
Cache-Control: max-age=5184000
Expires: Fri, 04 Jul 2008 07:29:29 GMT
Age: 60
***-Cache: MISS from nj-1.***.com
***-Cache-Lookup: MISS from nj-1.***.com:80
Via: 1.0 nj-1.***.com:80 (*** Cache)


过squid好的情况

HTTP/1.0 200 OK
Date: Mon, 05 May 2008 07:33:40 GMT
Server: Apache
Last-Modified: Thu, 27 Mar 2008 02:32:28 GMT
ETag: "278c15c-19da-ff234700"
Accept-Ranges: bytes
Cache-Control: max-age=5184000
Expires: Fri, 04 Jul 2008 07:33:40 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 1834
Content-Type: text/css
***-Cache: MISS from nj-1.***.com
***-Cache-Lookup: MISS from nj-1.***.com:80
Via: 1.0 nj-1.***.com:80 (*** Cache)
Connection: close


已知的情况
1.url带问号,如:

www/style/layout1.css?v=20080327_v1.css

2.apache已设置mod_deflate,和 mod_mem_cache,apache的addtype是正确的

CacheEnable mem /
MCacheSize 10240
McacheMaxObjectCount 5000


猜测原因1,mod_mem_cache的问题,squid设置的问题
需要进一步关注:)

2008年4月17日星期四

低版本php添加json

一个php5.1.2的版本需要添加json.so,虽然json也有纯php的实现,但是我们还是希望能后添加php的扩展。
JSON (JavaScript Object Notation) ,详细介绍,请查看该链接
json的php的扩展是php5.2以后才在ext目录下有的!
为了偷懒,我大概查看了php源码下ext/json的源码,貌似是可以作为扩展安装在php5.2版本下面的。
于是我就给php5.1.2安装了一个json扩展,代码来之于php5.2.5的源码。经过测试以前正常,有时间看看json,包括它的php的扩展的实现:)

2008年4月15日星期二

脚本批量替换

每个人都要为过去的事情买单。
需求:修改文件夹中所有文件,把http://a.b.c/d 替换成https://e.f.g/h
文件有很多,人来做是不太现实的了
参考了下面
车东的文章,评论也很精彩。
RainX的blog
总结下来有这么几种做法
用sed

sed --in-inplace -e 's#http://a.b.c/d #https://e.f.g/h#g' *

可以结合find查找自己需要的文件
用perl

perl -e ’s#http:\/\/a\.b\.c\/d#https:\/\/e\.f\.g\/h#i’ -pi.bak `(find . -type f )`

2008年4月11日星期五

squid cvs库

squid源码在cvs库中,而不是我们现在常用的svn中!准备添加一个小patch,所以需要check out一下源代码
cvs -d:pserver:anonymous@cvs.devel.squid-cache.org:/cvsroot/squid
login
密码为空
cvs -d:pserver:anonymous@cvs.devel.squid-cache.org:/cvsroot/squid co -d squid-2.6 squid
squid就是当前的2.6版本
cvs -d:pserver:anonymous@cvs.devel.squid-cache.org:/cvsroot/squid co -d squid-3 squid3

cvs -d:server co(check out) -d 本地目录 项目名
具体使用看cvs在squid-cache上的老的说明
貌似wiki上面的说明有点问题。
开始研究squid源代码了。

2008年4月6日星期日

mysql优化-索引优化

pabloj的blog上讲了两个关于索引优化的案例
第一个倒是我们在实际工作中经常会遇到的,由于项目的数据库设计者经验有限,时间也不是很充裕,所以在两个表的同一个字段经常会设置成两个不同的数据类型,这在联表的时候是不会使用到这个索引的,经常出问题的是int和char ,int和bigint ,char和varchar.
第二个,如果我们出现全表扫描的时候,一定需要去确认下,我们索引是否适用得合适!
其实没有什么高深的东西,但是使用不恰当或者没有注意真得会带来意想不到的性能损失!

2008年4月5日星期六

mysql脚本-mysqld_safe

mysqld_safe脚本是我们启动mysqld的一个脚本。他的作用在于: scripts to start the MySQL daemon and restart it if it dies unexpectedly(能够重启mysqld,如果mysqld意外的die掉。这在一些不稳定的进程中是比较常遇到的,比如某天我的lighttpd就意外退出,日志总没有任何记录,所以我们可能需要其他进程帮我们进行看管)
脚本共430行,下面可能对脚本进行下分析,力求能读懂他的实现过程.
1-12 :是注释和版权说明

13 KILL_MYSQLD=1;
14 MYSQLD=
15
16 trap '' 1 2 3 15 #捕捉信号 1 2 3 15,进行忽略 ( trap -l或kill -l能得到详细的信号表)
17
18 umask 007 #设置掩码
19
20 defaults=
21 case "$1" in
22 --no-defaults|--defaults-file=*|--defaults-extra-file=*)
23 defaults="$1"; shift
24 ;;
25 esac #读入主配置文件


####help的说明文档
27 usage () {
}



###函数parse_arguments()解析参数,需要带入arg
50 parse_arguments() {
51 # We only need to pass arguments through to the server if we don't
52 # handle them here. So, we collect unrecognized options (passed on
53 # the command line) into the args variable.
54 pick_args=
55 if test "$1" = PICK-ARGS-FROM-ARGV ##54-59我好像很少用到,看第一个参数是不是PICK-ARGS-FROM-ARGV,如果是,令pick_args=1,并且让参数数组左移一位
56 then
57 pick_args=1
58 shift
59 fi
60
61 for arg do ##arg是赋值进来的参数,并用同样的方法解析参数
62 case "$arg" in
63 --skip-kill-mysqld*)
64 KILL_MYSQLD=0;
65 ;;
66 # these get passed explicitly to mysqld
67 --basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
68 --datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
69 --pid-file=*) pid_file=`echo "$arg" | sed -e "s;--pid-file=;;"` ;;
70 --user=*) user=`echo "$arg" | sed -e "s;--[^=]*=;;"` ; SET_USER=1 ;;
71
72 # these two might have been set in a [mysqld_safe] section of my.cnf
73 # they are added to mysqld command line to override settings from my.cnf
74 --socket=*) mysql_unix_port=`echo "$arg" | sed -e "s;--socket=;;"` ;;
75 --port=*) mysql_tcp_port=`echo "$arg" | sed -e "s;--port=;;"` ;;
76
77 # mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])!
78 --ledir=*) ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
79 --log-error=*) err_log=`echo "$arg" | sed -e "s;--log-error=;;"` ;;
80 --open-files-limit=*) open_files=`echo "$arg" | sed -e "s;--open-files-limit=;;"` ;;
81 --core-file-size=*) core_file_size=`echo "$arg" | sed -e "s;--core-file-size=;;"` ;;
82 --timezone=*) TZ=`echo "$arg" | sed -e "s;--timezone=;;"` ; export TZ; ;;
83 --mysqld=*) MYSQLD=`echo "$arg" | sed -e "s;--mysqld=;;"` ;;
84 --mysqld-version=*)
85 tmp=`echo "$arg" | sed -e "s;--mysqld-version=;;"`
86 if test -n "$tmp"
87 then
88 MYSQLD="mysqld-$tmp"
89 else
90 MYSQLD="mysqld"
91 fi
92 ;;
93 --nice=*) niceness=`echo "$arg" | sed -e "s;--nice=;;"` ;;
94 --help)
95 usage
96 ;;
97 *)
98 if test -n "$pick_args"
99 then
100 # This sed command makes sure that any special chars are quoted,
101 # so the arg gets passed exactly to the server.
102 args="$args "`echo "$arg" | sed -e 's,\([^a-zA-Z0-9_.-]\),\\\\\1,g'`
103 fi
104 ;;
105 esac
106 done
107 }
108




110 #找到根目录和mysqld所在的位置
111 # First, try to find BASEDIR and ledir (where mysqld is)
112 #
113
114 MY_PWD=`pwd`
115 # Check for the directories we would expect from a binary release install
116 if test -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld
###test的用法详见man test errmsg.sys存在并且是一般的文件同时mysqld存在并且是可执行文件
117 then
118 MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
119 ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
120 # Check for the directories we would expect from a source install
121 elif test -f ./share/mysql/english/errmsg.sys -a \
122 -x ./libexec/mysqld
123 then
124 MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
125 ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld is
126 # Since we didn't find anything, used the compiled-in defaults
127 else
128 MY_BASEDIR_VERSION=/home/mysql5.0/
129 ledir=/home/mysql5.0/libexec
130 fi




131##找到数据所在的目录
132 #
133 # Second, try to find the data directory
134 #
135
136 # Try where the binary installs put it
137 if test -d $MY_BASEDIR_VERSION/data/mysql
138 then
139 DATADIR=$MY_BASEDIR_VERSION/data
140 if test -z "$defaults" -a -r "$DATADIR/my.cnf" ##
###$defaults长度为0且$DATADIR/my.cnf存在并可读
141 then
142 defaults="--defaults-extra-file=$DATADIR/my.cnf"
143 fi
144 # Next try where the source installs put it
145 elif test -d $MY_BASEDIR_VERSION/var/mysql
146 then
147 DATADIR=$MY_BASEDIR_VERSION/var
148 # Or just give up and use our compiled-in default
149 else
150 DATADIR=/home/mysql5.0/var
151 fi




######确认$MYSQK_HOME,并寻找my.cnf
153 if test -z "$MYSQL_HOME"
154 then
155 if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf"
156 then
157 echo "WARNING: Found two instances of my.cnf -"
158 echo "$MY_BASEDIR_VERSION/my.cnf and"
159 echo "$DATADIR/my.cnf"
160 echo "IGNORING $DATADIR/my.cnf"
161 echo
162 MYSQL_HOME=$MY_BASEDIR_VERSION
163 elif test -r "$DATADIR/my.cnf"
164 then
165 echo "WARNING: Found $DATADIR/my.cnf"
166 echo "Datadir is deprecated place for my.cnf, please move it to $MY_BASEDIR_VERSION"
167 echo
168 MYSQL_HOME=$DATADIR
169 else
170 MYSQL_HOME=$MY_BASEDIR_VERSION
171 fi
172 fi
173 export MYSQL_HOME



#####我们需要设置的变量
175 user=mysql
176 niceness=0
177
178 # these rely on $DATADIR by default, so we'll set them later on
179 pid_file=
180 err_log=




182 # Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
183 # and then merge with the command line arguments
184 if test -x ./bin/my_print_defaults
185 then
186 print_defaults="./bin/my_print_defaults"
187 elif test -x /home/mysql5.0/bin/my_print_defaults
188 then
189 print_defaults="/home/mysql5.0/bin/my_print_defaults"
190 elif test -x /home/mysql5.0/bin/mysql_print_defaults
191 then
192 print_defaults="/home/mysql5.0/bin/mysql_print_defaults"
193 else
194 print_defaults="my_print_defaults"
195 fi
##########确认print_default,具体用途不明白###############
197 args= #设置变量为空
198 SET_USER=2
199 parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`
#####用上面确认的print_defaults去解析配置文件
# 解析成下面的格式,方便得到参数
# ./my_print_defaults -c /etc/my.cnf5.0 --loose-verbose mysqld server
#--port=3307
#--socket=/home/mysql5.0/tmp/mysql.sock
#--skip-locking
#--key_buffer=16M
#--max_allowed_packet=1M
#--table_cache=64
#--sort_buffer_size=512K
#--net_buffer_length=8K
#--read_buffer_size=256K
#--read_rnd_buffer_size=512K
#--myisam_sort_buffer_size=8M
#--log_slow_queries=/home/mysql5.0/var/mysql5.0_slow_query.log
#--long_query_time=3
#--log-bin=mysql5.0-bin
#--server-id=2
#--tmpdir=/home/mysql5.0/tmp/
###########################################
200 if test $SET_USER -eq 2
201 then
202 SET_USER=0
203 fi



#####从my.cnf中得到参数
204 parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
#####从启动mysqld_safe中读取参数 $@是启动mysqld_safe的时候带入的
205 parse_arguments PICK-ARGS-FROM-ARGV "$@"
206 safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-/home/mysql5/tmp/mysql.sock}}
######不太清楚这句赋值是什么意思


208 # Make sure that directory for $safe_mysql_unix_port exists
###确认socket文件存在
209 mysql_unix_port_dir=`dirname $safe_mysql_unix_port`
210 if [ ! -d $mysql_unix_port_dir ]
211 then
212 mkdir $mysql_unix_port_dir
213 chown $user $mysql_unix_port_dir
214 chmod 755 $mysql_unix_port_dir
215 fi
216



216###确认mysqld的存在
217 # Use the mysqld-max binary by default if the user doesn't specify a binary
218 if test -z "$MYSQLD"
219 then
220 if test -x $ledir/mysqld-max
221 then
222 MYSQLD=mysqld-max
223 else
224 MYSQLD=mysqld
225 fi
226 fi
227
228 if test ! -x $ledir/$MYSQLD
229 then
230 echo "The file $ledir/$MYSQLD doesn't exist or is not executable"
231 echo "Please do a cd to the mysql installation directory and restart"
232 echo "this script from there as follows:"
233 echo "./bin/mysqld_safe".
234 echo "See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more"
235 echo "information"
236 exit 1
237 fi




238###整理相关的参数如pid_file,err_log,socket,tcp_port,nice#####
239 if test -z "$pid_file"
240 then
241 pid_file=$DATADIR/`/bin/hostname`.pid
242 else
243 case "$pid_file" in
244 /* ) ;;
245 * ) pid_file="$DATADIR/$pid_file" ;;
246 esac
247 fi
248 test -z "$err_log" && err_log=$DATADIR/`/bin/hostname`.err
249
250 if test -n "$mysql_unix_port"
251 then
252 args="--socket=$mysql_unix_port $args"
253 fi
254 if test -n "$mysql_tcp_port"
255 then
256 args="--port=$mysql_tcp_port $args"
257 fi
258
259 if test $niceness -eq 0
260 then
261 NOHUP_NICENESS="nohup"
262 else
263 NOHUP_NICENESS="nohup nice -$niceness"
264 fi



265
266 # Using nice with no args to get the niceness level is GNU-specific.
267 # This check could be extended for other operating systems (e.g.,
268 # BSD could use "nohup sh -c 'ps -o nice -p $$' | tail -1").
269 # But, it also seems that GNU nohup is the only one which messes
270 # with the priority, so this is okay.
271 if nohup nice > /dev/null 2>&1
272 then
273 normal_niceness=`nice`
274 nohup_niceness=`nohup nice`
275
276 numeric_nice_values=1
277 for val in $normal_niceness $nohup_niceness
278 do
279 case "$val" in
280 -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | \
281 [0-9] | [0-9][0-9] | [0-9][0-9][0-9] )
282 ;;
283 * )
284 numeric_nice_values=0 ;;
285 esac
286 done


还有100多行,头疼了,先休息去了

2008年3月18日星期二

mysql的锁机制-初步

总结一下mysql的锁机制,主要参考资料:手册lock_table
主要使用:
先在test库中创建测试表test1

mysql> use test;
mysql> create table `test1` ( `id` int(10) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;//并在test1表中插入1-7共7行数据以供测试

先讲读锁(read lock)

mysql>lock tables test1 read; //同时给所有数据库加读锁FLUSH TABLES WITH READ LOCK
mysql> insert into test1 values(8);
ERROR 1099 (HY000): Table 'test1' was locked with a READ lock and can't be updated

与此同时,另外的一个连接

mysql> select * from test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+----+
7 rows in set (0.00 sec)
//可以读,但不能写
mysql> insert into test1 values(8);
Query OK, 1 row affected (1 min 59.94 sec)//两分钟是上面进程锁表的时间

关于解锁

mysql> unlock tables ; //解除当前连接建立的所有的锁


再讲写锁

mysql> lock tables test1 write;
Query OK, 0 rows affected (0.00 sec)
//本连接,锁表的连接
mysql> select * from test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
+----+
8 rows in set (0.00 sec)
//可以读
mysql> insert test1 value(9);
Query OK, 1 row affected (0.00 sec)
//可以写


同时其他连接

mysql> select * from test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+----+
9 rows in set (27.84 sec)
//同时不能读
mysql> insert test1 value(10);
Query OK, 1 row affected (35.55 sec)
//也不能写


2008年3月13日星期四

硬盘空间监控

虽然nagios中有监控系统硬盘空间的,但我还是想自己来定制一份,来满足我简单的需求。
需求的功能:
1.检测空间
2.邮件通知

perl版:

1 #/usr/bin/perl
2 ##############################
3 #author skine0709@gmail.com
4 #date 2008-03-15 #
5 ##############################
6 use warnings;
7 use strict;
8 use MIME::Lite;
9 use Net::SMTP;
10
11 my $opt_R = q/^$/;
12 my $opt_r = "";
13 my $exclude_re = "(^//|^none)";
14 my $cmd="/bin/df -k";
15 my @output = `$cmd` ;
16 my $a;
17 #########setting#################
18 my $alert=90;
19 my @email=('****@***.com'); //发送到邮件地方
20 my $mailserver='smtp.***.com'; // smtp server
21 my $mailuser='********'; //邮件用户
22 my $mailpasswd='********'; //邮件密码
23 my $debug=0; //是否调试
24 ################################
25 #print "@output";
26 foreach my $a (@output) {
27 if ( $a =~ /([\d\w\/]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%\s+([\/\w\d\.-] +)$/) {
28 # next if ($a = ~ m/$opt_R/);
29 # next if ($a !~ m/$opt_r/);
30 # next if ($a =~ m/$exclude_re/);
31 my ($dev,$s,$u,$f,$pu,$d) = ($1,$2,$3,$4,$5,$6);
32 if ($5 > $alert) {
33 my $driver=$6;
34 my $num=$5.'%';
35 disk_mail($driver,$num);
36 };
37 }
38
39 }
40
41 sub disk_mail
42 {
43 my $driver=shift;
44 my $num=shift;
45 my $time=localtime;
46 my $hostname=`hostname`;
47 foreach my $email (@email){
48 my $meg=MIME::Lite->new
49 (
50 Subject=>"disk alert",
51 From=>'skine0709@163.com',
52 To=>$email,
53 Type=>'text/html',
54 Data=>"$driver --- $num --- $time --- $hostname"
55 );
56 $meg->send('smtp',"$mailserver", Debug=>"$debug",
57 AuthUser=>"$mailuser", AuthPass=>"$mailpasswd");
58 }
59
60 }

随意写了一个,感觉爱蛮好用的。至少是满足我的需求了,参考了nagios插件中的check_disk.pl
当然,简单的也有一句话的shell

df|awk '{gsub(/%/,"")} NR>1 {if($5>90) print $5"%"}'

参考:一个简单的磁盘报警脚本
nagios中的check_disk.pl

2008年3月12日星期三

apache中给ani正确的MIME类型

需要给网页中的鼠标变换图像,文件后缀为.ani 或者.cui的!
apache中需要给定一个类型application/octet-stream .ani
就可以了!
但是这玩意有安全漏洞,因为这样后,IE就会把这个.ani就是可执行文件了!
HOHO ,firefox不理这个东东:)

apache mod_proxy模块不太好用

不知道是自己对apache的了解还不够透彻还是mod_proxy真的不太好用,用apache的proxy做代理的时候真的不太好用!做代理的时候效果明显不如squid,特别是当网络不稳定的时候,会时不时的不能建立连接!
类似于 ap_proxy_connect_backend disabling worker for
(***.domain.com)
暂时我也不清楚原理,不过从google结果来看,应该是判断了原始服务器dead,所以在默认的时间内不再发起http请求了。
具体问题,以后再说。反正用apache的mod_proxy做代理千万要考虑到这个问题.
mod_proxy中,我们常用到的是
ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/

但是我在这里存在两点疑问:
1.ProxyPassReverse 实际的作用是什么,他能避免掉什么问题
2.我怎么能设置一个固定的ip来作为我的backend


update:2008-08-18

2008年3月7日星期五

svn使用hook--自动更新

产品服务器上面需要自动更新最新的版本库,这时就需要能够在svn中添加hook了!由于同步更新是在commit之后需要执行的,所以写在post-commit里面(记得要有执行权限)

/usr/bin/svn up [PATH...] -r 'HEAD' --non-interactive --username *** --password *** --ignore-externals

这样的话就应该可以自动更新了
如果是远程就可以通过ssh来执行了

usr/bin/ssh user@ip " /usr/bin/svn up [PATH...] -r 'HEAD' --non-interactive --username=*** --password=*** --ignore-externals"

客户端的老版本不支持--ignore--externals (忽略外部扩展)

2008年3月6日星期四

mysql 存储过程-我的第一个过程

一直想动手写写存储过程,却总是遗忘了。参考手册,写下我第一个procedure。

use mysql;
delimiter //
create procedure gogo407count (out gogo407 int )
begin
select count(*) into gogo407 from mysql.user;
end

由于到现在为止,我还不清楚什么东西些procedure最舒服,所以我觉得直接存在**.sql之后,再执行是比较方便的。因为现在没有在线修改存储过程的工具!当我们需要修改已经写好的procedure后,我们需要先删除

mysql>drop mysql.gogo407count (procedure是属于某一个数据库的,所以需要指定数据库)

然后再写入修改后的procedure

2008年3月4日星期二

mysql问题-drop user出错

在做mysql的操作的时候,需要drop user一个用户,可如果你有两个以上的用户名一样,drop user 的时候就会报错
ERROR 1268 (HY000): Can't drop one or more of the requested users

在这种情况下只有
mysql>delete from mysql.user where host='' and user=''
mysql>flush privileges

mysql论坛上也有类似的问题
mysqld的版本是4.1.18

2008年2月26日星期二

linux使用 --分区

最近硬盘空间不够了,想把以前的windows分区直接拿过来。
umount /mnt/wind (卸载 已经挂载的windows分区)
mkfs -t ext3 /dev/***
mount -t ext3 /dev/*** /mnt/download
操作其实很简单:)

2008年2月25日星期一

svn使用问题-文件和目录名不可用

常在河边走,哪有不湿鞋。某天svn up的时候遇到了
svn: Valid UTF-8 data
(hex: 72)
followed by invalid UTF-8 sequence
(hex: e9 75 6e 69)

顺手google了下,svn邮件列表中有 相关讨论。
粗略看了下,似乎是文件名或者目录名是非utf8的,删除后立马ok,(或者用iconv来修改文件名)
问题产生的本身是因为用ftp上传了非utf8的文件名的文件,而在服务器上(服务器编码是utf8)不能把该文件加入到svn版本库中。
随手做了下测试,在windows机子了,用非utf8的文件名的文件在提交的后,会自动转码。
 问题的根本,可能就是svn的客户端是根据os的环境指定的编码来做一系列的推断的!

2008年2月24日星期日

服务器状况--内存泄露导致服务不可用

好一个星期天,中午的收到手机短信报警。闷闷不乐的打开电脑,想连上服务器看看到底发生了什么。
状况:
1.服务器可以ping通,无任何异常现象
2.服务器任何端口都连接不上
解决过程:
1.尝试从各个地方连接服务端口,都没有响应。
2.联系机房重启服务器(怀疑服务器被攻击)
3.重启服务器,重启后正常。
4.查看日志(正常),查看重启前负载,内存使用等基本信息(负载200以上,内存吃光)
5.查找攻击迹象或者程序内存泄漏的迹象
6.发现crontab中某程序狂吃内存,以每秒10M的速度吃内存.
7.暂时在crontab中注释掉该程序
后续
1.分析该程序,内存泄漏的根本原因
2.不管是写程序和维护都应该对自己负责,对别人负责,毕竟是一个团队,和不喜欢负责任的人一起工作实在是太累了:)
总结
整个过程使服务暂停10分钟,这样的一个小问题,导致的用户不爽,太那个了.
希望一切一切都可以慢慢的向好的方面发展.
遐想:
1.似乎需要有程序对内存使用以固定的频率进行检查.
2.服务器是centos4,其他的unix os是不是对内存使用的监控和分配更加可控和合理?

2008年1月14日星期一

mysql内存使用与优化-myisam

凌晨,一台mysql(全部是myisam表)出现了内存不足!
Out of memory; restart server and try again (needed 67108856 bytes)

Got error 12 from storage engine

[ERROR] Got error 12 when reading table './****/baby'

很明显,该台mysql关于内存设置偏高,导致mysql请求分配内存失败!特别是每连接独享的内存设置存在问题,当连接数过多时,内存会相当稀缺!而myisam的cache是使用的文件系统本身的cache,所以内存不足将导致性能急剧下降。
先了解对于myisam我们需要调节的几个跟内存相关的参数!
所有连接共享的参数
1 key_buffer_size
这个肯定都知道,索引区大小
2 query_cache_size
查询缓存区大小
每连接独享的参数
3 join_buffer_size
在不使用索引的情况下,用于完全联接的缓冲区的大小!
4 read_buffer_size
读每个表里面连续的一块东西使用的缓存区大小
5 read_rnd_buffer_size
对已经排序了的结果直接读取,避免从disk读取
6 sort_buffer_size
排序空间大小
7 thread_stack
默认的已经足够大192K
8 binlog_cache_size
这个我用的很少,具体见手册
上面每连接独享的参数,一定要注意!如果修改不当,将导致mysql内存不足,偷鸡不成,反赊把米!
基本内存估算就是
全局内存=key_buffer_size+query_cache_size
每连接独享内存=sort_buffer_size+read_buffer_size+read_rnd_buffer_size+join+buffer_size
+上面的7和8(很少用)
所以使用的最大内存=全局内存+每连接独享内存*连接总数(max_connections)

2008年1月11日星期五

apache防webdup

2008年某天一大早来公司,查看流量表,发现凌晨一点的时候流量有些偏大!看日志发现,有人用webdup来抓cms!
想想,cms被小偷程序抓也不是一次两次了!本以为,这些小偷程序改个User-agent,我也不太好防!可令人气愤的是,在国内,这些小偷爬人家的站,User-agent都不愿意改下!
索性我也来个防菜鸟不防高手了,参考手册rewrite
写下下面小段的rewrite:
RewriteCond %{HTTP_USER_AGENT} ^Webdup.* [NC]
RewriteRule ^.* - [F,L]

稍微注释下:flag中的 [NC](No Case) 忽略大小写
[F] (force URL to be Forbidden) 给个403,静止入内:)
[L] (last rule) 应用了这条ReriteRule直接跳出,不在理会下面的rewrite了。
国内这种抓的气氛太浓了,不单只在内容上,在项目本身设计上也是这样,导致很多网站相似性太高!从内容本身很难去拉开于同类网站的差距,在国内创意变得不再是最最重要的创业基础,你的项目有创意,好的前景,人家照样插。从blog在国内的发展我们就能看出端倪。在短时间内做大做强,做出用户,做出品牌!

2008年1月9日星期三

apache配置-Sections

在配置apache的时候,我们经常需要对同一个虚拟主机下面的不同目录,不同的url,不同的文件做不同的配置。
常见的需求是首页的max-age=90,但是内页的max-age=9000或者更常,而内页可能体现在不同的目录,或者在同一目录下面只是不同的url.
所以我们需要把他们分开进行配置,我们能使用的指令有Directory
Directorymatch
files
filesmatch
href="http://httpd.apache.org/docs/2.0/mod/core.html#location">location
locationmatch
proxy
proxymatch
从头到尾,这些都是所谓的容器!可能让我们根据特性把集合分开!

linux系统命令 vmstat

经常使用vmstat来查看系统的运行状况,实际上却还是有些细节被我忽略了!
今天正好兴起,就一次性弄清楚!
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
我们经常会看见r的数值比较大,也很明显的知道等待运行的进程比较多,
Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)
内存使用情况的说明,和free显示的内容是一样的
Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
交换区的使用情况
IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).
对物理块的读写速率
System
in: The number of interrupts per second, including the clock.
cs: The number of context switches per second
in是中断次数/秒,cs是做上下文交换的次数/秒
CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.
cpu的使用率,id为空闲cpu,wa为等待磁盘io的使用率!wa过高的话,说明磁盘io存在一定的瓶颈.
发现以前学的操作系统好像在这里找到了些影子.

2008年1月6日星期日

squid3.0-STABLE1出炉

一直对squid情有独钟,也许是因为它maillist上面的热闹,也许他是我第一个深入了解的开源项目。也许也正是因为squid让我对http协议有了更深的了解。
总之在varnish昙花一现以后,squid3.0给出了第一个稳定版!squid2.6也给出了第17个稳定版
3.0与2.6之间具体差别,我还没来得及细细比较,
大体是增加了
# Code converted to C++, with significant internal restructuring and rewrites.
(用c++重构并改写了代码)
# ICAP implementation (RFC 3507 and www.icap-forum.org)
# Edge Side Includes (ESI) implementation (www.esi.org)
(实现了两个协议)
遗憾的是本来在2.6中实现了的follow_x_forwarded_for,在3.0中暂时还没有实现!
  

2008年1月3日星期四

apache模块之include_module

今天帮同事在测试机上添加下Server-Side Includes的支持!郁闷了一小时,愣是没有弄起来,测试机上是用的xmapp套件!对xmapp不熟悉,捣鼓了好一阵,还是没有搞定!
要找时间彻底把它搞定!
先理一下大体的思路吧!
Server-Side Includes(简称ssi)
手册上面的命令如下
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

在你需要进行ssi解析的里面添加
Options +Includes

当然和平常的指令一样,如果这些指令每授权给了.htaccess,可以在.htaccess里面设置
在手册的下面添加了一段

AddHandler server-parsed .shtml

apache会启动INCLUDES 链对能和MIME类型为text/x-server-parsed-html的文件
中间有需要了解的Filter,Handler!
在测试机上最后添加了AddHandler server-parsed .shtml才搞定!
但是为什么只是添加在输出链中在测试机上不鼎,在生产机上却是可以的!中间有什么样的不同了!
先记录在这里:),以后再深入研究下:)

2007年12月17日星期一

mysql状态变量——select%

mysql有很多的状态变量,而且随着版本的升级,状态变量也是越来越来多!
mysql>show status like ''select%';
可以得到我今天过关心的几个关于联表查询的几个状态变量。

Select_full_join
没有使用索引的联表查,如果这个值非0的时候,我们就要检查我们的索引是否合适,特别的针对联表查询。
Select_full_range_join
我不太确定它的含义,大致应该是对引用的表做了一个范围连接。
Select_range
在连接过程对第一张表做范围选择,即使这个值比较大也没有什么问题
Select_range_check
(The number of joins without keys that check for key usage after each row. If this is not 0, you should carefully check the indexes of your tables.)
连接没有使用索引,但却在每一个都去检查时候有可用的索引,如果它不为0,我们就应该检查下我们建立的索引是够恰当了
Select_scan
联表查询中对第一张表进行了全表查询

下面一张图是索引建立有问题的数据库状态

2007年12月11日星期二

mysql 开发中的代码--clone

当开源世界都在使用svn,或者开始转向svn的时候!mysql依旧使用着bk
我不清楚bk有什么好处,但是我知道,我想得到开发中的mysql5.1的源代码,我就必须只用bk
bitkeep上下载bk-clinet,
/bin/sh bk-client2.0.shar
cd bk-client2.0
make

./bkf clone bk://mysql.bkbits.net/mysql-5.1 /home/mysql-5.1

具体帮助可以在bitkeep网站找到
就此得到了mysql5.1开发中的源码,check out的时间有点长:)

同步开发中的代码
/home/bk-client2.0/bkf pull(类似于svn up)

httpd缓存模块mod_cache试用

当我们只有一台web前端或者服务器不够用的时候,但是我们又有比较多类似cms更新不平凡的页面和js,css,图片等静态元素的时候!我们是选择直接套squid还是使用后起的varish或者使用apache的mod_cache模块给我们提供的缓存功能呢!
前些天我尝试使用了apache的mod_cache模块,这个模块里面有mod_disk_cache(硬盘缓存),mod_mem_cache(内存缓存)。
Sample httpd.conf

#
# Sample Cache Configuration
#
LoadModule cache_module modules/mod_cache.so


#LoadModule disk_cache_module modules/mod_disk_cache.so

CacheRoot c:/cacheroot
CacheSize 256
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3


LoadModule mem_cache_module modules/mod_mem_cache.so

CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048


配置的添加也是类似手册上的,只是稍作修改。
使用初期,感觉指令蛮多,功能也比较强大(当然和squid比还是欠缺)
CacheDefaultExpire 86400 (默认过期时间设置)
CacheDisable /local_files (不cacheURL在/ocal_files下的)
CacheEnable mem /manual (分内存cache,fd(文件描述符)cache,和硬盘cache)
CacheEnable fd /images
CacheEnable disk /
CacheForceCompletion 80 (2.0的文档里说还没哟实现的指令)
CacheIgnoreCacheControl On (忽略原始页面的对缓存控制的信息,eg.no-cache or no-store)
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
CacheLastModifiedFactor 0.5
CacheMaxExpire 604800


mod_disk_cache下面的指令
CacheDirLength 4
CacheDirLevels 5
CacheExpiryCheck Off (2.0.59还没有实现)
CacheGcClean 12 /daily_scripts (2.0.59还没有实现)
CacheGcDaily 23:59 (2.0.59还没有实现)
CacheGcInterval 24 (2.0.59还没有实现)
CacheGcMemUsage 16 (2.0.59还没有实现)
CacheGcUnused 12 /local_images (2.0.59还没有实现)
CacheMaxFileSize 64000
CacheMinFileSize 64
CacheRoot c:/cacheroot
CacheSize 5000000
CacheTimeMargin X (2.0.59还没有实现)

mod_mem_cache下面的指令
MCacheMaxObjectCount 13001
MCacheMaxObjectSize 6400000
MCacheMaxStreamingBuffer 65536
MCacheMinObjectSize 10000
MCacheRemovalAlgorithm GDSF
MCacheRemovalAlgorithm LRU
MCacheSize 700000

由于我使用的httpd是2.0.59版本的,所以很多功能都还没有实现,特别是硬盘缓存的时候,有些页面会莫名的白页,而且缓存空间的大小会一直增加下去,没有手册上讲的,当大于你所设置的cache大小后,会慢慢删除过期缓存的现象!但是内存缓存还是很好用的!
希望新版本的cache模块能更好用,至少在小部分范围内能更稳定,至少不出现白页!

squid问题-httpReadReply: Excess data from

2007/12/06 05:03:13| httpReadReply: Excess data from "HEAD http://***.***.com/leexn/categories/45604/"
2007/12/06 05:03:15| httpReadReply: Excess data from "HEAD http://***.***.com/nemomama/entry/96901"
一早起来就发现一台squid报警 ,查看了cache.log,发现不停的报上面的出错信息,从字面上理解是返回的数据过多的意思!我不太清楚具体问题是怎么出来的!但是我曾经在apache和php里面多次设定expire time的时候,也出现过类似的问题,当时请求的方法不是head而是get!
我查看了下请求的url的header,没有多次设置的问题,一大早,正在不知所措的时候,突然发现,squid报fd过少!正想调整下os的fd,这时,我已经连不上服务器了!
最后联系机房,当我一直还在思考出错来源的时。网络好了,我仔细的查看了相关的日志,发现该出错信息不见了!
通过流量和网络连接的相关监控,发现上述的出错信息和网络连通状况有很大的联系!
虽然我现在还不太清楚他们之间 具体的因果关系,但很显然是有关系的!所以以后出现类似的问题,要先测试一下网络状况怎么样。:)
也希望有人能告诉我他们之间具体的因果关系。

2007年11月22日星期四

关于mysql备份的问答——感想

Questions and Answers from the Backup Webinar原文出处
总而言之,言而总之。 A LVM snapshot在备份当中是相当重要和好玩的!

2007年11月16日星期五

系统管理工具-awk(1)

awk是老用老忘记,今天开始系统的做个学习笔记。主要参考A Guided Tour Of Awk
先帖下测试数据吧
66.249.70.76 - - [01/Oct/2007:00:00:00 +0800] "GET /users/show/146659 HTTP/1.1" 200 3550 "-" "Mozilla/5.0
(compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
这是一条来自googlebot的爬虫留下的访问记录。我们把测试数据假设为test.data
那要取出googlebot的访问记录就有以下几种方法
1.grep '+http://www.google.com/bot.html' test.data
2 . awk '/\+http:\/\/www\.google\.com\/bot\.html/'
test.data (关于正则表达式,也需要找时间整理下,这里. 和+都是元字符所以需要转义,而/是因为我们匹配的标志符号使用了/)
所以这里awk和grep实现的功能也是一样的了。
如果我们想得到第七栏的访问地址的话,我们就可以
awk '/+http:\/\/www\.google\.com\/bot\.html/ {print $7}' test.data
如果想知道被googlebot正常访问(header为200)的url
awk '/+http:\/\/www\.google\.com\/bot\.html/ {if ($9=200) print $7}' test.data
如果想知道googlebot从网站上爬走多少流量的
awk 'BEGIN { traffic=0 } /+http:\/\/www\.google\.com\/bot\.html/ {if ($9=200) print $7;traffic+=$10 } END {print traffic}' test.data
今天就写到这里了

2007年11月13日星期二

mysql系统变量--动态系统变量

当你熟悉了mysql之后,你可能会希望能够经常的调节系统变量,来观察那种配置参数是最适合当前的应用和硬件水平。
表格太大了,我不太清楚怎么把他弄上来!反正手册上关于动态系统变量那一章节上面有。回头多瞧两遍。

着重要提出来的是在set global或者set session的时候一定要注意那些是全局的,那些是会话级别的!如果只有是global级别的话。当你修改过该变量后,当前会话中的变量也已经修改了,可以同时使用

mysqladmin extended-status variables;!
来查看。

特别是针对myisam表的优化,关系性能的参数重要参数不外乎
1.key_buffer_size
mysql> show status like 'Key_%';
+------------------------+------------+
| Variable_name | Value |
+------------------------+------------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 663670 |
| Key_blocks_used | 264171 |
| Key_read_requests | 9478725087 |
| Key_reads | 572252 |
| Key_write_requests | 26654547 |
| Key_writes | 15212514 |
+------------------------+------------+
key_read_requests/key_reads=1656 马虎
key_blocks_unused 663670 稍微有点多了
总的来讲就是key_buffer_size可能稍微大了点,现在没有完全利用上来
2.query_cache_size
mysql> show status like 'Qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 1999 |
| Qcache_free_memory | 8776024 |
| Qcache_hits | 128809199 |
| Qcache_inserts | 200930383 |
| Qcache_lowmem_prunes | 66376219 |
| Qcache_not_cached | 16102972 |
| Qcache_queries_in_cache | 4217 |
| Qcache_total_blocks | 10622 |
+-------------------------+-----------+

同时我们也可以看看到底从运行到现在,mysql执行了多少个select
mysql> show status like'Com_select%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| Com_select | 217524587 |
+---------------+-----------+
又执行了多少个insert
mysql> show status like'Com_insert';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Com_insert | 2128506 |
+---------------+---------+
同时又执行了多少个update
mysql> show status like'Com_update';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Com_update | 9940846 |
+---------------+---------+
在这台mysql上面select/(insert+update)接近10.


3.table_cache
mysql> show status like 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 635 |
| Opened_tables | 18169 |
+---------------+-------+

4.long_query_time
show variables like 'long_query_time%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 1 |
+-----------------+-------+
先写到这里:)

2007年11月12日星期一

mysql安全--InnoDB CONVERT_SEARCH_MODE_TO_INNOBASE

今天打开milw0rm,看见了一个关于MySQL服务器,InnoDB CONVERT_SEARCH_MODE_TO_INNOBASE函数拒绝服务漏洞,据说对MySQL <=6.0 可能都会哟有影响,但是在我的 2.0.20上面似乎得不到效果。
绿盟上也看到了这个安全警报,mysql官方也有了这个bug的描述。
呆会下个5.1.22测试下。这样在得到alter权限后己可以导致mysql crash,但是还没有patch.
简单攻击测试代码如下

mysql> CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`foo` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected

mysql> SELECT * FROM test WHERE CONTAINS(foo, 'bar');
Empty set

mysql> ALTER TABLE test ADD INDEX (foo(100));
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM test WHERE CONTAINS(foo, 'bar');
ERROR 2013 : Lost connection to MySQL server during query

2007年11月1日星期四

linux系统命令 之 umask fuser

一直不太清楚umask的作用,今天稍微查了下,留在这里做个记录。
umask
功能:设置权限掩码(决定新建文件的权限)
格式:umask 权限值(超级用户默认为022,普通用户默认为002)
实例:# umask 044
计算公式:目录:777-umask


fuser
功能:查看文件或端口使用者
格式: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME...
[ - ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME...

实例:fuser -n tcp 80
fuser /opt
下次在详细记录下lsof.............

2007年10月29日星期一

php基本设置之error_reporting

最近麻烦事情真多,心情不太好!
正好今天遇到了一个关于Warning: Trying to destroy uninitialized session的问题,顺便把php.ini里面关于这报错设置的这一段给弄清楚了!
display_errors = Off
默认应该是不显示errors的.
log_errors = On
把出错信息记录到web server的错误日志中.
error_reporting = E_ALL
自己定义错误日志中应该显示什么.
error_reporting 是可以在php文件中自己设置,或者.htaccess中设置的
如:
error_reporting(0);
error_reporting(E_ERROR | E_WARNING | E_PARSE); 等同error_reporting(7)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 等同error_reporting(15)
error_reporting(E_ALL ^ E_NOTICE); 等同error_reporting(6135)
error_reporting(E_ALL); 等同error_reporting(6143)
那么error_reporting到底有多少种形式了
value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
6143 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
详细的计算需要查手册,不过这些数字和*nix系统中的权限位是如出一辙的
其实没什么东西,只是记录下!
最后Warning: Trying to destroy uninitialized session 也只是
把session_destroy(); 修改为了 @session_destroy();忽略掉出错信息.

2007年10月14日星期日

10个需要注意的mysql变量

mysql的性能需要我们监控,今天着重介绍十个比较重要的mysql变量.
原文来自http://blogs.techrepublic.com.com/opensource/?p=56,我并不觉得这10个变量都重要的值得去监控,但是也是必须去了解的!等以后我觉得有更重要的变量需要了解的时候,会再写下来的!今天找了好久才找到这篇文章的,本来那天看见就准备抄过来的,呵呵:)
1 Threads_connected
首先需要注意的,想得到这个变量的值不能show variables like 'Threads_connected';而是
show status like 'Threads_connected'(下面的变值也是这样的);
意思:变量的值是表示当前有多少个客户连接该mysql服务器
引申:连接数是否过多,网络时候存在问题!特别是在pconnect的情况下:)
2 Created_tmp_disk_tables
意思:在硬盘上建立的临时表数目
引申:如果这个值比较大的话,那么查询时需要建立临时表(CREATE TEMPORARY TABLE)的操作 就要消耗更多的时间
3 Handler_read_first
意思:读表索引的第一行
引申:如果这个值变化比较大的话,可以认为表索引建立的有问题,全索引的扫描操作比较多
4 Innodb_buffer_pool_wait_free
意思:This variable indicates the number of times MySQL has to wait for memory pages to be flus
引申:If this variable is high, it suggests that MySQL's memory buffer is incorrectly configured for the amount of writes the server is currently performing.
不了解这个:)
5 Key_reads
意思:读文件系统上面的索引的次数
引申:如果这个值太大的话,就需要考虑key cache设置是否正常了
6 Max_used_connections
意思:重起后到现在最大连接数
引申:服务器负载和可能需要调节的连接数
7 Open_tables
意思:当前打开的表的数目
引申:如果这个值很低,table cache很大,则减小table cache的设置是没有问题的,如果这个值很大,并接近了table cache的值,我们就需要加大talbe cache的设置
8 Select_full_join
意思:全连接的查询数目
引申:数值过大,需要建立更多的索引来避免
9 Slow_queries
意思:慢查询的数目
引申:过大的话就要察看慢查询的日志,并且检查sql语句书写是否恰当
10 Uptime
意思:运行时间,单位秒
引申:This value is useful to analyze server uptime, as well as to generate reports on overall system performance. A consistent low value indicates that the server is being frequently restarted, thereby causing frequent interruptions to client service.

总算翻译的大差不差了:)

2007年9月27日星期四

使用telnet浏览网页

最近一直在学习mysql,把其他事情给耽搁了!
重点记一下怎么用telnet来测试网页的一些性质,虽然现在用firebug,curl,wget等等简单易用的工具来测试网页是否被压缩和是否被缓存!但有时还是不能避免的使用telnet这样原始的工具来做一些简单的测试!
其实如果了解rfc2616协议,也就是http协议的话,使用起来就不陌生了!
可是像我们这些习惯使用工具的人来讲,有时候不免会忘记!在这里记一下,毕竟我google了1好一阵也没找到!
先ping 下www.douban.com ip为59.151.41.69 80 (为什么不测试sina,163呢?他们前端有专业的防火墙等设备,直接telnet 上去似乎有问题)
telnet 59.151.41.69 80
Connected to 59.151.41.69 (59.151.41.69).
Escape character is '^]'.
GET / HTTP/1.1
Host: www.douban.com

两下回车就可以返回我们需要的内容! GET 后面的地址一般是index.html 或者index.php等等,可douban的不晓得默认页面用的萨,所以就直接GET /了。
抓douban的头的时候意外的发现X-Mem-Hit by mem-cache-etag,google了下,发现是lighttpd的一个小插件
用telnet基本的读取网页的能力有了,我们在近一步读取压缩过后的网页
在Host: www.doban.com回车后
继续键入Accept-Encoding: compress, gzip 并两下回车,我们就能得到天书(压缩过后的html)。
累了,其他的更过参数可以从http协议中找到!
这样用telnet,就能更好的去了解协议本身了。

2007年9月20日星期四

今天终于遇到kill -9杀不掉的进程

以前只在论坛上看到有人用kill -9 $pid 也杀不掉进程,今天终于被我遇到了。
过程是这样的:
一大早来公司,突然收到系统报警mail,一台2U的hp的服务器负载60,上系统一看!httpd死进程过多! 用apachectl stop想杀掉进程再重起,杀了几次说pid已经不存在,可是apachectl start的时候 报启动错误,80端口被暂用! ps axu|grep httpd发现还是有进程存在!killall httpd 发现无济于事。
随手写个脚本想杀掉进程
for i in ` ps aux|awk '{ print $2 }`
do
echo "pid is $i"
kill -9 $i
done
运行后发现进程还是有,一个都杀不掉!
找了个杀不掉的pid,发现 kill -9 $pid 还真是对这个进程没有任何办法!
最后只有reboot了,系统重启后恢复正常!
实在弄不出个所以然,google了下,有如下解释:
a、该进程处于"Zombie"状态(使用ps命令返回defunct的进程)。此时进程已经释放所有资源,但还未得到其父进程的确认。"Zombie"进程要等到下次重启时才会消失,但它的存在不会影响系统性能。
b、该进程处于"kernel mode"(核心态)且在等待不可获得的资源。处于核心态的进程忽略所有信号处理,因此对于这些一直处于核心态的进程只能通过重启系统实现。进程在AIX 中会处于两种状态,即用户态和核心态。只有处于用户态的进程才可以用“kill”命令将其终止。
如果上面的解释是正确的,那么我遇到的应该是第二种情况了!至于是什么东西引发的这个问题。。。。,暂时还不明了!

2007年8月9日星期四

过期时间设置 expires and max-age (一)

最近对关于http协议的rfc都或多或少的看了些!
随便也看了关于expires vs max-age
关于http/1.1协议的rfc2616上有这么三句话很有意思。
HTTP/1.1 clients and caches MUST treat other invalid date formats, especially including the value "0", as in the past (i.e., "already expired").

To mark a response as "already expired," an origin server sends an Expires date that is equal to the Date header value. (See the rules for expiration calculations in section 13.2.4.)

To mark a response as "never expires," an origin server sends an Expires date approximately one year from the time the response is sent. HTTP/1.1 servers SHOULD NOT send Expires dates more than one year in the future.

The presence of an Expires header field with a date value of some time in the future on a response that otherwise would by default be non-cacheable indicates that the response is cacheable, unless indicated otherwise by a Cache-Control header field (section 14.9).

上面提到什么是过期:expires date ==date header
什么是不过期:expires date > date header
也提到了我们现在通常处理使得 expires date= 0 或者 expires date < date header
在这种非标准的header下面,http/1.1协议是怎么去解释的!
基本上没有设置expires date 就应该默认不能被cache,除非有section 14.9中其他的cache-control.
关于max-age 只想提这么一句话:
If a response includes both an Expires header and a max-age directive, the max-age directive overrides the Expires header, even if the Expires header is more restrictive

也就是max-age会优先expires!
在过期时间设置 expires and max-age (二)将抛开协议本身,来详细了解下在apache.lighttpd中怎么样去定制一个有比较好的过期时间设置的header

2007年8月8日星期三

服务器时间同步(一)

很多时候由于安装系统时候的不在意,或者服务器本身频率的问题,会导致服务器之间时间的不同步!
时间不同步造成的影响,squid,mysql出现问题!这些都与系统时间有这紧密的关系!
1.squid中cache出现问题
2.mysql中系统时间出现问题
通常解决的办法
同步时间
/usr/bin/rdate -s rdate.darkorb.net
clock 或者 hwclock -w 写入cpu 或硬件里面
问题:clock 和hwclock的区别
用rdate只能治表不能治本
治疗时间问题的根本是: set the system time from the hardware clock,把系统时间写入硬件中!
鸟哥这篇文章可以好好的参考参考
归纳一下别人的方法
linux调整系统时间和时区的方法(redhat 系列)

1) 找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai

用这个文件替换当前的/etc/localtime文件。

2) 修改/etc/sysconfig/clock文件,修改为:

ZONE="Asia/Shanghai"
UTC=false
ARC=false (这个不太清楚,但应该是没什么用处的)

3) 同步时间并写入cmos

2007年8月5日星期日

数据库之 b tree

http://www.sci.unich.it/~acciaro/bpiutrees.pdf
http://www.usenix.org/events/usenix99/full_papers/olson/olson.pdf

2007年7月24日星期二

监控之mrtg --- squid

开源的监控方案有很多,nagios,cacti等等!选择mrtg是因为以前的都是使用的mrtg,而且mrtg方面的资料也相对来讲稍微多点!所以先把关于使用mrtg监控服务器的整个方案搞好后,再慢慢转其他的!
参考资料:
1.Chris' MRTG Resources
2.Monitoring Squid
3.Using MRTG to monitor Squid
4.Tobi Oetiker's Projects

第一步,下载从mrtg官方网站下载mrtg
第二步,安装mrtg
第三步, 配置mrtg

2007年7月23日星期一

nfs server under the iptables

一直想把nfs架起来,也做了很多工作,看了很多文档!搞了3-4个小时!发现nfs在iptables下面总是搞不起来,真是很郁闷!
具体原因现在还不时很清楚,但是表现的状况是,如果我停掉iptables,nfs client 就能够挂nfs!一旦把nfs起来,rpcinfo -p nfsserver_ip 就会出现
rpcinfo:无法同 portmapper 交互: RPC:远程系统错误 - 没有到主机的路由
要开的端口111,2049,4000-4003等等,都已经尝试过了!可还是没有搞定!
搞个nfs怎么会这么难搞了,希望3天之类可以搞定!
google 过了,发现这其实是应该常规的问题,很多人都提出来过,但是解决的方法我暂时还没有找到!真的很累,很久没有这样,搞了大半天还没有一个结果的事情了!
打算明天再搜索下,顺便把iptables进一步的搞清楚,实在不行就用tcpdump之类的东西抓下包看看!感觉问题不应该复杂的,可现在就是搞不定!
一个人走路真的很累!:)
server 和 client 都是centos 5.0

2007年7月11日星期三

Source-Navigator 安装


代码阅读的时候需要代码阅读器,Windows 下面有 非开源的Source-Insight,Linux 有开源的Source-Navigator
但在fc6下,安装的时候会出现两个以上的问题,毕竟这个项目在sourceforge上貌似很久没有人去维护了!
因为想进一步了解squid, 昨天捣鼓了好一阵!对我这种已经习惯了yum的人,安装起来还真是费力!
第一步 configure的时候就莫名奇妙的出问题,google了半天,终于在sourceforge该项目的tracker里面找到一个patch
具体的问题描述在这里
补丁打上 就可以configure 了,这里真要谢谢scottt958兄的patch
第二步,configure 完了,make的时候有出错,说不支持"-fwritable-strings",在相应的makefile里面把加了-fwritable-strings的参数注释掉好拉,不过需要注释的还真是蛮多的!
慢慢搞,搞完了就可以make install 了
大功告成了

2007年6月28日星期四

squid 学习笔记 (1)

从第一天进入公司,接触到的就是squid,随着对squid的慢慢熟悉!觉得需要把自己对squid的认识和一些经验写下来!
squid 其实就是一个cache,能加速网络的东西!
A cache hit occurs each time Squid satisfies an HTTP request from its cache. The cache hit ratio, or cache hit rate, is the percentage of all requests satisfied as hits. Web caches typically achieve hit ratios between 30% and 60%. A similar metric, the byte hit ratio, represents the volume of data (i.e., number of bytes) served from the cache.
我稍微有点疑惑的是30% 到 60% 的 The cache hit ratio 算正常的说法是指的什么情况下!
学习squid,可以通过faq 和squid的用户邮件列表!
关于squid了解的越来越多,却发现自己知道的越来越少!
趁今天有空,先把自己几个不知道的东西搞懂吧
1.关于squid中的Cache Digest
2.关于squid中squid 与 snmp的使用 .
估计今天晚上是搞不定了,明天到公司了再去实际操作吧!

2007年6月26日星期二

swap 的疑惑

大的日志文件请不要用vim打开,切记!
不信,你自己vim打开一个日志看看!
替代工具,查看文件的工具请用less more head tail
查找内存使用的工具pmap,pmap_dump,pmap_set
pmap -x [pid]

squid Your cache is running out of filedescriptors

本来以为自己是不会遇到
# ulimit -HSn 65536
# ulimit -n
65536

可最终还是遇到的,修改一下就好啦,重新编译squid2.6-13
太晚了,自己简单记录一下

2007年6月12日星期二

apache 编译出错 之mod_deflate

apache是经常的编译,虽然出错的频率越来越小!可是出错的症状是越来越五花八门了!发现自己不写下来是不行啦!
今天晚上想在某台服务器上加入memcache的php扩展,随便也测试下apache 的worker的处理模式,据说可以更省资源,虽然稳定上可能不如perfork,所以就想尝试下.
可是天不随人,一不小心.make的时候得报
pic -c mod_deflate.c && touch mod_deflate.slo
In file included from /usr/include/zutil.h:16,
from mod_deflate.c:42:
/usr/include/zlib.h:68: redefinition of `struct z_stream_s'
/usr/include/zlib.h:705: conflicting types for `gzwrite'
/usr/local/include/zlib.h:982: previous declaration of `gzwrite'
make[4]: *** [mod_deflate.slo] Error 1
google 一下,发现邮件列表,好东西
有人已经遇到过了
在拿来主义的指导下,细细一瞧!原来是系统本身yum 过一次zlib ,后来又编译过一次(编译的时候没有指定prefix),现在在/usr/include/ 和/usr/local/include/下面各有一个zlib.h
我可怜的系统被搅糊涂拉,随意mv掉了一个!再次make && make install !OK
教训: 可以yum 也可以自己编译,但下次记得指定prefix,要不然有你好受的!
找时间还要继续nfs......:)

2007年6月6日星期三

nfs 学习(一)

最近由于工作需要,需要正经的学习一下nfs! 其实nfs,比较早的时候就已经用过!但当时就照鸟哥的文章随意搞了下!貌似就搞定了,但是nfs复杂的应该是其权限控制!一不小心就会给系统留下不小的安全隐患.当然其通信协议,我也不太清楚。所以可能需要我花的力气还是比较大的。
这是nfs在sourceforge的项目上面有比较多的文档值得我去看看!
随意找了下,整个安装nfs的过程简单来讲就是这样,看得出,安装其实并不复杂的
copy from

11.8 NFS Configuration

NFS是Network File System的缩写,这是一种在不同机器之间共享文件的方法,可以使本地机器象在使用本地硬盘一样使用远程文件系统。LINUX即既可以作为NFS 客户也可以作为NFS服务器,也就是说它可以向其它机器输出文件系统,也可以安装其它机器输出的文件系统。
11.8.1 安装NFS文件系统

使用mount命令安装另一台机器输出的网络文件系统:

mkdir /mnt/local # Only required if /mnt/local doesn't exist
mount bigdog:/mnt/export /mnt/local

在以上命令中,porky是NFS文件服务器的主机名,/mnt/export是porky输出的文件系统, /mnt/local是本机的一个目录,远程文件系统将被安装在它下面。当mount命令运行完后(如果porky敷与了恰当的权限),我们可以通过执行ls/mnt/local命令列出位于porky机器上/mnt/export目录下的文件。
11.8.2 输出网络文件系统

控制网络文件系统输出的配置文件是/etc/exports。它的格式是:

directory hostname(options)

其中(options)是可选的。举个例子:

/mnt/export speedy.redhat.com

将允许主机speedy.redhat.com安装/mnt/export 而

/mnt/export speedy.redhat.com(ro)

则仅仅允许speedy以只读方式安装/mnt/export。

每当您改变了/etc/exports,您需要告诉NFS进程重新检查配置信息。一个简单的方法是停下再启动该服务器进程:

/etc/rc.d/init.d/nfs stop
/etc/rc.d/init.d/nfs start

还有一种方法:

killall -HUP rpc.nfsd rpc.mountd
请查看nfsd(8),mountd(8) 和exports(5)的man 手册以获得详细信息 。另一个好的参考书是由Hal Stern编写,O'Reilly&Associates出版发行的“Managing NFS and NIS Services”

对于nfs,需要抽时间看看nfs howto,配置的过程中也需要了解下Linux下NFS的配置与注意的问题,这些很久前的问题也需要注意下!
最后就需要看看rfc1094,是关于nfs的!
提高版就是了解下gfs,看看gfs和nfs的比较是不是在忽悠人拉
总的学习计划就是这样,希望这周能把nfs搞定个30%-50%!