CentOS Memcached安装及运行检测

2010年1月28日 没有评论

       本来linux下安装memcache没什么很复杂的,今天发现有个小小的问题:由于libevent的安装源文件夹带有版本号等信息(带横线如libevent-1.4.9-stable结果导致编译错误)

CentOS Memcached安装系统能提高电脑更方便的使用性能。下面就这就来讲术CentOS Memcached安装。CentOSLinux使用了RHEL的源代码,但是由于这些源代码是Red Hat公司自由发布的,因此CentOS Linux的发布是完全合法的,CentOSLinux的使用者也不会遇到任何的版权问题。CentOS系统上CentOS Memcached安装。

1.CentOS Memcached安装前需要先安装Libevent:
# curl -Ohttp://www.monkey.org/~provos/libevent-1.4.9-stable.tar.gz
# tar zxflibevent-1.4.9-stable.tar.gz
# cd libevent-1.4.9-stable(如果编译错误重命名一下文件夹使不带版本信息,如下划线)
#./configure     (最好指定–prefix=/pathName/ 不然有可能memcache找不到安装目录,当然memcached安装的时候也要指定–with-libevent=/pathName)
# make
# make install

2.继续CentOS Memcached安装:
# curl -Ohttp://www.danga.com/memcached/dist/memcached-1.2.7.tar.gz
# tar zxfmemcached-1.2.7.tar.gz
# cd memcached-1.2.7
# ./configure
#make
# make install

3.CentOS Memcached安装接着在当前用户的.bash_profile中添加
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
exportLD_LIBRARY_PATH

4.CentOS Memcached运行
# memcached -m 512 -u nobody-vv
测试时候发现会出现以下错误信息:
“/usr/local/memcached/bin/memcached: errorwhile loading shared libraries: libevent-1.4.so.2: cannot open sharedobject file: No such file or directory”
错误的原因是未在系统中注册Libevent.解决方法如下:
# vi /etc/ld.so.conf.d/libevent-i386.conf
在VI中输入以下一行内容:
/usr/local/lib/
最 后不要忘了
# ldconfig

5.CentOS Memcached运行
# memcached -m 512 -u nobody-vv
<6 server listening
<7 server listening
<8 sendbuffer was 109568, now 268435456
<8 server listening (udp)
<9send buffer was 109568, now 268435456
<9 server listening (udp)
CentOSMemcached运行正常。
以上介绍CentOS Memcached安装及运行检测。

6. 启动:
memcached -l 192.168.10.60 -d -p 11212 -u nobody -m 1024

上面的命令中-d表示用 daemon 的方式启动 memcached,-l和-p组合表示监听在 192.168.10.60 的 11212端口上(如果不用-p指定端口号,则memcached将运行在11211端口上),-u表示运行用户为 nobody,-m表示为其分配1024MB的内存。

7. 测试:
可以使用telnet连接到192.168.10.60的11212端口,连接成功以后,
先向memcached中添加一个key-value对,key为test1(后面的0 010所表示的具体含义,在下一篇文章中会详细介绍),value为testing001:
set test1 0 0 10
testing001
STORED

再从memcached中取回key为test1所对应的value:
get test1
VALUE test1 0 10
testing001
END

注:上面粗体表示系统输出的内容

如果能看到类似的输出,则证明memcached已经正确配置并启动成功了。

++++++++下面的这个是另外一个版本的,是在Javaeye上面找的++++++++++++++++

原文地址:http://www.javaeye.com/topic/110112

memcached安装

1. 下载, memcached需要先安装libevent

memcached的下载地址:http://danga.com/memcached/download.bml

libevent的下载地址 :http://www.monkey.org/~provos/libevent/

2. 安装libevent

java 代码

  1. #  tar xzvf libevent-1.3c.tar.gz    
  2. # cd libevent-1.3c  
  3. # ./configure –prefix=/home/mahaibo/install  
  4. # make   
  5. # make install  

检查是否安装成功:

#cd /home/mahaibo/install/lib

如果有libevent-1.3c.so.1  libevent-1.3c.so.1.0.3  libevent.a libevent.la  libevent.so

这几个文件存在,说明安装成功

3.安装memcached

java 代码

  1. #  tar xzvf memcached-1.2.2.tar.gz   
  2. # cd memcached-1.2.2  
  3. # ./configure –with-libevent=/home/mahaibo/install –prefix=/home/mahaibo/installmemcache  
  4. # make   
  5. # make install  

检查是否安装成功:

#cd /home/mahaibo/installmemcache/bin

如果memcached  memcached-debug这2个文件存在,说明安装成功

4.执行

 

java 代码

  1. #cd /home/mahaibo/installmemcache/bin  
  2.   
  3. # ./memcached -h   

如果出现:

java 代码

  1. memcached 1.2.2  
  2. -p <num></num>      TCP port number to listen on (default11211)  
  3. -U <num></num>      UDP port number to listen on (default0, off)  
  4. -s <file></file>     unix socket path to listen on (disables network support)  
  5. -l <ip_addr></ip_addr>  interface to listen on, default is INDRR_ANY   
  6. -d            run as a daemon   
  7. -r            maximize core file limit   
  8. -u <username></username> assume identity of <username></username> (only when run as root)  
  9. -m <num></num>      max memory to use for items in megabytes, default is 64 MB  
  10. -M            return error on memory exhausted (rather than removing items)  
  11. -c <num></num>      max simultaneous connections, default is 1024  
  12. -k            lock down all paged memory   
  13. -v            verbose (print errors/warnings while in event loop)   
  14. -vv           very verbose (also print client commands/reponses)  
  15. -h            print this help and exit   
  16. -i            print memcached and libevent license  
  17. -b            run a managed instanced (mnemonic: buckets)  
  18. -P <file></file>     save PID in <file></file>, only used with -d option  
  19. -f <factor></factor>   chunk size growth factor, default 1.25  
  20. -n <bytes></bytes>    minimum space allocated for key+value+flags, default 48  

 

说明安装成功,并且路径配置正确。

有可能会出现:

java 代码

  1. memcached: error while loading shared libraries: libevent-1.3c.so.1: cannot open shared object file: No such file or directory  

说明 没有找到文件:libevent-1.3c.so.1

解决办法:

第一步. 查看下lib路径:

java 代码

  1. LD_DEBUG=libs /home/mahaibo/installmemcache/bin/memcached -v  

结果为:

