首页 › 月度存档 › 九月 2013

nginx预置全局变量

经常需要配置Nginx ,其中有许多以 $ 开头的变量,经常需要查阅nginx 所支持的变量。

可能是对 Ngixn资源不熟悉,干脆就直接读源码,分析出支持的变量。

Nginx支持的http变量实现在 ngx_http_variables.c 的 ngx_http_core_variables存储实现:

ngx_http_core_variables
static ngx_http_variable_t  ngx_http_core_variables[] = {

{ ngx_string(“http_host”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.host), 0, 0 },

{ ngx_string(“http_user_agent”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 },

{ ngx_string(“http_referer”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.referer), 0, 0 },

#if (NGX_HTTP_GZIP)
{ ngx_string(“http_via”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.via), 0, 0 },
#endif

#if (NGX_HTTP_PROXY || NGX_HTTP_REALIP)
{ ngx_string(“http_x_forwarded_for”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 },
#endif

{ ngx_string(“http_cookie”), NULL, ngx_http_variable_headers,
offsetof(ngx_http_request_t, headers_in.cookies), 0, 0 },

{ ngx_string(“content_length”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.content_length), 0, 0 },

{ ngx_string(“content_type”), NULL, ngx_http_variable_header,
offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 },

{ ngx_string(“host”), NULL, ngx_http_variable_host, 0, 0, 0 },

{ ngx_string(“binary_remote_addr”), NULL,
ngx_http_variable_binary_remote_addr, 0, 0, 0 },

{ ngx_string(“remote_addr”), NULL, ngx_http_variable_remote_addr, 0, 0, 0 },

{ ngx_string(“remote_port”), NULL, ngx_http_variable_remote_port, 0, 0, 0 },

{ ngx_string(“server_addr”), NULL, ngx_http_variable_server_addr, 0, 0, 0 },

{ ngx_string(“server_port”), NULL, ngx_http_variable_server_port, 0, 0, 0 },

{ ngx_string(“server_protocol”), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, http_protocol), 0, 0 },

{ ngx_string(“scheme”), NULL, ngx_http_variable_scheme, 0, 0, 0 },

{ ngx_string(“request_uri”), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, unparsed_uri), 0, 0 },

{ ngx_string(“uri”), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, uri),
NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“document_uri”), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, uri),
NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“request”), NULL, ngx_http_variable_request_line, 0, 0, 0 },

{ ngx_string(“document_root”), NULL,
ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“realpath_root”), NULL,
ngx_http_variable_realpath_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“query_string”), NULL, ngx_http_variable_request,
offsetof(ngx_http_request_t, args),
NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“args”),
ngx_http_variable_request_set,
ngx_http_variable_request,
offsetof(ngx_http_request_t, args),
NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“is_args”), NULL, ngx_http_variable_is_args,
0, NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“request_filename”), NULL,
ngx_http_variable_request_filename, 0,
NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“server_name”), NULL, ngx_http_variable_server_name, 0, 0, 0 },

{ ngx_string(“request_method”), NULL,
ngx_http_variable_request_method, 0,
NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“remote_user”), NULL, ngx_http_variable_remote_user, 0, 0, 0 },

{ ngx_string(“body_bytes_sent”), NULL, ngx_http_variable_body_bytes_sent,
0, 0, 0 },

{ ngx_string(“request_completion”), NULL,
ngx_http_variable_request_completion,
0, 0, 0 },

{ ngx_string(“request_body”), NULL,
ngx_http_variable_request_body,
0, 0, 0 },

{ ngx_string(“request_body_file”), NULL,
ngx_http_variable_request_body_file,
0, 0, 0 },

{ ngx_string(“sent_http_content_type”), NULL,
ngx_http_variable_sent_content_type, 0, 0, 0 },

{ ngx_string(“sent_http_content_length”), NULL,
ngx_http_variable_sent_content_length, 0, 0, 0 },

{ ngx_string(“sent_http_location”), NULL,
ngx_http_variable_sent_location, 0, 0, 0 },

{ ngx_string(“sent_http_last_modified”), NULL,
ngx_http_variable_sent_last_modified, 0, 0, 0 },

{ ngx_string(“sent_http_connection”), NULL,
ngx_http_variable_sent_connection, 0, 0, 0 },

{ ngx_string(“sent_http_keep_alive”), NULL,
ngx_http_variable_sent_keep_alive, 0, 0, 0 },

