memcachedb使用的BerkeleyDB的数据库,但每10M生成一个log文件:
定期清理为好,否则就要有两倍数据的空间了,以前写的是定期清理某个时间修改的日志:
清理100分钟前的文件,导致了一个文件,如果停用或者100分钟内没有更新动作,将删掉了所有日志,吃亏了,导致启动失败了,当然,可能可以修复,只是糊涂的话就没法再启用了。
稳当点,就删除所有的日志文件,保留最新的100个:
简单解析一下脚本意思:
ls -t log.* 是列出所有log开头的日志文件,按时间排序,也就是最新的排前面
awk里面NR代表当前行数,NR>100则是100行后的才输出
xargs就是接收到awk输出的文件才转给rm删除
参考资料:awk手册
[root@aslibra db]# ll -h
total 26G
-rw-r--r-- 1 root root 25G Jun 22 00:12 data.db
-rw-r----- 1 root root 24K Jun 20 19:33 __db.001
-rw-r----- 1 root root 3.8M Jun 20 19:33 __db.002
-rw-r----- 1 root root 81M Jun 20 19:33 __db.003
-rw-r----- 1 root root 96K Jun 20 19:33 __db.004
-rw-r----- 1 root root 11M Jun 20 19:33 __db.005
-rw-r----- 1 root root 48K Jun 20 19:33 __db.006
-rw-r----- 1 root root 10M Jun 21 22:47 log.0000002271
-rw-r----- 1 root root 10M Jun 21 22:47 log.0000002272
-rw-r----- 1 root root 10M Jun 21 22:48 log.0000002273
-rw-r----- 1 root root 10M Jun 21 22:49 log.0000002274
.....
total 26G
-rw-r--r-- 1 root root 25G Jun 22 00:12 data.db
-rw-r----- 1 root root 24K Jun 20 19:33 __db.001
-rw-r----- 1 root root 3.8M Jun 20 19:33 __db.002
-rw-r----- 1 root root 81M Jun 20 19:33 __db.003
-rw-r----- 1 root root 96K Jun 20 19:33 __db.004
-rw-r----- 1 root root 11M Jun 20 19:33 __db.005
-rw-r----- 1 root root 48K Jun 20 19:33 __db.006
-rw-r----- 1 root root 10M Jun 21 22:47 log.0000002271
-rw-r----- 1 root root 10M Jun 21 22:47 log.0000002272
-rw-r----- 1 root root 10M Jun 21 22:48 log.0000002273
-rw-r----- 1 root root 10M Jun 21 22:49 log.0000002274
.....
定期清理为好,否则就要有两倍数据的空间了,以前写的是定期清理某个时间修改的日志:
find /BerkeleyDB/aslibra.com/db/ -maxdepth 1 -type f -name 'log.*' -mmin +100 | xargs -i rm -f {}
清理100分钟前的文件,导致了一个文件,如果停用或者100分钟内没有更新动作,将删掉了所有日志,吃亏了,导致启动失败了,当然,可能可以修复,只是糊涂的话就没法再启用了。
稳当点,就删除所有的日志文件,保留最新的100个:
#!/bin/sh
cd /BerkeleyDB/aslibra.com/db/
ls -t log.* | awk '{ if(NR>100)print $0}'|xargs -i -t rm -f {}
cd /BerkeleyDB/aslibra.com/db/
ls -t log.* | awk '{ if(NR>100)print $0}'|xargs -i -t rm -f {}
简单解析一下脚本意思:
ls -t log.* 是列出所有log开头的日志文件,按时间排序,也就是最新的排前面
awk里面NR代表当前行数,NR>100则是100行后的才输出
xargs就是接收到awk输出的文件才转给rm删除
参考资料:awk手册
Nginx的代理功能很强大,主要体现在可以设置返给后端服务器的http头信息,这一点可以让我们方便的实现很多需求。
比如要做一个镜像,这个当然有可能是好事。
http://a.aslibra.com/s/main.jpg
我需要访问 http://b.aslibra.com/s/main.jpg 也是一样的内容呢?
利用缓存功能就可以了,以上例子还加上了简单破解防盗链的方法,就是加上正确的referer的头信息就可以了
upstream自己可以设定,修改了host的信息,使得相当于本地访问backend使用了要做镜像的域名。
同理,要多个域名是一样的内容是,那可以多个域名使用同样的server设定,简单的指定host值即可,不列举了。
比如要做一个镜像,这个当然有可能是好事。
http://a.aslibra.com/s/main.jpg
我需要访问 http://b.aslibra.com/s/main.jpg 也是一样的内容呢?
server {
server_name b.aslibra.com;
root /Data/webapps/b.aslibra.com;
error_page 404 = @fetch;
location @fetch {
internal;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_set_header Host a.aslibra.com;
proxy_set_header referer http://a.aslibra.com/;
proxy_pass http://backend;
root /Data/webapps/b.aslibra.com;
}
}
server_name b.aslibra.com;
root /Data/webapps/b.aslibra.com;
error_page 404 = @fetch;
location @fetch {
internal;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_set_header Host a.aslibra.com;
proxy_set_header referer http://a.aslibra.com/;
proxy_pass http://backend;
root /Data/webapps/b.aslibra.com;
}
}
利用缓存功能就可以了,以上例子还加上了简单破解防盗链的方法,就是加上正确的referer的头信息就可以了
upstream自己可以设定,修改了host的信息,使得相当于本地访问backend使用了要做镜像的域名。
同理,要多个域名是一样的内容是,那可以多个域名使用同样的server设定,简单的指定host值即可,不列举了。
memcachedb和memcached的两个主要区别:
1 前者不管理过期,每个存储都是长期有效
2 前者使用磁盘存储,有广阔的存储空间
这两个优点使得很多缓存的地方可以使用上memcachedb。
1 本地数据缓存
这个带来的最大便利是可以实现数据共享,备份简便,这是本地文件缓存无法比拟的。
2 网页缓存
在Nginx可以使用memcache接口,很简便的实现网页cache
以上两项应用需要解决过期问题方式不同:
1 对于本地数据缓存,可以再保存一个值是当前保存的数据的时间即可。
类似读写文件一样,记录修改时的时间戳
2 对于nginx无法判断是否过期的情况,可以实现自动清理,阿权设计方案的是按秒存储数据,定期清理
清理的方法决定了保存的其它数据的方式,你也可以写入文件日志的方式,然后按日志清理
这里用自身的存储,记录相应的数据信息
这个主要在解决$expire_time的自增的问题,细节可以处理此问题
需要用到increment和add,他们都有键值是否存在的问题,根据此功效解决冲突。
先尝试increment,如果成功,说明已经有了,否则可能没有。在没有的情况下,尝试添加此键值,成功说明此时没有同时的进程,否则有同时请求的进程已经在此短暂的不行的时间里添加了,那就再次调用increment即可。
下面是封装了的PHP代码:
一些示例:
相关资料:
1 memcachedb-manage
2 memcachedb
3 代码下载
代码更新:
1 前者不管理过期,每个存储都是长期有效
2 前者使用磁盘存储,有广阔的存储空间
这两个优点使得很多缓存的地方可以使用上memcachedb。
1 本地数据缓存
这个带来的最大便利是可以实现数据共享,备份简便,这是本地文件缓存无法比拟的。
2 网页缓存
在Nginx可以使用memcache接口,很简便的实现网页cache
以上两项应用需要解决过期问题方式不同:
1 对于本地数据缓存,可以再保存一个值是当前保存的数据的时间即可。
类似读写文件一样,记录修改时的时间戳
$key=>"http://www.aslibra.com/"
$key."_time"=>time()
$key."_time"=>time()
2 对于nginx无法判断是否过期的情况,可以实现自动清理,阿权设计方案的是按秒存储数据,定期清理
清理的方法决定了保存的其它数据的方式,你也可以写入文件日志的方式,然后按日志清理
这里用自身的存储,记录相应的数据信息
$key=>"http://www.aslibra.com/"
$key2=>"http://www.aslibra.com/blog/"
$expire_time=>Num
$expire_time.'_'.Num=>$key
$expire_time.'_'.Num2=>$key2
$key2=>"http://www.aslibra.com/blog/"
$expire_time=>Num
$expire_time.'_'.Num=>$key
$expire_time.'_'.Num2=>$key2
这个主要在解决$expire_time的自增的问题,细节可以处理此问题
需要用到increment和add,他们都有键值是否存在的问题,根据此功效解决冲突。
先尝试increment,如果成功,说明已经有了,否则可能没有。在没有的情况下,尝试添加此键值,成功说明此时没有同时的进程,否则有同时请求的进程已经在此短暂的不行的时间里添加了,那就再次调用increment即可。
下面是封装了的PHP代码:
<?
/****************************************
*** memcachedb_manage version 0.1 @ 2009-6-12
*** code by hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/memcachedb-manage/
*** http://code.google.com/p/memcachedb/
*** let the memcachedb acts like memcached!
****************************************/
class memcachedb extends Memcache{
//是否有调试信息
var $debug = false;
//兼容使用memcache,这样就不用set时再保存额外数据
var $is_memcachedb = true;
//清理时间开始为0时,默认最小的清理时间差
var $mini_clear_time = 86400;
//临时数据前缀
var $prefix = 'db_';
//临时数据,清理的最后时间戳
var $last_timeid_key = 'last_timeid';
//本地处理缓存有效性
var $cache_expire = 900;
var $cache_prefix = 'WWW_FILE_';
var $cache_time_prefix = 'WWW_TIME_';
function memcachedb(){
}
//改写函数
//此功能适合前端无法判断数据是否有效的情况,需要自行清理过期数据
function set($key, $value, $flag=0, $expire=0){
if($expire>0 && $this->is_memcachedb){
$mykey = $this->prefix.(time() + $expire);
//尝试取得自增值
$i = parent::increment($mykey);
if($i == FALSE){
//尝试增加key,防止用set产生的冲突
$i = parent::add($mykey,1) ? 1 : parent::increment($mykey);
}
parent::set($this->mykey($mykey, $i), $key);
}
return parent::set($key, $value, $flag, $expire);
}
//管理自增的键值组合方式
function mykey($mykey, $i){
return $mykey.'_'.$i;
}
//保存上次清理的时间戳的键值
function last_timeid_key(){
return $this->prefix.$this->last_timeid_key;
}
//清理
function clear($start=0, $end=0){
//取得上次清理的最后时间戳,可以不需要从time_start开始
$last_timeid = parent::get($this->last_timeid_key());
if($last_timeid == false) $last_timeid = 0;
$start = $last_timeid>$start ? $last_timeid : $start;
$start = $start>0 ? $start : ( time() - $this->mini_clear_time );
$end = $end>0 ? $end : time();
if($this->debug)echo " clear $start to $end <br>";
for($mytime = $start; $mytime<=$end; $mytime++){
$mykey = $this->prefix.$mytime;
$auto_id = parent::get($mykey);
if($auto_id){
if($this->debug)echo "<hr>clear time: $mytime<br>";
for($i = 1;$i<=$auto_id;$i++){
$key = parent::get($this->mykey($mykey, $i));
if($this->debug)echo " delete ".$k."<br>";
parent::delete($key);
if($this->debug)echo " delete ".$this->mykey($mykey, $i)."<br>";
parent::delete($this->mykey($mykey, $i));
}
if($this->debug)echo " delete $mykey<br>";
parent::delete($mykey);
}
}
//记下当前处理过的时间戳
$this->set($this->last_timeid_key(), $end);
}
//缓存读写
//此功能适合PHP使用的数据,自行判断数据是否有效的情况
function get_cache($key, $expire=0){
$expire = $expire>0 ? $expire : 0;
if($expire == 0)
return parent::get($this->cache_prefix.$key);
$cache_time = parent::get($this->cache_time_prefix.$key);
$cache_time = $cache_time == FALSE ? 0 : $cache_time;
if(time() - $cache_time <= $expire)
return parent::get($this->cache_prefix.$key);
return FALSE;
}
function set_cache($key, $value, $flag=0, $expire=0){
$expire = $expire>=0 ? $expire : $this->cache_expire;
parent::set($this->cache_time_prefix.$key, time());
return parent::set($this->cache_prefix.$key, $value, $flag, $expire);
}
}
?>
/****************************************
*** memcachedb_manage version 0.1 @ 2009-6-12
*** code by hqlulu#gmail.com
*** http://www.aslibra.com
*** http://code.google.com/p/memcachedb-manage/
*** http://code.google.com/p/memcachedb/
*** let the memcachedb acts like memcached!
****************************************/
class memcachedb extends Memcache{
//是否有调试信息
var $debug = false;
//兼容使用memcache,这样就不用set时再保存额外数据
var $is_memcachedb = true;
//清理时间开始为0时,默认最小的清理时间差
var $mini_clear_time = 86400;
//临时数据前缀
var $prefix = 'db_';
//临时数据,清理的最后时间戳
var $last_timeid_key = 'last_timeid';
//本地处理缓存有效性
var $cache_expire = 900;
var $cache_prefix = 'WWW_FILE_';
var $cache_time_prefix = 'WWW_TIME_';
function memcachedb(){
}
//改写函数
//此功能适合前端无法判断数据是否有效的情况,需要自行清理过期数据
function set($key, $value, $flag=0, $expire=0){
if($expire>0 && $this->is_memcachedb){
$mykey = $this->prefix.(time() + $expire);
//尝试取得自增值
$i = parent::increment($mykey);
if($i == FALSE){
//尝试增加key,防止用set产生的冲突
$i = parent::add($mykey,1) ? 1 : parent::increment($mykey);
}
parent::set($this->mykey($mykey, $i), $key);
}
return parent::set($key, $value, $flag, $expire);
}
//管理自增的键值组合方式
function mykey($mykey, $i){
return $mykey.'_'.$i;
}
//保存上次清理的时间戳的键值
function last_timeid_key(){
return $this->prefix.$this->last_timeid_key;
}
//清理
function clear($start=0, $end=0){
//取得上次清理的最后时间戳,可以不需要从time_start开始
$last_timeid = parent::get($this->last_timeid_key());
if($last_timeid == false) $last_timeid = 0;
$start = $last_timeid>$start ? $last_timeid : $start;
$start = $start>0 ? $start : ( time() - $this->mini_clear_time );
$end = $end>0 ? $end : time();
if($this->debug)echo " clear $start to $end <br>";
for($mytime = $start; $mytime<=$end; $mytime++){
$mykey = $this->prefix.$mytime;
$auto_id = parent::get($mykey);
if($auto_id){
if($this->debug)echo "<hr>clear time: $mytime<br>";
for($i = 1;$i<=$auto_id;$i++){
$key = parent::get($this->mykey($mykey, $i));
if($this->debug)echo " delete ".$k."<br>";
parent::delete($key);
if($this->debug)echo " delete ".$this->mykey($mykey, $i)."<br>";
parent::delete($this->mykey($mykey, $i));
}
if($this->debug)echo " delete $mykey<br>";
parent::delete($mykey);
}
}
//记下当前处理过的时间戳
$this->set($this->last_timeid_key(), $end);
}
//缓存读写
//此功能适合PHP使用的数据,自行判断数据是否有效的情况
function get_cache($key, $expire=0){
$expire = $expire>0 ? $expire : 0;
if($expire == 0)
return parent::get($this->cache_prefix.$key);
$cache_time = parent::get($this->cache_time_prefix.$key);
$cache_time = $cache_time == FALSE ? 0 : $cache_time;
if(time() - $cache_time <= $expire)
return parent::get($this->cache_prefix.$key);
return FALSE;
}
function set_cache($key, $value, $flag=0, $expire=0){
$expire = $expire>=0 ? $expire : $this->cache_expire;
parent::set($this->cache_time_prefix.$key, time());
return parent::set($this->cache_prefix.$key, $value, $flag, $expire);
}
}
?>
一些示例:
<?
require_once('memcachedb.class.php');
$m = new memcachedb;
$m->connect('192.168.1.5', 11311);
//保存一个300秒有效期的数据
$m->set('test','www.aslibra.com', 0, 300);
//清理到1000秒前到100秒前过期的数据
$m->clear(time()-1000, time()-100);
//获取一个键值,不理会是否过期,相当于get
echo $m->get_cache("test", 0);
//获取一个键值,300秒内保存的才有效
$m->get_cache("test", 300);
//保存一个数据,300秒内有效
$m->set_cache("test", "www.aslibra.com", 0, 300);
//保存一个数据,长期有效,相当于set
$m->set_cache("test", "www.aslibra.com");
//清理到目前已经过期是数据
$m->clear();
?>
require_once('memcachedb.class.php');
$m = new memcachedb;
$m->connect('192.168.1.5', 11311);
//保存一个300秒有效期的数据
$m->set('test','www.aslibra.com', 0, 300);
//清理到1000秒前到100秒前过期的数据
$m->clear(time()-1000, time()-100);
//获取一个键值,不理会是否过期,相当于get
echo $m->get_cache("test", 0);
//获取一个键值,300秒内保存的才有效
$m->get_cache("test", 300);
//保存一个数据,300秒内有效
$m->set_cache("test", "www.aslibra.com", 0, 300);
//保存一个数据,长期有效,相当于set
$m->set_cache("test", "www.aslibra.com");
//清理到目前已经过期是数据
$m->clear();
?>
相关资料:
1 memcachedb-manage
2 memcachedb
3 代码下载
代码更新:
# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://memcachedb-manage.googlecode.com/svn/trunk/ memcachedb-manage-read-only
svn checkout http://memcachedb-manage.googlecode.com/svn/trunk/ memcachedb-manage-read-only
故意出错,你可以知道一些错误发生的原因,检查方法:
下面是碰到的部分错误:
1 logging channel 'query_log' file '/logs/query.log': file not found
开了logging,但没有创建日志文件会提示出错
2 logging channel 'query_log' file '/logs/query.log': permission denied
可能伴有这样的错误:
有权限的问题,可能你得查一下用户权限,如果是使用SELINUX,输入getenforce 看看现在的安全级别
可以关闭SELinux如果你不需要,编辑 /etc/sysconfig/selinux 文件
3 couldn't open pid file '/var/named.pid': Permission denied
还是目录权限的问题,如果没有该目录,创建并且给named权限
4 /etc/named.conf:14: when using 'view' statements, all zones must be in views
如果使用了view,那就不能在主文件单独定义了啦,可怜的,必须在每个view里面都定义每个zone
但是,如果你不需要根据每个view处理不一样的,你可以在每个view都引用同一个解析文件
5 transfer of 'aslibra.com/IN' from 192.168.1.41#53: failed while receiving responses: permission denied
检查一下是否master加了此主机为允许的ip了
Master在reload和restart时会发生notify
也就是加载后会发送当前的serial标识的给notify列表的机器
slave机器要注意对配置文件的可写权限
正常的情况:
两个机器的配置文件会不一样的,传输并非文件传输,而是数据传输:
Master的配置文件:
Slave的配置文件:
6 如何检查配置文件
如果有错误,会提示你信息,没有错则没有提示了
7 如何检查zone文件
8 重载配置文件
tail -n 20 /var/log/messages | grep named
下面是碰到的部分错误:
1 logging channel 'query_log' file '/logs/query.log': file not found
开了logging,但没有创建日志文件会提示出错
2 logging channel 'query_log' file '/logs/query.log': permission denied
可能伴有这样的错误:
kernel: audit(1240046511.743:4): avc: denied { write } for pid=5649 comm="named" name="logs" dev=dm-0 ino=778352 scontext=root:system_r:named_t:s0 tcontext=root:object_r:named_conf_t:s0 tclass=dir
有权限的问题,可能你得查一下用户权限,如果是使用SELINUX,输入getenforce 看看现在的安全级别
可以关闭SELinux如果你不需要,编辑 /etc/sysconfig/selinux 文件
3 couldn't open pid file '/var/named.pid': Permission denied
还是目录权限的问题,如果没有该目录,创建并且给named权限
4 /etc/named.conf:14: when using 'view' statements, all zones must be in views
如果使用了view,那就不能在主文件单独定义了啦,可怜的,必须在每个view里面都定义每个zone
但是,如果你不需要根据每个view处理不一样的,你可以在每个view都引用同一个解析文件
5 transfer of 'aslibra.com/IN' from 192.168.1.41#53: failed while receiving responses: permission denied
检查一下是否master加了此主机为允许的ip了
Master在reload和restart时会发生notify
... zone myzcom.com/IN/any: loaded serial 2008061100
... running
... zone aslibra.com/IN/any: sending notifies (serial 2008061100)
... running
... zone aslibra.com/IN/any: sending notifies (serial 2008061100)
也就是加载后会发送当前的serial标识的给notify列表的机器
slave机器要注意对配置文件的可写权限
引用
.. received notify for zone 'aslibra.com'
.. dumping master file: config/tmp-XXXXeybkW9: open: permission denied
.. transfer of 'aslibra.com/IN' from 192.168.1.41#53: failed while receiving responses: permission denied
.. transfer of 'aslibra.com/IN' from 192.168.1.41#53: end of transfer
.. dumping master file: config/tmp-XXXXeybkW9: open: permission denied
.. transfer of 'aslibra.com/IN' from 192.168.1.41#53: failed while receiving responses: permission denied
.. transfer of 'aslibra.com/IN' from 192.168.1.41#53: end of transfer
正常的情况:
引用
.. received notify for zone 'aslibra.com'
.. zone aslibra.com/IN: transferred serial 2008061100
.. transfer of 'aslibra.com/IN' from 192.168.1.41#53: end of transfer
.. zone aslibra.com/IN: transferred serial 2008061100
.. transfer of 'aslibra.com/IN' from 192.168.1.41#53: end of transfer
两个机器的配置文件会不一样的,传输并非文件传输,而是数据传输:
Master的配置文件:
[root@aslibra etc]# cat config/domain-aslibra.com.any
$TTL 300
@ IN SOA ns.aslibra.com. hqlulu.gmail.com. (
2008061100 ; serial
3600 ; refresh
60 ; retry
604800 ; expire
3600 ; minimum
)
NS ns2.aslibra.com.
NS ns.aslibra.com.
www A 222.76.215.25
ns A 192.168.1.41
ns2 A 192.168.1.42
$TTL 300
@ IN SOA ns.aslibra.com. hqlulu.gmail.com. (
2008061100 ; serial
3600 ; refresh
60 ; retry
604800 ; expire
3600 ; minimum
)
NS ns2.aslibra.com.
NS ns.aslibra.com.
www A 222.76.215.25
ns A 192.168.1.41
ns2 A 192.168.1.42
Slave的配置文件:
[root@localhost etc]# cat config/domain-aslibra.com.any
$ORIGIN .
$TTL 300 ; 5 minutes
aslibra.com IN SOA ns.aslibra.com. hqlulu.gmail.com. (
2008061100 ; serial
3600 ; refresh (1 hour)
60 ; retry (1 minute)
604800 ; expire (1 week)
3600 ; minimum (1 hour)
)
NS ns.aslibra.com.
NS ns2.aslibra.com.
$ORIGIN aslibra.com.
ns A 192.168.1.41
ns2 A 192.168.1.42
www A 222.76.215.25
$ORIGIN .
$TTL 300 ; 5 minutes
aslibra.com IN SOA ns.aslibra.com. hqlulu.gmail.com. (
2008061100 ; serial
3600 ; refresh (1 hour)
60 ; retry (1 minute)
604800 ; expire (1 week)
3600 ; minimum (1 hour)
)
NS ns.aslibra.com.
NS ns2.aslibra.com.
$ORIGIN aslibra.com.
ns A 192.168.1.41
ns2 A 192.168.1.42
www A 222.76.215.25
6 如何检查配置文件
[root@aslibra etc]# named-checkconf -t /var/named/chroot/
/etc/config/view-any.conf:13: option 'masters' is not allowed in 'master' zone 'aslibra.com'
[root@aslibra etc]# named-checkconf -t /var/named/chroot/
[root@aslibra etc]#
/etc/config/view-any.conf:13: option 'masters' is not allowed in 'master' zone 'aslibra.com'
[root@aslibra etc]# named-checkconf -t /var/named/chroot/
[root@aslibra etc]#
如果有错误,会提示你信息,没有错则没有提示了
7 如何检查zone文件
[root@fetion etc]# named-checkzone -t /var/named/chroot/ aslibra.com /etc/config/domain-aslibra.com.any
zone aslibra.com/IN: loaded serial 2008061100
OK
[root@fetion etc]# named-checkzone aslibra.com /var/named/chroot/etc/config/domain-aslibra.com.any
zone aslibra.com/IN: loaded serial 2008061100
OK
zone aslibra.com/IN: loaded serial 2008061100
OK
[root@fetion etc]# named-checkzone aslibra.com /var/named/chroot/etc/config/domain-aslibra.com.any
zone aslibra.com/IN: loaded serial 2008061100
OK
8 重载配置文件
service named reload
升级一下Nginx,笔记一下:
升级后的信息:
参考资料:
Nginx中文文档 > 运行和控制 Nginx - 命令行参数和信号
wget http://sysoev.ru/nginx/nginx-0.7.59.tar.gz
tar xfz nginx-0.7.59.tar.gz
cd nginx-0.7.59
./configure --prefix=/Data/apps/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
&& make && make install
#平滑升级可执行程序,使用新的 nginx 可执行程序替换旧的
kill -USR2 `cat /Data/apps/nginx/logs/nginx.pid`
#你可以让旧进程停止工作
kill -QUIT `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
#如果不需要完全停止旧进程,还希望恢复的,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭
kill -WINCH `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
tar xfz nginx-0.7.59.tar.gz
cd nginx-0.7.59
./configure --prefix=/Data/apps/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
&& make && make install
#平滑升级可执行程序,使用新的 nginx 可执行程序替换旧的
kill -USR2 `cat /Data/apps/nginx/logs/nginx.pid`
#你可以让旧进程停止工作
kill -QUIT `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
#如果不需要完全停止旧进程,还希望恢复的,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭
kill -WINCH `cat /Data/apps/nginx/logs/nginx.pid.oldbin`
升级后的信息:
[root@localhost nginx]# curl -I http://localhost
HTTP/1.1 403 Forbidden
Server: nginx/0.7.59
Date: Wed, 10 Jun 2009 15:04:14 GMT
Content-Type: text/html
Content-Length: 169
HTTP/1.1 403 Forbidden
Server: nginx/0.7.59
Date: Wed, 10 Jun 2009 15:04:14 GMT
Content-Type: text/html
Content-Length: 169
参考资料:
Nginx中文文档 > 运行和控制 Nginx - 命令行参数和信号
一般而言,随便找个合适的dns服务器作为自己的dns解析服务器即可,但如果选择不当,可能就会导致网络选择并不是最优的。
这个情况一般发生在电信网通优化的域名上。
检查方法(域名有所替换):
第一个是目前自己的网络,dig +trace是用自己本身取获取解析
我们看到,第一次和第二次是不一样的,原因比较简单,这个是网通和电信的不同路线
第一个是从202.106.0.20(自己设定的dns服务器)返回的,以它访问目标域名服务器所取得的数据为准,也就是如果它是网通IP,则返回的就是网通的解析方案,而trace则直接咨询目标域名服务器,目标服务器根据你的IP来返回解析方案。
如果你是电信线路,而设定的是网通线路的dns服务器,这个时候就容易取得网通解析方案了。
也给我们引发一些注意的地方:
1 自己架设本地dns缓存服务器是最合适的解析方案
2 找到自己线路的dns服务器才有最优的访问效果
这个情况一般发生在电信网通优化的域名上。
检查方法(域名有所替换):
[root@aslibra ~]# dig cdl.cdn.aslibra.com
...(省略)
;; ANSWER SECTION:
cdl.cdn.aslibra.com. 683 IN A 218.25.68.145
cdl.cdn.aslibra.com. 683 IN A 218.25.68.192
cdl.cdn.aslibra.com. 683 IN A 218.25.11.105
;; Query time: 6 msec
;; SERVER: 202.106.0.20#53(202.106.0.20)
;; WHEN: Wed Jun 10 16:40:07 2009
;; MSG SIZE rcvd: 84
[root@aslibra ~]# dig cdl.cdn.aslibra.com +trace
...(省略)
cdl.cdn.aslibra.com. 900 IN A 60.191.185.162
cdl.cdn.aslibra.com. 900 IN A 60.191.187.8
...(省略)
;; Received 282 bytes from 61.160.207.67#53(ns1.dnspod.net) in 0 ms
...(省略)
;; ANSWER SECTION:
cdl.cdn.aslibra.com. 683 IN A 218.25.68.145
cdl.cdn.aslibra.com. 683 IN A 218.25.68.192
cdl.cdn.aslibra.com. 683 IN A 218.25.11.105
;; Query time: 6 msec
;; SERVER: 202.106.0.20#53(202.106.0.20)
;; WHEN: Wed Jun 10 16:40:07 2009
;; MSG SIZE rcvd: 84
[root@aslibra ~]# dig cdl.cdn.aslibra.com +trace
...(省略)
cdl.cdn.aslibra.com. 900 IN A 60.191.185.162
cdl.cdn.aslibra.com. 900 IN A 60.191.187.8
...(省略)
;; Received 282 bytes from 61.160.207.67#53(ns1.dnspod.net) in 0 ms
第一个是目前自己的网络,dig +trace是用自己本身取获取解析
我们看到,第一次和第二次是不一样的,原因比较简单,这个是网通和电信的不同路线
第一个是从202.106.0.20(自己设定的dns服务器)返回的,以它访问目标域名服务器所取得的数据为准,也就是如果它是网通IP,则返回的就是网通的解析方案,而trace则直接咨询目标域名服务器,目标服务器根据你的IP来返回解析方案。
如果你是电信线路,而设定的是网通线路的dns服务器,这个时候就容易取得网通解析方案了。
也给我们引发一些注意的地方:
1 自己架设本地dns缓存服务器是最合适的解析方案
2 找到自己线路的dns服务器才有最优的访问效果