java 代码

  1.    27515:     find library=libevent-1.3c.so.1 [0]; searching   
  2.      27515:      search path=tls/i686/sse2:tls/i686:tls/sse2:tls:i686/sse2:i686:sse2::/usr/local/lib/tls/i686/sse2:/usr/local/lib/tls/i686:/usr/local/lib/tls/sse2:/usr/local/lib/tls:/usr/local/lib/i686/sse2:/usr/local/lib/i686:/usr/local/lib/sse2:/usr/local/lib:/usr/local/BerkeleyDB.4.3/lib/tls/i686/sse2:/usr/local/BerkeleyDB.4.3/lib/tls/i686:/usr/local/BerkeleyDB.4.3/lib/tls/sse2:/usr/local/BerkeleyDB.4.3/lib/tls:/usr/local/BerkeleyDB.4.3/lib/i686/sse2:/usr/local/BerkeleyDB.4.3/lib/i686:/usr/local/BerkeleyDB.4.3/lib/sse2:/usr/local/BerkeleyDB.4.3/lib:/opt/Ice-3.1/lib/tls/i686/sse2:/opt/Ice-3.1/lib/tls/i686:/opt/Ice-3.1/lib/tls/sse2:/opt/Ice-3.1/lib/tls:/opt/Ice-3.1/lib/i686/sse2:/opt/Ice-3.1/lib/i686:/opt/Ice-3.1/lib/sse2:/opt/Ice-3.1/lib               (LD_LIBRARY_PATH)   
  3.      27515:       trying file=tls/i686/sse2/libevent-1.3c.so.1  
  4.      27515:       trying file=tls/i686/libevent-1.3c.so.1  
  5.      27515:       trying file=tls/sse2/libevent-1.3c.so.1  
  6.      27515:       trying file=tls/libevent-1.3c.so.1  
  7.      27515:       trying file=i686/sse2/libevent-1.3c.so.1  
  8.      27515:       trying file=i686/libevent-1.3c.so.1  
  9.      27515:       trying file=sse2/libevent-1.3c.so.1  
  10.      27515:       trying file=libevent-1.3c.so.1  
  11.      27515:       trying file=/usr/local/lib/tls/i686/sse2/libevent-1.3c.so.1  
  12.      27515:       trying file=/usr/local/lib/tls/i686/libevent-1.3c.so.1  
  13.      27515:       trying file=/usr/local/lib/tls/sse2/libevent-1.3c.so.1  
  14.      27515:       trying file=/usr/local/lib/tls/libevent-1.3c.so.1  
  15.      27515:       trying file=/usr/local/lib/i686/sse2/libevent-1.3c.so.1  
  16.      27515:       trying file=/usr/local/lib/i686/libevent-1.3c.so.1  
  17.      27515:       trying file=/usr/local/lib/sse2/libevent-1.3c.so.1  
  18.      27515:       trying file=/usr/local/lib/libevent-1.3c.so.1  
  19.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/tls/i686/sse2/libevent-1.3c.so.1  
  20.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/tls/i686/libevent-1.3c.so.1  
  21.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/tls/sse2/libevent-1.3c.so.1  
  22.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/tls/libevent-1.3c.so.1  
  23.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/i686/sse2/libevent-1.3c.so.1  
  24.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/i686/libevent-1.3c.so.1  
  25.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/sse2/libevent-1.3c.so.1  
  26.      27515:       trying file=/usr/local/BerkeleyDB.4.3/lib/libevent-1.3c.so.1  
  27.      27515:       trying file=/opt/Ice-3.1/lib/tls/i686/sse2/libevent-1.3c.so.1  
  28.      27515:       trying file=/opt/Ice-3.1/lib/tls/i686/libevent-1.3c.so.1  
  29.      27515:       trying file=/opt/Ice-3.1/lib/tls/sse2/libevent-1.3c.so.1  
  30.      27515:       trying file=/opt/Ice-3.1/lib/tls/libevent-1.3c.so.1  
  31.      27515:       trying file=/opt/Ice-3.1/lib/i686/sse2/libevent-1.3c.so.1  
  32.      27515:       trying file=/opt/Ice-3.1/lib/i686/libevent-1.3c.so.1  
  33.      27515:       trying file=/opt/Ice-3.1/lib/sse2/libevent-1.3c.so.1  
  34.      27515:       trying file=/opt/Ice-3.1/lib/libevent-1.3c.so.1  
  35.      27515:      search path=/usr/lib/tls/i686/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i686:/usr/lib/sse2:/usr/lib                (system search path)  
  36.      27515:       trying file=/usr/lib/tls/i686/sse2/libevent-1.3c.so.1  
  37.      27515:       trying file=/usr/lib/tls/i686/libevent-1.3c.so.1  
  38.      27515:       trying file=/usr/lib/tls/sse2/libevent-1.3c.so.1  
  39.      27515:       trying file=/usr/lib/tls/libevent-1.3c.so.1  
  40.      27515:       trying file=/usr/lib/i686/sse2/libevent-1.3c.so.1  
  41.      27515:       trying file=/usr/lib/i686/libevent-1.3c.so.1  
  42.      27515:       trying file=/usr/lib/sse2/libevent-1.3c.so.1  
  43.      27515:       trying file=/usr/lib/libevent-1.3c.so.1  
  44.      27515:      search cache=/etc/ld.so.cache  
  45.      27515:      search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib/sse2:/lib:/usr/lib/tls/i686:/usr/lib/tls:/usr/lib/sse2:/usr/lib          (system search path)  
  46.      27515:       trying file=/lib/tls/i686/sse2/libevent-1.3c.so.1  
  47.      27515:       trying file=/lib/tls/i686/libevent-1.3c.so.1  
  48.      27515:       trying file=/lib/tls/sse2/libevent-1.3c.so.1  
  49.      27515:       trying file=/lib/tls/libevent-1.3c.so.1  
  50.      27515:       trying file=/lib/i686/sse2/libevent-1.3c.so.1  
  51.      27515:       trying file=/lib/i686/libevent-1.3c.so.1  
  52.      27515:       trying file=/lib/sse2/libevent-1.3c.so.1  
  53.      27515:       trying file=/lib/libevent-1.3c.so.1  
  54.      27515:       trying file=/usr/lib/tls/i686/libevent-1.3c.so.1  
  55.      27515:       trying file=/usr/lib/tls/libevent-1.3c.so.1  
  56.      27515:       trying file=/usr/lib/sse2/libevent-1.3c.so.1  
  57.      27515:       trying file=/usr/lib/libevent-1.3c.so.1  
  58.      27515:  
  59. /home/mahaibo/installmemcache/bin/memcached: error while loading shared libraries: libevent-1.3c.so.1: cannot open shared object file: No such file or directory  

第二步. 将libevent-1.3c.so.1拷贝到任何一个列出的lib 下就可以了。

或者 软链接

java 代码

  1. ln -s /Data/libevent/lib/libevent-1.3b.so.1 /usr/lib/libevent-1.3c.so.1  

或者 修改vi  /etc/profile文件。

java代码

  1. export LIBRARY_PATH=:/usr/local/lib:"/usr/local/BerkeleyDB.4.3/lib":/usr/local/lib:/opt/Ice-3.1/lib:/usr/lib:/home/mahaibo/install/lib  

 

启动服务 :

java 代码

 

  1. ./memcached -d -m 10    -u root -l 192.168.40.4 -p 12000 -c 256 -P /tmp/memcached.pid  

 

参数说明:

-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB
-u是运行Memcache的用户,我这里是root
-l是监听的服务器IP地址
-p是设置Memcache监听的端口,最好是1024以上的端口
-c选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
-P是设置保存Memcache的pid文件

分类: Linux 标签:

温故而知新:CuteFtp 使用教程

2010年1月28日 没有评论

       用了N久才知道其实有很多功能还不会用
CuteFTPPro 8.2是一款全新的商业级FTP客户端程序,其加强的文件传输系统能够完全满足各种用户的应用需求。文件通过构建于SSL或SSH2安全认证的客 户机/服务器系统进行传输,同时也为VPN、WAN、Extranet开发管理人员提供了最经济的解决方案。使企业不再需要为了一套安全的数据传输系统而 进行破费了。此外,专业版的CuteFTP8.2还提供了SophisticatedScripting(经典脚本)、目录同步、自动排程、同时多站点连接、多协议支持(FTP、SFTP、HTTP、HTTPS)、智能覆盖、整合的 HTML编辑器等功能,是一款出色并且更加快速的文件传输系统。

 

第一:下载安装

下载地址:CuteFtpPro8.2下载

软件下载后为一个.rar格式的压缩文件。安装比较简单,一路点击【下一步】按钮就可以了。

CuteFtp Pro8.2安装起始画面(对某些功能和工具可以选择进行安装)

 

第二:界面预览