{ ngx_string(“sent_http_transfer_encoding”), NULL,
ngx_http_variable_sent_transfer_encoding, 0, 0, 0 },

{ ngx_string(“sent_http_cache_control”), NULL, ngx_http_variable_headers,
offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 },

{ ngx_string(“limit_rate”), ngx_http_variable_request_set_size,
ngx_http_variable_request_get_size,
offsetof(ngx_http_request_t, limit_rate),
NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 },

{ ngx_string(“nginx_version”), NULL, ngx_http_variable_nginx_version,
0, 0, 0 },

{ ngx_string(“hostname”), NULL, ngx_http_variable_hostname,
0, 0, 0 },

{ ngx_string(“pid”), NULL, ngx_http_variable_pid,
0, 0, 0 },

{ ngx_null_string, NULL, NULL, 0, 0, 0 }
};

把这些变量提取下,总结如下:

2011121019182787nginx_args1

2011121019182787nginx_args2

2011121019182787nginx_args3

nginx内置变量

centos5.4安装convirt管理虚拟机

利用convirt通过web图形化管理虚拟机也是一种方便的方法,适用于Fedora/RHEL/CentOS

convirt官网:http://www.convirture.com

http://www.convirture.com/wiki/index.php?title=C2_fedora_installation

1、先确认服务器已安装wget,没安装时需安装

#yum install wget socat

2、更新安装所需的源

###5.0的源###

#cd /etc/yum.repos.d
#wget –no-cache http://www.convirture.com/repos/definitions/rhel/5.x/convirt.repo

###6.0的源###

wget –no-cache http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo

3、设置代理

export http_proxy=”http://company-proxy-server:80

4、下载安装所需的文件

wget –no-cache http://www.convirture.com/downloads/convirt/2.0.1/convirt-install-2.0.1.tar.gz
wget –no-cache http://www.convirture.com/downloads/convirt/2.0.1/convirt-2.0.1.tar.gz
wget –no-cache http://www.convirture.com/downloads/convirture-tools/2.0.1/convirture-tools-2.0.1.tar.gz

5、解压安装文件

#tar -xzf convirt-install-2.0.1.tar.gz

6、开始安装

#cd convirt-install/install/cms/scripts/
# ./install_dependencies

安装完成后会提示连接数据库的一些信息,根据提示操作即可

7、添加数据库信息并重启数据库

#vim /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

##添加以下两行
innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M

#/etc/init.d/mysqld restart

8、安装convirt

设置代理

#export http_proxy=”http://company-proxy-server:80″

修改convirt-install-2.0.1的安装信息

#vim convirt-install/install/cms/scripts/install_config

CONVIRT_BASE=~

改成

CONVIRT_BASE=~/cms

##需先在用户目录下新建文件夹cms,用来把convirt-2.0.1解压到该文件夹下

解压convirt-2.0.1

#source convirt-install/install/cms/scripts/install_config
#tar -xzf ./convirt-2.0.1.tar.gz -C $CONVIRT_BASE

 

安装 TurboGears

#./convirt-install/install/cms/scripts/setup_tg2

设置convirt数据库连接信息

#vim cms/convirt/src/convirt/web/convirt/development.ini

##修改以下信息

sqlalchemy.url=mysql://root:convirt@localhost:3306/convirt?charset=utf8

运行安装

#./convirt-install/install/cms/scripts/setup_convirt

需允许端口通过

#iptables -I INPUT -p tcp –dport 8081 -j ACCEPT

9、启动

#cd ~/convirt
#./convirt-ctl start

10、打开页面

http://ip:8081

用了神器socat,在公司终于可以上豆瓣电台听音乐了~

我在的公司上不了网。那查资料怎么办?别急,有公共上网机,大家可以远程桌面上去,在那上边上,需要下载资料了,现放到上网机上,再ftp下 来。原则上只能查资料,可我明明白白看大家都在上边看新闻,浏览网页,甚至是上webqq.所以,实际上是可以上网的,典型的掩耳盗铃做法,是不?都心知 肚明,却谁也不能说破,这就是传说中的暗规则吧。
这样挺好。可有一点不好,就是听不了评书和音乐。对于我这种习惯戴着耳机干活 的人感觉很不适应。远程桌面设过将声音带到本地,可不起作用。也曾想过偷偷装个代理服务器,装个squid,可总觉得这样太小题大做了,而且我也不懂;也 想到过写个小程序,来转发,可上边没有java环境,单单为了这么点东西装个好几十兆的jvm,有点太那啥了,况且,还不一定能行—-如果上网机直连 的互联网,那肯定没问题—-但是上网机也是走的代理,代理协议没研究过啊,不知道浏览器中设置的ip地址会不会带到数据包里,是的话肯定虾米。我想找 个越低调越好的解决办法。
今天工作是需要开端口的,我想到了网络应用届的“瑞士军刀”nc。等忙完后闲得难受,都说nc功能强大,有没有转发的功能呢?nc不熟,但我意识到,肯定有,可怎么来用呢,用上后能用来上网吗?试试吧。想当然的想起了个土鳖办法:
nc -L -p 1234 | nc 代理服务器ip地址 端口.
我 的本意是,nc把监听到的数据写到流里,这样就把数据转给代理服务器了。在本地浏览器里设好代理服务器地址为上网机地址,在地址栏里敲入豆瓣的网址,呵 呵,直接没反应。失败鸟,不过我很振奋,因为我关掉浏览器时,在控制台上看到了一屏html的数据,意思好想是超时,不是通常的“你无权访问,请联系管理 员云云”,嗯,看来这种方法有可能是可行的。在看刚才敲入的命令,看出来了问题所在,发出去的数据是转给代理服务器了,可回来的数据怎么回写到本机啊?不 懂鸟,网上查查吧。
却也没想象的那么容易查,翻了一屏也没找到想要的东西,却找到了socat这个神器。它有个功能是专门满足这种需求的,敲入指令:
socat TCP4-LISTEN:1234,reuseaddr,fork, TCP4:代理服务器ip地址:端口
在本机再一刷网页,成功鸟。打开douban.fm,耳机里传来范玮琪动听的声音,哈哈,亲爱的,你终于回来了。
不感肯定这么做是不是自做聪明,不过我低调处理的话,相信没有人会注意到。

ConVirt 2.0.1中文版

convirt

最近花点时间作了一下ConVirt 2.0.1社区版的汉化工作,现按照ConVirt 2.0.1社区版所使用的GPLv2授权协议发布出来。欢迎各位正在研究/使用云计算相关技术的朋友试用并提出宝贵意见。

除了本人之外,天涯社区的李帅,Intel公司的王帅,以及搜狐的王蕾也参与了ConVirt 2.0.1社区版的汉化工作。在此向如上各位所付出的时间和精力一并表示感谢。
继续阅读 »

MySQL从服务器的监控

[root@db-server-61-001 script]# ll
total 4
-rwxr-xr-x 1 root root 294 Jun 20 03:38 check_mysql_slave
[root@db-server-61-001 script]# cat /software/script/check_mysql_slave
#!/bin/bash
declare -a slave_is
slave_is=($(mysql -uroot -pgb52054.GB@ -e “show slave status\G” |grep Running |awk ‘{print $2}’))
if [ “${slave_is[0]}” = “Yes” -a “${slave_is[1]}” = “Yes” ]
  then
  echo “OK -slave isrunning”
  exit 0
else
   echo “Critical -slave is error”
  exit 2
fi

[root@db-server-61-001 script]# ./check_mysql_slave
OK -slave isrunning

结构化命令2

1.test

if [ condition ]

then

commands

fi

1.1 test 数值比较

n1 -eq n2 # n1是否等于n2

n1 -ge n2 # n1是否大于或等于n2

n1 -gt n2 # n1是否大于n2

n1 -le n2 # n1是否小于或等于n2

n1 -lt n2 # n1是否小于n2

n1 -ne n2 # n1是否不等于n2

[root@db-grassroots-61-001 script]# cat 3
#!/bin/bash
val1=10
val2=11

if [ $val1 -gt 5 ]
then
  echo “The test value $val1 is greater then 5”
fi
if [ $val1 -eq $val2 ]
then
echo “The values are equal”
else
echo “The values are different”
fi

1.2 test 字符串比较

str1 = str2    #比较str1和str2是否相同

str1 != str2   #比较str1和str2是否不同

str1 < str2    #比较str1是否小于str2

str1 > str2    #比较str1是否大于str2

-n str1        # 比较str1的长度是否大于0

-z str1        # 比较str1的长度是否为0

结构化命令

1.if-then

if command

then

command

fi

[root@db-grassroots-61-001 script]# cat 2
#!/bin/bash
testuser=markgeng
if grep $testuser /etc/passwd
then
echo Then bash files for user $testuser are:
ls -a /home/$testuser/.b*
fi