CuteFtp Pro8.2含有简体中文语言包,通过菜单【工具】―>【全局选项】可以进行语言设置。试用版期限为30天。主界面默认显示了本地驱动器(目录)、站点管理器、队列及日志四大窗口。

CuteFtp启动后试用期限提示

CuteFtp主界面

第三:站点设置

要使用FTP工具来上传(下载)文件,首先必须要设定好FTP服务器的网址(IP地址)、授权访问的用户名及密码。下面我们将演示具体的参数设置, 看完之后即使是初入门的菜鸟级用户也能很快上手,哈哈。

通过菜单【文件】―>【新建】―>【FTP站点】或者CTRL+N键我们可以对远程的FTP服务器进行具体的设置。(当然还有其它的方 法)

第一步:按照界面所示,我们在常规选项卡中输入标签内容,(它其实只是站点的名称是对FTP站点的一个说明)。然后在分别输入主机地址(即FTP服 务器所拥有的IP地址),用户名和密码(如果你不知道的话,可以询问提供FTP服务的运营商或管理员)。对于匿名选项我们不必选择(匿名的意思就是不需要用户名和密码可以直接访问FTP服务器,但很多FTP服务器都禁止匿名访问)。

第二步:在类型选项卡有一项端口号(21),对于端口号我们在没有特别要求的情况下就使用默认的(21),而不必再进行任何改变。

第三步:在动作选项卡设置远程及本地文件夹(目录),远程文件夹其实就是连上FTP服务器后默认打开的目录;而本地文件夹就是每次进入FTP软件后 默认显示的本地文件目录(当然了,如果大家不太清楚或者感觉麻烦的话也可以先不设置远程及本地路径,系统将会使用自己的默认路径)。

以上这些参数都设置好之后,便可使用FTP进行文件上传下载了,很简单吧。

 

CuteFtp站点设置画面

第四:连接上传

1:连接

通过上面的设置之后现在就可以连接FTP服务器上传文件了。我们可以通过站点管理器窗口双击要连接的FTP服务器或者选择要连接的FTP服务器点击 工具栏的 连 接图标就可以了。连接之后,便可选择目录或文件进行上传下载了。

 

2:上传下载

我们不仅可以传输单个文件,还可以传输多个文件甚至整个目录,CuteFtp主要提供了五种方法。

 

第一种:选中所要传输的文件或目录,直接拖拽到目的主机中就可以了;

第二种:在选中所要传输的文件或目录后,单击鼠标右键选择【传输】就可以了;

第三种:双击想要传输的文件就可以了(但要先在参数选择中进行设置);

第四种:选中所要传输的文件或目录后,点击工具栏 上 传按钮就可以了;

 

第五种:将选中的文件或文件夹拖放到队列窗口中,然后通过鼠标右键菜单命令进行传输。使用传输队列最大的好处是可以随时加入或删除传输的文件,并且 对于需要经常更新的内容,允许你把它们放到队列中保存下来,每次传输文件时还可以通过菜单【工具】―>【队列】―>【载入并保存队列】― >【载入队列】调出之前保存的队列进行文件传输。不过要注意的是不同的文件上传到不同目录时,必须先将该目录打开之后再添加要传的文件到队列之中。

CuteFtp连接后传输画面

第五:其它功能及设置

1 快速连接

快速连接就是不需通过站点设置,直接输入IP地址、用户名及密码进行连接。它适合用在需要临时性连接的站点,并且快速连信息接会被保存,如果下次还 想使用,就可以直接选择进行连接了,非常方便。通过快速连接工具栏输入相关信息,点击连接按钮就可以了

CuteFtp快速连接画面

2 站点导入导出

站点导入就是将之前版本的站点信息或其它FTP软件的站点信息导入进来,而不需要再进行重复的设置(最新的CuteFtp8.2专业版共支持18种 FTP软件及格式文件的导入),这给广大的用户节省了时间,也减少了麻烦。通过菜单【工具】―>【站点管理器】―>【导入/导出FTP站点】 我们就可以进行站点导入及导出。

 

CuteFtp站点导入

 

CuteFtp站点导入(可以支持两种格式导出文本)

 

3 密码保护

密码保护顾名思义就是对站点管理器的数据信息进行加密,给我们的数据安全提供保障,并且在以后的每次启动时都会出现密码提示窗口。但要注意的是在设 置密码之后如果忘记密码,CuteFtp将创建一个新的站点管理器,同时备份被锁定的站点管理器。通过菜单【工具】―>【站点管理器】―> 【安全】―>【加密站点管理器数据】我们就可以设置密码了。

 

CuteFtp密码设置画面

 

CuteFtp启动提示密码输入画面

 

4 队列管理

队列管理就是对所传输的文件及目录进行的一些功能设置,包括队列的保存,载入、清除、恢复和传输等,可以说是比较重要的功能。通过菜单【工具】― >【队列】我们就可以进行队列的相关操作。

 

CuteFtp队列管理功能

 

5 文件夹工具(比较及同步)

文件夹内容比较就是对两台不同的机器上的相关目录下的内容进行比较,然后把

不相同的内容使用不同的颜色分别显示出来,而文件夹内容同步就是让本地和远程的文件结构保持一致(共有三种方向),这对于保持版本一致性都是非常有 用的。通过菜单【工具】―>【文件夹工具】我们就可以进行相关的操作。

 

CuteFtp文件夹内容比较

 

CuteFtp文件夹内容同步

 

6 计划任务

计划任务功能就是设定未来的某个时间段来自动的进行文件的传输,不需人工的干预,直到传完为止(没有结束时间设置)。通过菜单【队列】―> 【计划选定】我们就可以实现文件自动传输。

 

CuteFtp计划任务功能

 

7 远程站点对传

远程站点对传就是在两台远程FTP服务器之间直接传送文件,省去了很多麻烦。通过菜单【文件】―>【下载高级】―>【站点对传到】选择 要对传的站点就可以了。但要注意的是,不是所有的FTP服务器都支持此功能,并且传输速度比较慢,不一定能够成功。

 

CuteFtp远程站点对传

8 文件名大小写转换

文件大小写转换就是在传输文件时,强制把要传输的文件名按照需要进行大小写的改变。这对于大小写敏感的UNIX系统非常有用。通过菜单【工具】― >【全局选项】或ALT+F7或者工具栏 图 标进入重命名规则选项卡我们就可以实现文件名大小写转换,甚至整个文件的改名。

 

CuteFtp重命名规则画面

9 断点续传

断点续传功能可以说几乎是每个FTP软件必备的功能,也可以说是最基本和重要的功能了。它的实质就是当传输文件过程中,由于各种原因使得传输过程发 生异常,产生中断,在系统恢复正常后,FTP软件能够在之前发生中断的位置继续传输文件,直到数据传送完毕为止。通过菜单【工具】―>【全局选项】 的传输选项卡我们就可以设置断点续传属性。

 

CuteFtp断点续传设置画面

 

10:速度限制

速度限制功能就是当网络比较拥挤或FTP站点有特定要求的时候,对文件的上传和下载的速度进行具体的限制,其中0表示没有限制。通过菜单【工具】― >【全局选项】的传输选项卡我们就可以设置速度限制了。

 

CuteFtp速度限制画面

 

11:过滤器(属性、掩码、过滤符 跳过列表、优先级别、选择传输)

过滤器功能简单的说就是将符合条件的待传输文件及目录进行传输,我们可以通过设置属性、掩码、过滤符等来控制文件的传输。通过菜单【查看】― >【过滤器】我们就可以对传输的文件进行选择。

 

CuteFtp过滤器画面

 