2.if -then-else

if command

then

command

else

command

fi

[root@db-grassroots-61-001 script]# cat 2
#!/bin/bash
testuser=markgeng
if grep $testuser /etc/passwd
then
echo Then bash files for user $testuser are:
ls -a /home/$testuser/.b*
else
echo “The user name $testuser doesn’t exist on this system”

fi

3.嵌套if语句

if command1

then

commands

elif command2

then

more commands

fi

4.if-then -elif

if command1

then

command set 1

elif command2

then

command set 2

elif command3

then

command set 3

elif command4

then

  command set 4

fi

nginx location用法

语法规则: location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

/ 通用匹配,任何请求都会匹配到。

多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

例子,有如下匹配规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}

那么产生的效果如下:

访问根目录/, 比如http://localhost/ 将匹配规则A

访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C

访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}

未试验过的其他信息:

三、ReWrite语法
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
1、下面是可以用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
2、下面是可以用作判断的全局变量
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php
四、Redirect语法
server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ “^star\.igrow\.cn$&quot {
rewrite ^(.*) http://star.igrow.cn$1 redirect;
}
}
五、防盗链location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
六、根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
七、禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}

++ 一些可用的全局变量
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

使用进程锁来控制linux中的crontab执行的并发

在使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题,二个rsync一起处理相同的文件,这样会出问题.如下

1 1 * * * * /usr/bin/rsync -avlR /data/files 172.16.xxx.xxx:/data

本来想写个脚本来解决,但太麻烦.所以用了个linux下的锁..呵呵,象下面这个.

1 1 * * * * flock -xn /var/run/rsync.lock -c ‘ rsync -avlR /data/files 172.16.xxx.xxx:/data’

这样,使用flock的-x参数先建一个锁文件,然后-n指定,如果锁存在,就等待.直到建成功锁在会运行-c后面的命令.这样第一个进程没有运行完前,锁文件都会存在.这样就不会二个rsync同时并发处理一个东西了

也可以在代码里加入这一句,保证一个rsync进程运行就是了。。

pidNum=ps -ef |grep ‘rsync -参数’|grep -v grep |awk ‘{print $2}’|wc -l

if [ $pidNum -gt 0 ]; then exit

调教MLDonkey的那些事儿

MLDonkey 是一个开源、免费、跨平台、多协议的P2P共享软件。是由Fabrice Le Fessant 和 Simon Patarin 从2002年1月发起的。原本是一个在Unix和Linux下对电驴(eDonkey2000)的克隆。后来又移植到了MacOSX和Windows平台 上。遵循GPL协议。最初发布时,它只有Linux下的eDonkey协议版本。现在它支持多种P2P协议,并能在类Unix系统、Mac OS X、Windows和MorphOS等操作系统下运行。最新版本为8月15日发布的3.0.4。下载地址:http://sourceforge.net/projects/mldonkey/files/

看看MLDonkey有那些特点,嗯,确实挺吸引的,特别是对Geeker来说:

  • 100%开源,遵循GPL协议
  • 跨平台,支持 Windows, Linux, MacOSX, Unix, Solaris
  • 可以同时连接多个eD2k服务器
  • 支持多种P2P协议,eDonkey、Overnet、BitTorrent、Kad、HTTP/FTP、DirectConnect等等。以后还可以从不同的网络协议下载同一文件(开发阶段)
  • 没有图形界面,省资源

MLDoneky并不完美,缺点也不少:

  • 只支持KAD搜索,不支持KAD传输。关于MLDonkey的KAD说法可谓是众说纷纭,但是我在官方论坛得到的信息是:对KAD1支持不完整、不支持KAD2 (via MLDonkey Forums)
  • 虽然支持磁力链接,不过BT下载模块并不支持DHT和PEX
  • 不能自动连接动态IP的ed2k服务器
  • 不支持DLP,没有任何反吸血功能
  • 不支持谜糊协议
  • 设置比较麻烦,没有中文版
  • 更新缓慢

虽说是多协议,但是BT部分基本鸡肋,其他几种网络协议在国内也很少用到,剩下的就只有eDonkey网络了,对我们来说MLDonkey就是一个电骡客户端,下面的内容也主要介绍它的eDonkey网络部分。

上手MLDonkey

怎 么安装?Linux版的安装大同小异我就不说了,简单说下Windows的吧。其实也没有什么安装不安装的,MLDonkey是绿色软件,只要将其解压缩 到任意目录,运行run_mldonkey.exe或mlnet.exe就可以启动软件了。这两个的区别在于run_mldonkey.exe可以将 DOS窗口隐藏至托盘,而mlnet.exe不能。前面已经说过,MLDonkey是没有图形界面的,不过可以通过浏览器打开 http://localhost:4080/ 进入WebUI来管理Mldonkey。当然,如果你觉得不习惯,可以下载Sancho这个图形前端来代替WebUI。

看上图,右上角Input按键左边的空白长条就是命令栏,在命令栏输入各种命令控制管理MLDonkey

正确的关闭程序:
MLDonkey必须用WebUI或其它图形前端来关闭,不可以直接关掉DOS窗口,否则可能会造成数据丢失和软件出错,
点选菜单Help+ -> Kill core
或者在命令栏输入kill命令,然后按Input键或回车。

导入服务器列表:
在命令栏输入
servers 服务器列表地址
例如:
servers http://eserver.googlecode.com/svn/server.met

导入overnet的node列表:
在命令栏输入
ov_load http://download.overnet.org/contact.dat

ov_load “/home/username/contact.dat”

导入kad的node列表:
在命令栏输入
kad_load http://upd.emule-security.net/nodes.dat

kad_load “/home/username/nodes.dat”

设置临时目录:
默认的临时目录是软件目录里的temp文件夹,可以通过修改downloads.ini的相关选项文件来设置该地址。
用文本编辑器打开的downloads.ini,搜索“Paths options”,找到路径选项部分。
看到下面这么一句:temp_directory = temp
这就是设置临时目录的地方,只要将“temp”更改成你想设置的目录地址就行,例如
temp_directory = “/shares/emule/temp” 记得加半角双引号

*注意:在downloads.ini里设置的Windows路径必须把单个反斜杠写成两个反斜杠。
在Windows下将临时目录设置为f:\emule\temp:
temp_directory = “f:\\emule\\temp”
设置共享和下载目录也同样要把反斜杠写成两个反斜杠,下面就再重复了。

设置共享和下载目录:

在讲怎么设置共享和下载目录之前有必要先说说Sharing Strategy(共享策略),Strategy不同的属性值决定该目录的性质。
Strategy各属性值所代表的的意义:
incoming_files:下载和共享目录,下载任务为单个文件的放这里,递归
incoming_directories:下载和共享目录,下载任务为多个文件(如BT)时就放这里,不递归。
* incoming_files 和 incoming_directories可以为同一目录
all_files:共享目录,递归
only_directory:共享目录,不递归

设置共享目录可以有三种方法。

第一,通过修改downloads.ini文件来设置默认共享和下载目录

默认共享目录是软件目录下的“incoming/files”文件夹,默认下载目录是“incoming/directories”。

用文本编辑器打开downloads.ini,找到“Incoming and shared directories“部分,看到下面有一段:

shared_directories = [
{ dirname = shared
strategy = all_files
priority = 0
};
{ dirname = “incoming/files”
strategy = incoming_files
priority = 0
};
{ dirname = “incoming/directories”
strategy = incoming_directories
priority = 0
};]

上面红色部分代表目录地址,绿色部分是Sharing Strategy(共享策略),我们只要将红色部分替换成自己的目录地址就可以了。

第二,用命令添加或取消共享目录
用share命令添加共享目录,在命令栏里输入:share 0 共享的目录地址
这里是数字0,不是字母o,表示优先等级
例如
share 0 /home/shares
Windows下是:share 0 F:\emule\share\

用unshare命令可以将已经共享了的目录取消,在命令栏输入:unshare 要取消的共享目录地址
例如
unshare /home/shares

第三,WebUI的菜单能直观方便地管理共享目录
Options -> Shares进入共享目录菜单,可以看到已经共享的目录和一些有关说明,同时能很简单地添加活取消共享目录。
取消目录共享,只要点某共享目录旁的“Unshare”按键就可以了。
添加共享目录是点击”Add Share”按键然后输入:0 共享的目录地址
例如
0 /home/share

0 F:\emule\share\

导入eMule的未完成的文件:
在eMule未下载完的文件可以导入到MLDonkey接着下。这样就需要用到import_temp这个命令,简单得很,在命令栏输入:import_temp eMule的临时目录