12:快速拖放

快速拖放功能是大多数FTP软件都支持的功能,它主要就是为了用户操作的方便。通过菜单【工具】―>【全局选项】的导航选项卡我们就可以设置 拖放的响应结果。

 

CuteFtp动作设置画面

 

13:多语言支持

CuteFtpPro8.2配合语言包支持包括中文简体在内的多语言界面。通过菜单【工具】―>【全局选项】的语言选项卡我们就可以设置使用的语言(默认的语言包 为英文)。

CuteFtp语言设置画面

 

14:应用程序助手(文件关联)

许多用户在使用FTP软件传输文件的时候,突然发现了一些错误想要修改,但是如果要在调用相关的软件打开,又比较麻烦,所以很多FTP软件就通过文 件关联来让用户直接调用相关编辑软件打开要修改的文件,方便了用户的操作。通过菜单【工具】―>【全局选项】的应用程序助手选项卡我们就可以设置关 联程序。

CuteFtp文件关联画面

 

15:自定义颜色及字体

CuteFtp提供了自定义颜色及字体功能,对于不同的文件、操作和状态等使用不同的颜色和字体,使用户的操作和浏览更加的一目了然。通过菜单【工 具】―>【全局选项】的颜色选项卡我们就可以自定义颜色及字体了。

CuteFtp自定义颜色和字体画面

 

16:智能保持连接(反空闲、闲置保护)

所谓反空闲或者说闲置保护功能就是让计算机在空闲状态下每隔一段时间向FTP服务器发送一段特定信息,以便让FTP服务器知道自己还是活动的,从而 避免FTP服务器断开对自己的连接。通过菜单【工具】―>【全局选项】的智能保持连接选项卡我们就可以设置相关的参数。

CuteFtp反空闲设置画面

17:远程管理

远程管理简单的说就是在远程FTP服务器上也可以自由的新建、删除、打开文件或目录等操作。这都是方便性的体现。

18:分组管理

分组管理就是将多个不同的FTP服务器放在同一个组(就相当于目录)中,这样可以更加便于用户的管理。

19:智能覆盖

智能覆盖就是当传输文件过程中,如果遇到相同文件名的文件或目录怎么处理?CuteFtp共提供了最多达七种方法。通过菜单【工具】―>【全 局选项】的智能覆盖选项卡我们就可以进行相关的设置。

 

CuteFtp智能覆盖画面

 

20:同步浏览

同步浏览就是在操作本地目录的同时也对远程服务器上相同的目录进行了同样的操作。通过菜单【工具】选中【实时目录同步浏览】就可以了。

 

总结:

总之CuteFtp功能丰富而强大,界面亲切而友好、操作简单而方便、传输速度也是非常快,支持标签式浏 览,可以说是FTP软件中的领先者!不足之处就是菜单嵌套层数较多,操作比较繁琐,启动及调用全局选项速度有点慢。

分类: 其他 标签:

linux下查看nginx,apache,mysql,php的编译参数

2010年1月25日 没有评论

有时候nginx,apache,mysql,php编译完了想看看编译参数可以用以下方法

nginx编译参数:
#/usr/local/nginx/sbin/nginx -V

nginx version: nginx/0.6.32

built by gcc 4.1.2 20071124 (Red Hat 4.1.2-42)

configure arguments: –user=www –group=www –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-openssl=/usr/local/openssl

apache编译参数:
# cat /usr/local/apache2/build/config.nice

#! /bin/sh

#

# Created by configure

"./configure" \

"–prefix=/usr/local/apache2" \

"–with-included-apr" \

"–enable-so" \

"–enable-deflate=shared" \

"–enable-expires=shared" \

"–enable-rewrite=shared" \

"–enable-static-support" \

"–disable-userdir" \

"$@"

php编译参数:
# /usr/local/php/bin/php -i |grep configure

Configure Command =>  ‘./configure’  ‘–prefix=/usr/local/php’ ‘–with-apxs2=/usr/local/apache2/bin/apxs’ ‘–with-config-file-path=/usr/local/php/etc’ ‘–with-mysql=/usr/local/mysql’ ‘–with-libxml-dir=/usr/local/libxml2/bin’ ‘–with-gd=/usr/local/gd2’ ‘–with-jpeg-dir’ ‘–with-png-dir’ ‘–with-bz2’ ‘–with-xmlrpc’ ‘–with-freetype-dir’ ‘–with-zlib-dir’

mysql编译参数:

# cat "/usr/local/mysql/bin/mysqlbug"|grep configure

# This is set by configure

CONFIGURE_LINE="./configure ‘–prefix=/usr/local/mysql’ ‘–localstatedir=/var/lib/mysql’ ‘–with-comment=Source’ ‘–with-server-suffix=-H863’ ‘–with-mysqld-user=mysql’ ‘–without-debug’ ‘–with-big-tables’ ‘–with-charset=gbk’ ‘–with-collation=gbk_chinese_ci’ ‘–with-extra-charsets=all’ ‘–with-pthread’ ‘–enable-static’ ‘–enable-thread-safe-client’ ‘–with-client-ldflags=-all-static’ ‘–with-mysqld-ldflags=-all-static’ ‘–enable-assembler’ ‘–without-isam’ ‘–without-innodb’ ‘–without-ndb-debug’"

分类: Linux 标签:

Linux环境下不重新编译php添加扩展模块方法

2010年1月25日 没有评论

以添加ftp模块为例子

进入源码目录

cd php-5.2.8/ext/ftp
#运行phpize生成configure

/usr/local/php/bin/phpize

#编译,指定php-config,注意这里的php-config,不是php.ini

./configure –with-php-config=’/usr/local/php/bin/php-config’
#上面可以添加–enable-ftp,也可以不用添加

#编译安装     
(注意:如果之前有过添加其他模块一定要先 make clean ,不然编译报错。在configure之前还是之后不清楚,我是在之前~ ~)

make&& make install

#生成一个目录来存放扩展的模块

mkdir /usr/local/php/etc/php/ext

#复制ftp.so到模块目录

cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ftp.so /usr/local/php/etc/ext/

#编辑php.ini文件,指定PHP到哪个目录读模块

vi /usr/local/php/etc/php.ini

extension_dir="/usr/local/php/etc/ext"
#Load模块
extension=ftp.so
#保存退出

重启apache
再用/usr/local/php/bin/php -m|grep ftp查看是否有ftp.so

分类: Linux 标签:

Apache没有权限加载libphp5.so问题解决方案

2010年1月25日 没有评论

       安装Apache+PHP环境的时候发现重启Apache报错,大概意思是没有权限加载libphp5.so文件

httpd: Syntax error on line 53 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied

解决办法:
原因是Linux有一个SELinux保护模式引起的。
1.关闭SELINUX的方法:
vi /etc linux/config 将SELINUX=enforcing 改成SELINUX=disabled 需要重启

2.不关闭SELINUX的方法:

# setenforce 0

# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /usr/local/apache/modules/libphp5.so

# service httpd restart

# setenforce 1

分类: Linux 标签:

Linux下查看WEB服务器的请求数

2010年1月24日 没有评论

      在Linux下查看WEB服务器的负载情况,以前也说过,最简单有有效的方式就是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apache Server Status的情况下,或安装的是其他的Web Server,比如Nginx的时候,下面的命令就体现出作用了。

ps -ef|grep httpd|wc -l命令
#ps -ef|grep httpd|wc -l
1388
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。
表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。

netstat -nat|grep -i “80″|wc -l命令
#netstat -nat|grep -i “80″|wc -l
4341
netstat -an会打印系统当前网络链接状态,而grep -i “80″是用来提取与80端口有关的连接的, wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数。

netstat -na|grep ESTABLISHED|wc -l命令
#netstat -na|grep ESTABLISHED|wc -l
376
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。
最终返回的数字就是当前所有80端口的已建立连接的总数。

下面这句最牛X

netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’命令
#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
FIN_WAIT_1 286
FIN_WAIT_2 960
SYN_SENT 3
LAST_ACK 32
CLOSING 1
CLOSED 36
SYN_RCVD 144
TIME_WAIT 2520
ESTABLISHED 352
     这条语句是在张宴那边看到,据说是从新浪互动社区事业部技术总监王老大那儿获得的,非常不错。返回参数的说明如下:
SYN_RECV表示正在等待处理的请求数;
ESTABLISHED表示正常数据传输状态;
TIME_WAIT表示处理完毕,等待超时结束的请求数。

原文:http://www.ccvita.com/340.html

分类: Linux 标签:

RoR部署方案深度剖析

2010年1月22日 没有评论

       虽然我不是做RoR方案的,但这篇文章对服务器软件的选取做了比较深入剖析,所以这篇文章还是值得一看的,呵呵。

      RoR的部署方案可谓五花八门,有Apache/Fastcgi方式的,有Nginx/Mongrel方式的,还有lighttpd/Fastcgi方式,也有人使用HAProxy/Mongrel,各种部署方式都是众说纷纭,让人搞不清楚哪种方式更好一些。我的这篇文章就是希望结合我们运营JavaEye网站一年多以来的经验(通过统计Rails的production.log,JavaEye网站目前每天处理超过70万200 OK状态的Ruby动态请求,应该是国内目前负载量最大的RoR应用了),为大家剖析RoR部署方案的优劣,帮助大家选择适合自己生产环境的RoR部署方式。

在讨论部署方案之前,先让我们看一下RoR网站部署的简单架构:


浏览器的HTTP访问请求首先达到Web服务器,充当Web服务器的一般是Lighttpd/Apache/Nginx,如果访问请求包含静态资源,那么Web服务器就会直接从本地硬盘读取静态资源文件,例如图片,JavaScript,CSS等等,返回给客户端浏览器;如果访问请求是动态请求,那么Web服务器把URL请求转发到后端的FastCGI/Mongrel来处理,等到FastCGI/Mongrel处理完请求,将生成的页面数据返回给Web服务器,最后Web服务器把页面数据发送到客户端的浏览器。

从RoR的部署方式来看,主要由前端的Web服务器和后端的应用服务器构成:前端的Web服务器可以使用Apache,Lighttpd,Nginx和Litespeed,后端的应用服务器可以使用FastCGI和Mongrel,下面我们分门别类的介绍和剖析:

一、介绍Web服务器
Web服务器的主要作用有两点:一是处理静态资源,二是将动态请求分发到后端应用服务器,然后接收后端应用服务器生成的页面数据,将其返回浏览器,充当了一个信息沟通的桥梁作用,在本文当中我们重点分析后者的作用。

1、Apache 2.2

Apache是全球互联网使用最广泛的Web服务器,但在处理静态资源文件上却不是性能最优秀的Web服务器,不过一般情况下,静态资源的访问并不是RoR网站的瓶颈,因此也不必过于在意这一点。

Apache 2.2既支持HTTP Proxy方式连接后端的Mongrel应用服务器,也可以通过mod_fastcgi/mod_fcgid来连接FastCGI应用服务器:当以HTTP Proxy方式连接Mongrel的时候,Apache接收Mongrel返回的页面数据的buffer size最大只能开到8KB(默认是4KB或者8KB),因此当页面数据超过8KB的时候,可能需要Apache和Mongrel之间发生多次交互;当以mod_fastcgi方式连接FastCGI应用服务器的时候,接收返回数据的Buffer size仍然只有8KB而已,如果使用mod_fcgid,那么buffer size为64KB,有了很大的改善。

2、Nginx

Nginx是俄国人出品的轻量级Web服务器,在处理静态资源方面,据说性能还略微超过Lighttpd的10%,而且资源消耗更小。

Nginx内置了良好的HTTP Proxy和FastCGI支持,因此即可以连接Mongrel,也可以连接FastCGI服务器,在这两种情况下,Nginx默认的接收应用服务器返回数据的Buffer Size也只有区区的8KB,但是你可以自行设置更大Buffer Size。

3、Lighttpd

Lighttpd是全球互联网排名第五的Web服务器,也是近两年来上升最快的Web服务器,特别是很受一些著名Web 2.0大网站的欢迎,例如wikipedia的某些服务器,youtube的视频服务器,在国内,豆瓣网站和JavaEye网站都是Lighttpd的绝对拥护者。在处理静态资源方面,Lighttpd性能远远超过Apache。

Lighttpd既支持HTTP Proxy连接Mongrel,也支持FastCGI方式,但是Lighttpd的FastCGI支持在所有流行的Web服务器当中可能是最优秀的,所以用FastCGI的网站都很喜欢Lighttpd。Lighttpd在接收后端应用服务器返回数据的方式上和Apache/Nginx有非常大的区别:

Apache/Nginx是针对每个应用服务器连接分配固定Size的Buffer,而且默认只开8KB,这个Size对于现在网页动辄50-100KB的情况来说,显得过于保守,如果应用服务器的返回数据无法一次填满Web服务器的Buffer,那么就会导致应用服务器和Web服务器之间多次数据传输,这对于RoR网站的性能会造成一些相关的影响,我们在后面会详细的分析。

Lighttpd并不针对应用服务器的每个连接分配固定的Buffer,而是尽可能的把应用服务器返回的数据一次性接收下来,因此无论应用服务器返回多大的数据量,Lighttpd都是照单全收,胃口非常惊人。

4、Litespeed

Litespeed是一个商业收费的Web服务器,静态资源处理能力据它自己的评测数据比Lighttpd略高。Litespeed也同时支持HTTP Proxy连接Mongrel和FastCGI连接应用服务器。此外Litespeed专门为单机运行的RoR开发了一个lsapi协议,号称性能最好的RoR通讯协议,比HTTP Proxy和FastCGI都要好。但是lsapi的运行方式有很大缺陷:因为lsapi不是web server启动的时候启动固定数目的ruby进程,而是根据请求繁忙程度,动态创建和销毁ruby进程,貌似节省资源,实则留下很大的黑客攻击漏洞。只要黑客瞬时发起大量动态请求,就会让服务器忙于创建ruby进程而导致CPU资源耗尽,失去响应。

由于Litespeed在运行RoR方面并没有表现出比Lighttpd优越之处,而且还是收费软件,企业版本售价在双核CPU上面每年收费499美元,并且也不开源,因此我们就不再把关注点放在Litespeed上面。当然Litespeed收费也不是白收的,它提供了非常好用的基于Web的服务器管理界面,以及非常多的安全性方面的设置参数。

5、HAProxy

HAProxy并不是一个Web服务器,他既不能处理静态资源,也不能充当浏览器和应用服务器之间的缓冲桥梁,他只是充当了一个请求分发的软件网关作用。ThoughtWorks公司的RubyWorks选择使用HAProxy + Mongrel Cluster的方式来部署RoR应用,不能不说是一个愚蠢的方案。这种方案其实相当于把n个Mongrel应用服务器捆绑起来,直接充当Web服务器,而Mongrel毕竟是一个Ruby写的服务器,无论是网络IO能力,还是静态资源的处理速度,无法和真正的Web服务器相提并论,让Mongrel直接处理静态资源和调度网络IO,会造成服务器资源毫无必要的极大开销,因此HAProxy也不在我们的考虑之列。