添加下载任务
说了那么多,都还没有说怎么下载文件呢。MLDonkey的下载方式比较古老,基本都是手动,不难,就是觉得比较麻烦。复制要下载的eD2k链接(因为支持多协议,所以像磁力链接和FTP/HTTP都是可以的)粘贴进命令栏然后按回车活“Input”按键。
批量下载呢,一样可以,不过还是要手动输入。点击命令栏左边的“DL”按键后弹出一个文本框,在这个文本框里输入要下载的那些链接,再点文本框下面的“Iput”按键。

虽然不怎么会用到,还是说下添加BT任下载务的方法吧:
命令栏输入:startbt “BT种子url” 或 startbt “BT种子地址”
例如
startbt http://www.domain.com/av.torrent 或 startbt f:\av.torrent

主要的选项设置

MLDonkey的选项简直多如牛毛,这里就挑部分比较主要的简单讲一下。有一点必须先说明一下,除了下拉选项外,其他的选项设置被修改后都不会自动保存,必须在修改选项后按一下回车才会保存。如果要修改了100个选项,同样地就要按100次回车了,这样确实很繁琐。

一般设置,位于Options – Settings – Client
client_name:用户名,像这样[CHN]Mldonkey
max_upload_slots:上传槽数量,最大可以同时上传给多少人
max_hard_upload_rate:最大上传速度,必须大于10,否则下载速度将会被限制在一个很低的值
max_hard_download_rate:最大下载速度,0表示不限速
max_opened_connections:最大连接数,最大可以设置为924
max_hard_upload_rate_2:第二个最大上传速度
max_hard_download_rate_2:第二个最大下载速度
max_indirect_connections:非直接连接为最大打开连接的百分比
max_concurrent_downloads:最大同时下载任务数

缓存设置 Options – Settings – Delays
buffer_writes:是否打开缓存写入,建议打开
buffer_writes_delay:写入缓存时的延迟时间,单位为秒,建议30.或者更高
buffer_writes_threshold:缓存到了指定值时强制写入,单位为KB,默认1024KB

协议设置 Options – Settings – Net
enable_overnet:Overnet网络,建议打开
enable_kademlia:KAD网络,必须打开
enable_donkey:eDonkey网络,必须打开
enable_bittorrent:BT,建议打开,不用的也可以不开
enable_fasttrack:FastTrack网络,好像已经停用了
enable_directconnect:DirectConnect网络,不常用,可以可关闭
enable_fileTP:FTP和HTTP,打开吧

Donkey设置 Options – Settings – Plugins -Donkey
ED2K-max_connected_servers:最大连接的服务器数量,太大也没用,一般稳定后就5个
ED2K-force_client_high_id:打开,强制客户端为HighID
ED2K-force_high_id:打开,强制自己为highID
ED2K-keep_best_server:保持使用最好的服务器
ED2K-good_client_rank:它表示需要维持连接的客户端长度,默认500,第500以外的客户端将断开,等待下一次访问
ED2K-connect_only_preferred_server: 只连接优先选定的服务器,这样就避免了连接资源量小和无用的服务器,前提是你必须设置了优先服务器
ED2K-update_server_list_server:从连接的服务器里更新服务器列表,建议关闭,否则会出现一些垃圾服务器
ED2K-update_server_list_server_met:从服务器列表文件更新服务器,必须打开
ED2K-update_server_list_client :从连接到的客户端里更新服务器列表,建议关闭,否则会出现一些垃圾服务器

其他 Options – Settings – All
hdd_temp_minfree:临时目录最小可用空间,默认大小设置为50M
hdd_temp_stop_core:如果临时目录的可用空间少于上面设置的指定值,程序就会自动停止
client_buffer_size:表示缓存的总大小,单位字节,默认值是500000,即50MB,内存是不很吃紧的建议设大点
share_scan_interval:共享目录的检查时间,单位分钟,默认是120分钟,0是不检查共享目录

还有如果是内网用户或者安装了防火墙的就要设置一下端口,我自己是外网也没安防火墙,所以对这个没研究,有需要的童鞋自己去问Google大神吧。

一些重要的配置文件

MLDonkey的设置主要保存在目录下的一系列ini文件里面,这些ini文件都有各自的作用:
downloads.ini:存储了MLDonkey全局性的设置,这个配置文件十分重要。
searches.ini:存储自定义的搜索问题。
servers.ini:存储你能连接的服务器列表。
friends.ini:存储你好友的名字和对应的IP。
stats.ini:存储上传下载的统计信息。
file_sources.ini:存储能连接到的源.
files.ini:当前下载的文件列表及其md4-hash。
shared_files_new.ini:存储共享的文件列表及其md4-hash。