二、分析应用服务器的处理方式

无论是Mongrel还是FastCGI,都能够良好的运行Rails服务器,但是他们在和Web服务器之间的数据传输方式上存在一些差别,而正是这些差别,对部署方式有重大的影响:

1、Mongrel

Mongrel本身可以直接充当Web服务器,但在这种情况下性能并不会好。因为Mongrel只有HTTP协议的解析部分是用C语言编写的,其余所有代码都是纯Ruby的。在处理静态资源下载上面,Mongrel的实现方式非常低效率,他只是简单的以16KB为单位,依次读入文件内容,再写出到网络Socket端口,其性能远远比不上传统的Web服务器调用操作系统的read()和write()库实现的静态文件下载速度,如果和现代Web服务器实现的sendfile方式的“零拷贝”下载相比,简直就是望尘莫及。

Mongrel使用了Ruby的用户线程机制来实现多线程并发,并且使用了一个fastthread补丁,改善了Ruby用户线程的同步互斥锁问题。但是Ruby并不是本地线程,我们也不要对Mongrel的网络IO负载能力抱有什么不切实际的幻想。同时Rails本身也不是线程安全的,因此Mongrel在执行Rails代码的过程中,完全是加锁的状态,那和单进程其实也没有太大差别。

因此,当我们使用Mongrel的时候,一般会在前端放置Web服务器,通过HTTP Proxy方式把请求转发给后端的Mongrel应用服务器。在这种情况下,Mongrel只处理动态请求,在运行Rails框架生成页面数据之后,把数据返回给Web服务器就可以了。但是在这种部署方案下,有一个很重要的细节被我们忽视了,Mongrel运行Rails生成的页面数据是怎么返回给Web服务器的呢?通过仔细钻研源代码我们可以搞清楚Mongrel处理Rails请求的细节:

1) Mongrel接收到请求以后,启动一个ruby线程解析请求信息
2) 加锁,调用Rails Dispatcher启动Rails框架
3) Rails处理完毕,创建一个StringIO对象,把Rails生成的页面数据写入到StringIO中
4) 解锁,把StringIO的数据flush到Web服务器

这个StringIO对象其实很重要!它充当了一个输出缓冲区的作用,我们设想一下,当Mongrel作为独立的Web服务器的时候,如果Rails生成的页面比较大,而客户端浏览器下载页面的速度又比较慢,假设没有这个StringIO对象,会发生什么问题? Rails线程在执行render方法的时候就会被挂住!同步互斥锁没有解锁,Mongrel再也无法处理下一个动态请求了。

当Mongrel仅仅作为应用服务器的时候,这个StringIO仍然很重要,为什么?我们前面提到过了,Apache/Nginx的接收缓冲区都只开了8KB,如果页面比较大,Mongrel就没有办法一次性把数据全部推给Web服务器,必须等到Web服务器把接收缓冲区的8K数据推到客户浏览器端以后,清空缓冲区,才能接收下一个8KB的数据。这种情况下,Mongrel必须和Web服务器之间进行多次数据传输,才能完成整个Web响应的过程,显然没有一次性把页面数据全部推给Web服务器快。如果Web服务器使用Lighttpd的话,情况会不一样。当Mongrel把StringIO的数据flush出去的时候,Lighttpd是一次性全部接收下来了,不需要多次交互,因此Lighttpd+Mongrel的RoR网站的实际速度要快于Apache/Nginx+Mongel。

Mongrel使用StringIO对象缓存输出结果,在某些特殊的情况下会带来很大的安全隐忧。我们假设使用服务器端程序控制带权限的文件下载,某用户下载的是一个100MB的文件,该用户使用了多线程下载工具,他开了10个线程并发下载,那么每个线程Mongrel在响应之后,都会把整个文件读入到内存的StringIO对象当中,所以总共会创建出来10个StringIO对象保存10份文件内容,所以Mongrel的内存会一下暴涨到1GB以上。而且最可怕的是,即使当用户下载结束以后,Mongrel的内存都不会迅速回落,而是一直保持如此高的内存占用,这是因为Ruby的GC机制不好,不能够及时进行垃圾回收。

也许你会觉得不太可能下载100MB那么大的附件,但是以JavaEye网站为例,圈子的共享文件最大允许10MB,只要用户在多台机器上面,每台机器开100个线程下载圈子共享文件,每个Mongrel的内存占用都会立刻超过1GB,用不了几分钟,服务器的物理内存就会被耗尽,网站失去响应。这个缺陷非常容易被别有用心的黑客利用,攻击网站。这也是JavaEye网站为什么始终不用mongrel的原因之一。

通过上面的剖析,我们知道Mongrel在使用Lighttpd的时候,可以达到最快的RoR执行速度,但是Lighttpd当前的1.4.18版本的HTTP Proxy的负载均衡和故障切换功能有一些bug,因此一般很少有人会使用这种方式。大多数人都会采用Mongrel搭配Apache2.2或者Nginx,但是正如我们上面做分析的那样,Apache/Nginx的Buffer Size实在是一个很讨厌的限制,特别是Apache只能最大开8KB的Buffer,因此我建议使用Nginx搭配Mongrel,并且把Nginx的Proxy Buffer Size设置的大一些,比如说设置为64KB,以保证大多数页面输出结果可以一次性flush到Web服务器去。

2、FastCGI

很多人对FastCGI谈虎色变,仿佛FastCGI就是内存泄漏,性能故障的罪魁祸首,又或者嫌弃FastCGI太古老了,已经被淘汰掉的技术了,其实这是一个很大的误解。FastCGI本质上只是一种进程间通讯的协议,虽然是一个比较古老的协议,但是还是比HTTP协议年轻多了,HTTP协议不是照样现在很流行吗?

在PHP/ASP/JSP流行之前,FastCGI曾经非常普及,只不过那个时代的FastCGI程序是用C语言编写的,写起来太费劲,而PHP/ASP/JSP相比之下,写起来就太简单了,所以FastCGI就渐渐被丢到了历史的故纸堆里面。但是最近两年来,由于Ruby和Python的快速Web开发框架的强势崛起,FastCGI仿佛又咸鱼翻身了。

当我们以FastCGI方式运行Rails应用服务器的时候,每个FastCGI进程都是单线程运行的,考虑到Rails本身不是线程安全的,所以和Mongrel运行Rails的实际效果是一样的,都是每个进程只能跑一个Rails实例。但是FastCGI在Rails生成页面数据返回给Web服务器的方式和Mongrel截然不同:

前面我们说到Mongrel自己开了输出缓冲区,而FastCGI则完全不开任何缓冲区,当Rails执行render方法的时候,FastCGI实际执行的是FCGI::Stream.write方法调用,直接把数据写给Web服务器了。此时如果Web服务器是Apache/Nginx,会发生什么?

如果我们使用mod_fastcgi模块,那么Apache的接收缓冲区就是8KB;
如果我们使用mod_fcgid模块,那么Apache的接收缓冲区就是64KB;(mod_fcgid是中国人开发的取代mod_fastcgi的开源项目,在Apache社区很受欢迎,谁敢说中国人只是开源“消费”国?)
如果我们使用Nginx服务器,那么默认的接收缓冲区就是8KB,但是可以改得更大;

如果页面数据比较大,超过8KB,会怎么样? FastCGI进程被挂在render方法上!必须等到Web服务器的缓冲区清空,把页面数据全部接收下来以后,FastCGI进程才能结束本次Rails调用,处理下一个请求!所以千万别用Apache/Nginx搭配FastCGI应用服务器,否则你的RoR应用会死的很难看。根据我个人的测试数据表明,同样的测试负载,Apache搭配70个FastCGI进程挂掉,但是Lighttpd搭配30个FastCGI进程轻松跑完!