对于每一种P2P协议都有各自配置文件:
donkey.ini:储存eDonkey、Overnet的网络设置
bittorrent.ini:储存BT网络的设置
directconnect.ini:储存DirectConnect的网络设置
fasttrack.ini:储存Fasttrack的网络设置
fileTP.ini:储存FTP/HTTP的网络设置

如 果软件要升级或迁移,建议备份downloads.ini、file_sources.ini、files.ini、 shared_files_new.ini、donkey.ini、stats.ini和nodes.dat(储存了KAD的节点文件),当然,你也可以 根据自己需要决定备份哪些文件。

澄清大家对MLDonkey所支持IP过滤文件格式的误解

MLDonkey自带的IPblocking会误杀国内很多正规的IP和ed2k服务器确实没错,但是不知道从哪里来的流言说MLDonkey不支持电骡格式的IPfilter过滤文件,还在很多地方扯出有关解决方法的讨论。在官方Wiki的guarding列表里本来就写着建议使用电骡的IPfilter; 在WebUI的Web infos里也有说明:“guarding.p2p IP blocking lists (ipfilter and guardian v2 formats)”,何来不支持之说呢。所以说默认提供的WebUI是个好东西,不要老是用那些第三方的图形前端;有什么不明白的也要多去官方Wiki找 找看。

MLDonkey 的过滤设置可以分为网络过滤名单和本地过滤名单,设置网络过滤名单就会自动从设置的地址下载过滤文件,并且会按设定的更新时间自动更新;本地过滤名单的就 是设置你自己下载的过滤文件,当然这个是需要自己手动更新;网络或本地其实都一样,只要设置其中一个就可以了。

自带的IPblocking 误杀那么严重当然要改掉。首先要从网络过滤名单中删掉原来的过滤文件地址。进入Options – Settings – web infos(页面在底下),找到下面这一行:“guarding.p2p 96 http://www.bluetack.co.uk/config/level1.gz ”,点击左面的“Remove”按键将它删除掉。顺带说一下,这一行里的数字“96”就是更新时间间隔,单位为小时,即每96小时更新一次文件。

添加网络过滤名单,还是刚才的web infos页面,点击列表右上角的“Add URL”按键,在弹出框里输入:
guarding.p2p 过滤文件地址 96
例如:
guarding.p2p http://upd.emule-security.net/ipfilter.zip 96

设 置本地过滤名单,进入Options – Settings – Net,在“ip_blocking“选项里填上自己下载的过滤文件的磁盘地址,记得按回车设置保存设置。在Winddows下设置文件地址时有些特别, 要用Linux的写法,就是要把反斜杠写成斜杠,例如 f:/Mldonkey/temp/ipfilter.zip。使用本地过滤名单有一点需要注意的是,部分IP过滤文件头部是有注释的,但是 MLDonkey不能识别这些注释,这样很容易令到程序在载入过滤文件时发生错误,所以对于下载的过滤文件最好先把注释删除掉。方法很简单,解压缩过滤文 件,用文本编辑器打开过滤文件,删除头部的注释部分保存,然后再打包成zip、gz或者bz2格式就OK啦。

还有一点,官方推荐的过滤文件都是没有分级的,我也没在软件里看到有过滤级别的设置,所以大家最好还是选择那些没分级的过滤文件。

关于在Windows下不能启动的解决办法

发现很多童鞋遇到在Windows下软件不能启动的问题,这个大多是软件非正常关闭造成的,解决办法很简单:删除掉软件目录下的“mlnet.exe.pid”文件就好了。

总结

就 像其他P2P软件一样,MLDonkey是一款切头切尾的文件共享软件,而不是下载软件!用了一段时间后就会发现MLDonkey其实是一款大而不精、中 规中矩,但可塑性很高的多协议P2P客户端。只要设置正确,一般都会有不错的速度,要取代eMule/Mods完全不成问题。可惜随着eMule 0.50a的发布,和各Mods的发展,MLDonkey在Win下的竞争力已经变得非常微弱,不过对Geeker和Linux用户来说还是相当吸引的, 特别是那些不折腾会死星人,一定不要错过啦。

 调教MLDonkey的那些事儿