当FastCGI搭配Lighttpd的时候,我们知道Lighttpd会一次性照单全收FastCGI送过来的页面数据,所以FastCGI进程并不会被挂住。如果我们对比一下Lighttpd搭配Mongrel和FastCGI会发现,Lighttpd搭配FastCGI性能最好,为什么呢?

Mongrel首先自己会用StringIO缓冲页面数据,然后推送给Lighttpd以后,Lighttpd也在内存当中缓冲了一份页面数据,造成了毫无必要的double buffer的开销。这自然不如FastCGI不做任何缓冲,直接推给Lighttpd性能来得高,内存消耗少了。

我们的方案分析到这里,大家应该自己心里有结论了,Lighttpd+FastCGI是性能最佳,服务器资源消耗最少的RoR部署方案,事实上目前RoR网站部署使用最多最流行的也是Lighttpd+FastCGI方式,而JavaEye网站,自然也是这种方式的部署。因此我们可以对各种方案进行一个性能优劣的排队:

引用
Lighttpd+FastCGI > Lighttpd+Mongrel > Nginx+Mongrel > Apache+Mongrel > Ngignx+FastCGI > Apache+FastCGI

其中Lighttpd+FastCGI是性能最佳方案,而Apache+FastCGI是性能最差方案。

有些细心的同学可能会产生一个新的疑问?你说到底,之所以Lighttpd跑RoR性能最好,还是在于Lighttpd接收数据不限定缓冲区的大小,而Apache/Nginx限定了缓冲区大小所至。那为什么Nginx要限制呢?Lighttpd如果不限制的话,会不会导致Lighttpd内存爆掉?

Nginx限制Proxy Buffer Size其实也有道理,因为Nginx并不是为RoR量身打造的Web服务器,Nginx最广泛的用途还是高负载大访问量的代理服务器,在Nginx主要的应用场合,如果不做这样的限制,那Nginx端的资源消耗就相当高了,有可能会拖累所代理的服务速度。

Lighttpd主要用途之一就是提供高性能的FastCGI支持的Web服务器,所以必须为FastCGI量身打造。Lighttpd端承担的负载越高,就越能有效的加快FastCGI执行速度。其实我们稍微心算一下,假设Lighttpd后面挂1000个FastCGI进程,每个FastCGI进程同时送过来50KB的页面数据,Lighttpd就是全部吃下来,也不过只消耗50MB的内存而已,而事实上1000个FastCGI进程足以支撑每日上千万的大网站了。

只有当我们使用服务器端程序控制大文件下载的时候,有可能造成Lighttpd内存暴涨,例如某个用户使用100个线程并发下载JavaEye圈子的共享文件,在没有特殊处理的情况下,Lighttpd将全部吃下100个FastCGI进程送过来的10MB数据,就会立刻暴涨1GB的内存。这种情况怎么办呢?其实我们也有办法让Lighttpd一点内存都不吃, 请看我写的另外一篇文章:RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能

可能很多人看了我的文章,对结论觉得很诧异,既然Lighttpd+FastCGI这样好,为什么那么多人都推崇Mongrel,否定FastCGI呢?我想,不外乎几个原因:

一、Lighttpd+FastCGI配置起来比较专业,而Mongrel配置简单

尽管我当初第一次搭建Lighttpd+FastCGI环境没费什么周折,但是我观察到非常多的Ruby程序员很难成功搭建一个Lighttpd+FastCGI的环境出来,很多人连Lighttpd都无法独立的运行起来。这也许是因为很多程序员习惯了Windows开发环境,对于Unix上面通过源代码编译安装的方式过于陌生造成的。而我从97年开始使用Unix,至今已有10年历史,因此搭建这样简单的系统,对我来说不造成什么障碍。

而Mongrel就简单了,gem install mongrel安装完毕,mongrel_rails start启动,哪个人不会?毕竟绝大多数开发人员和部署人员不是高手,他们熟悉哪种方式,自然就会推崇哪种方式。

二、Mongrel可以独立作为Web服务器运行,开发环境和部署环境统一

一般来说,程序员肯定是尽量保持开发环境和部署环境的一致性,避免部署到生产环境出现不测的后果。既然在开发环境熟悉了Mongrel,当然更加愿意在生产环境使用Mongrel,而不愿意碰没有接触过的Lighttpd。

三、Mongrel支持HTTP协议,因此不论监控还是集成其他服务都比较简单,容易玩出更多的花活。

HTTP协议要比FastCGI协议普及的多,因此通过HTTP方式的监控工具,群集管理工具,集成其他服务的工具都是一抓一大把。而支持FastCGI的第三方工具就少得可怜了。你要玩很多花活出来,用FastCGI的话,就难免得自己开发相应的工具,那当然不如使用Mongrel方便啦。

最后,如果你看了这篇文章,想摩拳擦掌的安装一把Lighttpd+FastCGI的话,那么我的这篇文章就是最好的安装指南:

在Linux平台上安装和配置Ruby on Rails详解

分类: 架构 标签:

RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能

2010年1月19日 没有评论

        先声明一下,本人暂时还没有研究ROR,转这篇文章的目的不在于研究ROR,而在于本文的对服务器性能提升的方法.本人用的是Nginx和Apache,这两款服务器也有相应的方案大家可以在网上找找相关资料,大概都是利用Linux的内核功能sendfile直接将数据输入网卡的buffer..

      传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应用程序内存,然后再把内存当中的内容发送给客户端浏览器。这种方式在应付当今大负载网站,音频视频网站力不从心。sendfile是现代操作系统支持的一种高性能网络IO方式,操作系统内核的sendfile调用可以将文件内容直接推送到网卡的buffer当中,从而避免了Web服务器读写文件的开销,实现了“零拷贝”模式。

      作为最流行的轻量级Web服务器的翘楚,lighttpd提供了良好的sendfile支持,JavaEye网站服务器使用的就是lighttpd。在Linux操作系统上面,只需要在lighttpd.conf配置文件如下配置,lighttpd就会使用sendfile方式处理静态资源的下载,效率非常高:

引用
server.network-backend = "linux-sendfile"

      但是在某些情况下,我们却无法直接让lighttpd处理文件的下载,比方说JavaEye网站需要统计帖子附件的下载次数,博客相册的点击次数,比方说需要对下载的文件进行权限的控制,特别是对于一些多用户系统,你不能让用户上传的私密文件被其他用户随便下载到,例如JavaEye圈子的共享文件不能够对圈子外的用户开放下载。因此,文件下载目录千万不能放到public目录下,不能让用户直接通过浏览器的URL地址访问到。在这种情况下,文件下载必须由服务器端应用程序来处理。

      在RoR应用当中,我们可以在controller中使用send_file方法来控制文件的下载。send_file方法将下载的文件以4KB为单位写到一个输出流去。如果我们使用mongrel应用服务器的话,mongrel会在内存当中创建一个StringIO对象,把整个下载文件完整的读入内存,然后再向客户端或者前端的Web服务器写出。如果我们使用fcgi来运行RoR的话,fcgi会直接把输出流的内容向前端的Web服务器写出。

毫无疑问,我们可以看到这种下载处理方式有很大的性能缺陷:

1、当使用mongrel的时候,如果下载文件很大,会导致mongrel内存暴涨!

      mongrel创建一个StringIO对象缓存整个输出内容,我们假设用户下载的是一个100MB的文件,该用户又很喜欢用多线程下载工具,他开了10个线程并发下载,那么mongrel的内存占用会暴涨1GB以上。而且最可怕的是,即使当用户下载结束以后,mongrel的内存都不会迅速回落,而是一直保持如此高的内存占用。这个缺陷非常容易被别有用心的黑客利用,攻击网站。这也是JavaEye网站为什么始终不用mongrel的原因之一。

2、当使用fcgi的时候,如果前端Web服务器没有足够大buffer,会导致fcgi进程被挂住

      fcgi自己不开output buffer,而是实时写出输出内容,如果前端Web服务器用的是lighttpd,那么你很幸运,lighttpd会照单全收,一个字节都不拉下;如果前端Web服务器用的是nginx/apache,那么你很不幸,nginx/apache默认只开8K的buffer,收不下的那就对不起了,您慢点嘞,fcgi进程就被挂住了,只要客户端浏览器下载不结束,fcgi进程就被一直占用。

3、即使使用lighttpd+fcgi,也会对服务器造成不小的性能开销

      lighttpd+fcgi是最理想的Rails部署环境,JavaEye网站使用的就是lighttpd+fcgi。当ruby程序执行send_file开始下载的时候,fcgi会以4KB为单位读入文件内容,然后立刻写出到lighttpd去,而lighttpd照单全收。因此当下载文件被完整的通过fcgi被flush到lighttpd的内存里面去以后,即使你杀掉fcgi进程,都丝毫不会影响文件下载。

      也许你会问,lighttpd都吃下来文件内容,内存会不会暴涨?会的,我们假设同样的用户场景,某用户启动10个线程下载100MB的文件,fcgi进程内存不会发生变化,但是lighttpd会暴涨1GB。但所幸的是lighttpd的内存管理的不错,一旦用户取消下载,或者下载完毕,lighttpd立刻释放掉1GB的内存。

        但是无论怎么说,ruby还是需要完整的读取下载文件,而lighttpd也需要开辟足够大的内存,处理整个文件的下载过程,对服务器开销还是很大的。我们的问题是,能不能让带权限控制的文件下载像lighttpd下载静态资源文件那样快,开销那样小呢?答案就是X-sendfile!

      使用X-sendfile方式,服务器端应用程序不需要读取下载文件了,只需要设置response的header信息就足够了,此外还要附加一个信息“X-LIGHTTPD-send-file”信息给lighttpd,告诉lighttpd,文件下载我就不管了,你自己看着办吧:

Ruby代码
response.headers[‘Content-Type’] = @attachment.content_type  
response.headers[‘Content-Disposition’] = "attachment; filename=\"#{URI.encode(@attachment.filename)}\""   
response.headers[‘Content-Length’] = @attachment.size  
response.headers["X-LIGHTTPD-send-file"] = @attachment.public_filename  
render :nothing => true  

        X-LIGHTTPD-send-file告诉lighttpd,去硬盘的哪个路径找要下载的文件,最后一行啥都不输出了,下载不用ruby来管了。

      而lighttpd收到X-LIGHTTPD-send-file信息以后,就会找到硬盘该文件,以静态资源文件的下载方式处理,丝毫不消耗lighttpd的内存。还是以某用户启动10个线程下载100MB文件为例,10个fcgi进程发送了response信息就处理完毕了,而lighttpd知道下载的是硬盘的静态文件,会以sendfile方式下载,文件内容就会被操作系统内核直接送到网卡的buffer里面,既不消耗ruby进程,也不消耗lighttpd,皆大欢喜。

在lighttpd-1.4.18版本里面,fastcgi方式已经内置X-sendfile支持,仅仅需要你在配置文件打开就可以了:

引用
"allow-x-send-file"="enable"

      JavaEye网站在使用了X-sendfile功能之后,lighttpd的内存占用有明显的下降。未使用X-sendfile之前,lighttpd有时候内存占用会到200MB以上(有用户多线程下载附件),在使用X-sendfile之后,lighttpd的内存占用还从未突破20MB。

最后要提醒大家几个问题:

1、lighttpd-1.4.x不认X-sendfile这个header,只认X-LIGHTTPD-send-file

        按照lighttpd网站自己的文档,以及各种各样流行的X-sendfile文档,设置的header都是X-sendfile,但是经过我们n次失败的摸索,才发现原来必须使用X-LIGHTTPD-send-file,这一点请不要被文档迷惑,目前好像也只有我们提出这个解决办法,互联网上面尚未看到其他人提出过,看来我们又首开先河了。用RoR就是这点好,你动不动就得自己先去当尝螃蟹的那个人。

2、lighttpd-1.5.0版本的X-sendfile设置有所改变

      lighttpd-1.5.0版本还未发布正式版本,据说1.5.0已经认识X-sendfile这个header了,这个大家有兴趣自己测试吧。

原文地址:http://robbin.javaeye.com/blog/154538

分类: 架构 标签:

nginx配置xsendfile提升文件下载性能

2010年1月19日 没有评论

        之前看到了robbin发表的lighttpd x-sendfile的相关文章,感到很实用,而我现在用的是nginx,
于是乎,开始找了一些nginx and x-sendfile的文章,组织和实践一下和大家分享:

NginxXSendfile

发送静态文件使用的是一个叫做X-sendfile的header特性.
nginx当然也有这个特性,但是实现的略微不同,在nginx中叫做X-Accel-Redirect.

有两个特性需要阐述:
1.header 中必须包括URI
2.本地必须声明为 internal,用于内部redirect和X-Accel-Redirect responses。

配置例子:
代码
location /public/ {  
internal;  
root  /项目目录;  
}

应用程序接口:
代码
x_accel_redirect "/项目目录/public", :filename => "iso.img"

这样,nginx将发送/项目目录/public/iso.img 文件。
其他例子:
引用
x_accel_redirect(‘/path/to/image.jpg’, :type => ‘image/jpeg’, :disposition=>’inline’)

rails x_accel_redirect 插件
http://github.com/goncalossilva/X-Accel-Redirect

header还支持如下属性:
代码
X-Accel-Limit-Rate: 1024  
X-Accel-Buffering: yes|no  
X-Accel-Charset: utf-8

分类: 架构 标签:

Nginx 的 X-Sendfile ―― X-Accel-Redirect

2010年1月19日 没有评论

      直接利用Linux内核sendfile将文件向网卡的buffer输入,即不占用应用服务器的内存,又不占用WEB服务器的内存,皆大欢喜,其好处不言而喻啦.
        lighttpd 有一个 X-Sendfile 的特性很有意思。比如传统的做一些需要严格验证的下载之类的功能比如收费下载,需要在程序里验证权限,然后由程序读取文件输出,这样性能不好,占用资源也大,而 web server 本身的功能又不足以提供验证。使用 X-Sendfile 就可以让程序来做验证,而把文件传输交给 web server 来做,各自做各自擅长的事情。

      本来以为这功能目前就 lighttpd 有,今天发现原来 nginx 也有这能力,apache 也可以通过第三方模块来实现。

nginx 上这个功能叫做 X-Accel-Redirect 。

假设下载文件的路径在 /path/to/files,比如有 /path/to/files/test1.txt 可以在 nginx 里配置

location /down {
    internal;
    alias  /path/to/files;
}

internal 选项是这个路径只能在 nginx 内部访问。

然后可以在 php 里写

header("X-Accel-Redirect: /down/test1.txt");

就可以了。

      另外,如果在程序那头如果不想要开头的那个“/”,比如想写成 header("X-Accel-Redirect: down/test1.txt"); ,那么在 nginx 的那条 alias 的最后就要加一个 “/”。

分类: 架构 标签: