即时通讯所采用的协议 不指定

jed , 2008-3-3 10:54 , 服务器技术 , 评论(0) , 阅读(4679) , Via 本站原创
 即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。
   QQ就是使用UDP协议进行发送和接收消息的。当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是客户端(Client)。当你登录OICQ时,你的OICQ作为Client连接到腾讯公司的主服务器上,当你“看谁在线时,你的OICQ又一次作为Client从QQ Server上读取在线网友名单。当你和你的OICQ伙伴进行聊天时,如果你和对方的连接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传送。如果你和对方的连接不是很稳定,QQ服务器将为你们的聊天内容进行中转。其他的即时通信软件原理与此大同小异。

  一、IM技术概念  
IM技术全称Instant Messaging,中文翻译“即时通讯”,它是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,是电子邮件发明以来迅速崛起的在线通讯方式。IM的出现和互联网有着密不可分的关系,IM完全基于TCP/IP网络协议族实现,而TCP/IP协议族则是整个互联网得以实现的技术基础。 最早出现即时通讯协议是IRC(Internet Relay Chat),但是可惜的是它仅能单纯的使用文字、符号的方式通过互联网进行交谈和沟通。随着互连网变得高度发达,即时通讯也变得远不止聊天这么简单,自1996年第一个IM产品ICQ发明后,IM的技术和功能也开始基本成型,语音、视频、文件共享、短信发送等高级信息交换功能都可以在IM工具上实现,于是功能强大的IM软件便足以搭建一个完整的通信交流平台。目前最具代表性的几款的IM通讯软件有MSN、Google Talk、Yahoo、Messenger 、腾讯QQ等。 

 二、IM技术原理和工作方式
 典型的IM工作方式如下:登陆IM通讯中心(IM通讯服务器),获取一个自建立的历史的交流对象列表(好友列表),然后自身标志为在线状态,当好友列表中的某人在任何时候登录上线并试图通过你的计算机联系你时,IM系统会发一个消息提醒你,然后你能与他建立一个聊天会话通道进行各种消息如键入文字、通过语音等的交流,  从技术上来说,IM的基本技术原理如下:
关于网易邮箱的问题,由于网易从去年的11月15日开始不再对新申请的用户开通
POP及SMTP访问, 也不能用163.和126的邮箱进行转发邮件.
> 所以新邮箱用户视图用POP及SMTP访问时,会得到没有权限的错误信息,根据余

网友的经验,
> 可以用以下地址在把网易邮箱(只限163.com和126.com的)升级到3G空间的同时

开通POP及SMTP访问,

> 具体地址如下,升级请按照页面提示进行即可:
> http://uinfo.mail.163.com/enlarge3g/index.htm
网页上只有升级成功的提示,成功以后,再按照网易邮箱关于POP及SMTP访问的帮助设置客户端即可,
关于POP及SMTP访问的帮助在:
http://mail.163.com/help/help_client_04.htm 163.com的
http://www.126.com/help/client_04.htm 126.com的

APACHE安装笔记 晴

jed , 2007-4-25 09:17 , 服务器技术 , 评论(0) , 阅读(6965) , Via 本站原创
简化安装==>性能调优==>方便维护的角度,讨论WEB服务的规划==>HTTPD安装/应用模块配置==>升级/维护等过程。
让APACHE的升级和PHP RESIN等应用模块的升级完全互不影响。

摘要:

WEB应用容量规划:根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式;
APACHE安装过程:apache的通用的简化安装选项,方便以后的应用的模块化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===将原来的 HARD_SERVER_LIMIT 256 后面加个“0”
apache编译:
/path/to/apache_src/configure --prefix=/another_driver/apache --enable-shared=max --enable-module=most
可选应用模块/工具的安装:php resin mod_gzip mod_expire及各个模块之间的配合;
PHP安装:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --enable-track-vars --with-other-modules-you-need
mod_resin安装:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
Mod_gzip安装:
/path/to/apache/bin/apxs -i -a -c mod_gzip.c
工具:cronolog安装:http://www.cronolog.org ;
升级/维护:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;
按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。
系统安装:系统管理员的职责就是安装系统=>安装好一台可以适应任何情况的APACHE,然后COLON,
应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
系统升级:系统管理员:升级系统/升级APACHE
应用升级:系统管理员:升级应用模块
具体的说明:

WEB应用的容量规划

APACHE主要是一个内存消耗型的服务应用,我个人总结的经验公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5

为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统崩溃。此外,同样的服务:2G内存的机器的apache_max_process一般只设置到1G内存的1.7倍,因为APACHE本身会因为管理更多的进程而产生性能下降。

例子1:
一个apache + mod_php的服务器:一个apache进程一般需要4M内存
因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
apache_max_process = 500 * 1.5 = 750
所以规划你的应用让服务尽量跑在500个APACHE以下,并设置APACHE的软上限在800个。

例子2:
一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存
在一个2G内存的机器上: apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
因此:apache_max_process = 2000 * 1.5 = 3000

以上估算都是按小文件服务估算的(一个请求一般大小在20k以下)。对于文件下载类型站点,可能还会受其他因素:比如带宽等的影响。

APACHE安装过程

服务器个数的硬上限HARD_SERVER_LIMIT的修改:
在FREEBSD和LINUX等UNIX操作系统下APACHE缺省的最大进程数是256个,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560  <===将原来的HARD_SERVER_LIMIT 256 后面加个“0”
#endif
#endif

解释:
APACHE缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降,现在大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了,而且APACHE的软上限max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服务器内存大于256M,都应该调高APACHE的HARD_SERVER_LIMIT。根据个人的经验:2560已经可以满足大部分小于2G内存的服务器的容量规划了(APACHE的软上限的规划请看后面)。

APACHE的编译:通用的编译选项能使安装过程标准化
./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=most

解释:
--prefix=/another_driver/apache/: 一个系统使用寿命最低的一般就是硬盘,因此:将服务数据和系统完全分开,不仅能提高了数据的访问速度,更重要的,大大方便系统升级,备份和恢复。

--shared-module=max:使用动态加载方式会带来5%的性能下降,但和带来的好处相比更本不算什么:比如模块升级方便,系统升级风险降低,安装过程标准化

--enable-module=most:用most可以将一些不常用的module编译进来,比如后面讲到的mod_expire是就不在apache的缺省常用模块中

如果不想build so, 也可以这样:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"

但结果会发现,这样编译对服务性能只能有微小的提高(5%左右),但却失去了以后系统升级和模块升级的灵活性,无论是模块还是APACHE本身升级都必须把所有SOURCE加在一起重新编译。

apache的缺省配置文件一般比较大:我们可以使用去掉注释的方法精简一下:然后再进入具体的培植过程能让你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf

需要修改的通用项目有以下几个:

#服务端口,缺省是8080,建议将整个APACHE配置调整好后再将服务端口改到正式服务的端口
Port 8080 => 80

#服务器名:缺省没有
ServerName name.example.com

#最大服务进程数:根据服务容量预测设置
MaxClients 256 => 800

#缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以
StartServers 5 => 200

不要修改:
以前有建议说修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200

但从我的经验看来:缺省值已经是非常优化的了,而且让APACHE自己调整进程个数还是比较好的。

特别修改:
在solaris或一些比较容易出现内存泄露的应用上:
MaxRequestsPerChild 0 =>3000

应用模块和工具的安装配置:

由于使用模块动态加载的模式,所以可以方便的通过简单的配置调整来把APACHE定制成你需要的:最好把不常用模块全部清除(无论处于安全还是效率)。
比如:对于静态页面服务器:就什么模块都不加载,对于PHP应用就加上PHP模块,对于JAVA应用就把RESIN模块加载上。而且各种模块的插拔非常简单。


一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includes_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是APACHE安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全校验可以大大提高访问速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so

最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so

可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so


常用的模块:
最常用的可能就是php和JAVA WEB应用的wrapper,此外,从性能上讲:mod_gzip可以减少40%左右的流量,从而减少机器用于传输的负载,而mod_expires可以减少10%左右的重复请求,让重复的用户请求CACHE在本地,根本不向服务器发出请求。

建议将所有MODULE的配置都放到

PHP的安装:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php

resin的安装设置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs

一般将具体的resin设置放在另外一个文件中:

CauchoConfigFile /path/to/apache/conf/resin.conf


mod_expires的安装配置:

ExpiresActive on
#所有的.gif文件1个月以后过期
ExpiresByType image/gif "access plus 1 month"
#所有的文件缺省1天以后过期
ExpiresDefault "now plus 1 day"


mod_gzip的安装:
/path/to/apache/bin/apxs -i -a -c mod_gzip.c


mod_gzip和PHP在一起的配置

mod_gzip_on Yes
mod_gzip_minimum_file_size 1000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file \.htm$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.php3$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
#不要让mod_gzip和php的session使用同一个临时目录:php_session需要通过php.ini设置session.save_path = /tmp/php_sess
mod_gzip_temp_dir /tmp/mod_gzip
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No

mod_gzip和mod_php的配合:不要让mod_gzip和mod_php使用同一个临时目录;

mod_gzip和RESIN配合:要让mod_gzip在mod_caucho后LOAD,否则mod_gzip不起作用
...othr modules
AddModule mod_so.c
AddModule mod_caucho.c
#notice: mod_gzip must load after mod_caucho
AddModule mod_gzip.c
AddModule mod_expires.c
...


mod_gzip_on Yes
mod_gzip_dechunk yes
mod_gzip_keep_workfiles No
mod_gzip_minimum_file_size 3000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file \.html$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
mod_gzip_item_include handler 'caucho-request'


日志轮循工具cronolog的安装和设置:cronolog可以非常整齐的将日志按天轮循存储
缺省编译安装到/usr/local/bin/下,只需要将配置改成:

CustomLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log" combined

日志将按天截断并存放在以weekday为目录名的目录下:比如:log/1是周一,log/5是周五, log/0是周日

升级维护:

由于使用标准化的DSO模式安装APACHE,APACHE的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在

CONFIGURATIONS..

里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,其他模块不首任何影响。

安装和维护过程:

系统安装:系统管理员的职责就是安装系统和一个可以适应任何情况的APACHE,然后COLON。
应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
系统升级:系统管理员:升级系统/升级APACHE
应用升级:应用管理员:升级应用模块
系统备份/恢复:如果APACHE不在缺省的系统盘上,只需要将APACHE目录备份就可以了,遇到系统分区的硬件问题直接使用预先准备好的系统COLON,直接将APACHE所在物理盘恢复就行了。
系统管理员:APACHE的最简化安装 OS + APACHE(httpd core only)
应用管理员:应用模块定制   +so
+php
+so
+caucho
+ssl
应用: 纯静态页面服务:
image.example.com
www.example.com bbs.example.com mall.example.com

 

参考文档:

Apache
http://httpd.apache.org

php
http://www.php.net

Resin
http://www.caucho.com

mod_gzip
http://www.remotecommunications.com/apache/mod_gzip/

Cronolog
http://www.cronolog.org

mod_expires
http://httpd.apache.org/docs/mod/mod_expires.html
选择prefork还是worker可以在编译时使用–with-mpm=MPM参数指定,默认为prefork,
prefork
prefork采用预派生子进程方式,用单独的子进程来处理 不同的请求,进程之间彼此独立。在make编译和make install安装后,使用httpd -l来确定当前使用的MPM是prefork.c。查看httpd-mpm.conf配置文件,里面包含如下默认的配置段:

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0

prefork 控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。 MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。ServerLimit指令无须重编译Apache就可以加大MaxClients。

ServerLimit  10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 10000
MaxRequestsPerChild 0


Worker
相对于prefork,worker全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。在configure –with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd-mpm.conf中有以下默认配置段:

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。 ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。

ServerLimit 25
ThreadLimit 200
StartServers 3
MaxClients 2000
MinSpareThreads 50
MaxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 0

下面是利用Apache自带的测试工具ab对Server进行测试的情况(设定请求的index页面为6bytes),cpu%为cpu占用率,mem为内存使用量(M为单位),RequestsPerSecond为每秒处理的请求数。
1、Prefor方式
  (ServerLimit,StartServer,MinSpareServers,MaxSpareServers,MaxClients,MaxRequestPerChild)            

 



   
       
           
       
   

           
               
                   
                       
                       
                       
                       
                   
                   
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
                   
                       
                       
                       
                       
                   
               
           
-n/-c(ab参数)Cpu%Mem
                       
Requestspersecond

                       
(-,5,5,10,150,0)
100000/10028.82858434
100000/20029.23048032
100000/50025.33237348
100000/100024.43305886
(10000,5,5,10,500,0)
100000/10028.73718345
100000/20027.43897929
100000/50024.94177229
100000/100023.44376676
(10000,5,5,10,1000,0)
100000/10028.84088517
100000/20027.04228045
100000/50024.24557236
100000/100022.54706570
(10000,5,5,10,1500,0)
100000/10029.63308407
100000/20028.13498014
100000/50026.43807290
100000/100024.04006686

           

2、Worker方式
(ServerLimt,Threadlimt,Startservers,MaxClients,MinspareThread,MaxspareThread,ThreadperChild,MaxRequestPerChild)
                   

 



   
       
           
           
           
           
       
       
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
           
           
           
       
       
           
           
           
           
       
   
-n/-c(ab参数)cpu%memRequestsperSecond
(50,500,5,10000,50,200,200,0)
100000/100 18.61886020
100000/20020.11955892
100000/50019.82095708
100000/100022.22186081
(100,500,5,10000,50,200,100,0)
100000/100 24.52406919
100000/20023.62476798
100000/50024.62546827
100000/100022.32716114
(200,500,5,10000,50,200,50,0)
100000/100 27.33017781
100000/20027.43077789
100000/50026.03207141
100000/100021.83446110

相对来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

 Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。相比于Apache 1.3,2.0版本做了大量的优化来提升处理能力和可伸缩性,并且大多数改进在默认状态下即可生效。但是在编译和运行时刻,2.0也有许多可以显著提高性能的选择。本文不想叙述那些以功能换取速度的指令,如HostnameLookups等,而只是说明在2.0中影响性能的最核心特性:MPM(Multi -Processing Modules,多道处理模块)的基本工作原理和配置指令。

  毫不夸张地说,MPM的引入是Apache 2.0最重要的变化。大家知道,Apache是基于模块化的设计,而Apache 2.0更扩展了模块化设计到Web服务器的最基本功能。服务器装载了一种多道处理模块,负责绑定本机网络端口、接受请求,并调度子进程来处理请求。扩展模块化设计有两个重要好处:

  ◆ Apache可以更简洁、有效地支持多种操作系统;

  ◆ 服务器可以按站点的特殊需要进行自定制。

  在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中。

  指定MPM的方法

  下面以Red Hat Linux 9为平台,说明在Apache 2.0中如何指定MPM (Apache采用2.0.45)。先解压缩源代码包httpd-2.0.45.tar.gz,生成httpd-2.0.45目录(Apache 1.3源代码包的命名规则是apache_1.3.NN.tar.gz,而2.0版则是httpd-2.0.NN.tar.gz,其中NN是次版本号)。

  进入httpd-2.0.45目录,运行以下代码:

 $ ./configure --help|grep mpm



  显示如下:

--with-mpm=MPM
Choose the process model for Apache to use.
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}



  上述操作用来选择要使用的进程模型,即哪种MPM模块。Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM, perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程。这在运行多个需要CGI的虚拟主机时特别有用,会比1.3版中的SuExec 机制做得更好。leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 Apache官方也并不推荐使用。因此,我们主要阐述prefork和worker这两种和性能关系最大的产品级MPM ( 有关其它的MPM详细说明,请参见Apache官方文档:http://httpd.apache.org/docs-2.0/mod/)

  prefork的工作原理及配置

  如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。

  若使用prefork,在make编译和make install安装后,使用“httpd -l”来确定当前使用的MPM,应该会看到prefork.c(如果看到worker.c说明使用的是worker MPM,依此类推)。再查看缺省生成的httpd.conf配置文件,里面包含如下配置段:


StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0




  prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。

  MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。

  MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:

  ◆ 可防止意外的内存泄漏;

  ◆ 在服务器负载下降的时侯会自动减少子进程数。

  因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。

  MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。如果把这个值设为大于256,那么 Apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把256改为要增大的值(如4000),然后重新编译Apache即可。在Apache 2.0中新加入了ServerLimit指令,使得无须重编译Apache就可以加大MaxClients。下面是笔者的prefork配置段:


StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000




  上述配置中,ServerLimit的最大值是20000,对于大多数站点已经足够。如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可:

#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 20000



  worker的工作原理及配置

  相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。

  在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:


StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0




  worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

  MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

  ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

#define DEFAULT_THREAD_LIMIT 64
#define MAX_THREAD_LIMIT 20000



  这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。

  Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:

#define DEFAULT_SERVER_LIMIT 16
#define MAX_SERVER_LIMIT 20000



  需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是笔者的 worker配置段:


StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0




  通过上面的叙述,可以了解到Apache 2.0中prefork和worker这两个重要MPM的工作原理,并可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。



Apache性能优化 不指定

jed , 2007-4-20 17:04 , 服务器技术 , 评论(0) , 阅读(5156) , Via 本站原创
Tunning Apache

Apache几目前Internet上使用最为广泛的Web服务器。它具有比商业Web服务器不遑多让的功能与速度,同时安装与设置也十分简单,正是这些特性让它成为市场占有率最高的Web服务器软件。不过Apache安装简单,并不意味着简单地安装就可以适用于绝大多数应用环境,在高负荷的Web站点,Apache还需要进行调整、优化......

优化方法

Apache的配置文件是httpd.conf。Windows下该文件位于Apache安装目录的Conf子目录下,RedHat Enterprise Linux AS 3.0 Update 2位于/etc/httpd/conf。通过调整该文件的某些参数,可以优化Apache的运行效率。

为了验证后文Apache参数的调整是否起作用,我们通常用Apache附带的ab(Apache Bench)对其进行压力测试。

ab最常用的语法格式是这样的:

ab -n XXX -c YYY -k http://hostname.port/path/filename

其中:

-n XXX:
表示最多进行XXX次测试。也就是下载filename文件XXX次。

-c YYY:
客户端并发连接个数。

-k:    
启用HTTP KeepAlive功能。默认不启用KeepAlive功能。

针对Web服务器总体优化 不指定

jed , 2007-4-20 16:57 , 服务器技术 , 评论(0) , 阅读(3888) , Via 本站原创
一、文件系统
  在fstab里加入noatime,如
  #cat /etc/fstab
  /dev/sda1          /home                  ext3    noatime,defaults        1 2
  reboot或者重新mount生效
  二、Tcp优化
  在/etc/sysctl.conf里加入
  net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 3
  net.ipv4.tcp_syncookies = 1 #启用syncookies
          net.ipv4.tcp_max_syn_backlog = 8192 #定义backlog队列容纳的最大半连接数
  net.ipv4.tcp_fin_timeout = 30
  net.ipv4.tcp_keepalive_time = 1800
  net.ipv4.tcp_window_scaling = 0
  net.ipv4.tcp_sack = 0
  net.ipv4.tcp_timestamps = 0
  [color=blue:b6bef7e40f]老实说,对于sysctl.conf究竟能不能用起来还真不知道,因为我是没用起来,虽然内核里面是支持的 = =b[/color:b6bef7e40f]

  三、虚拟内存优化
  /etc/sysctl.conf
  vm.lower_zone_protection = 100

  四、I/O调度器
  在grub.conf的相应启动选项里加入elevator=deadline,如:
  kernel /vmlinuz-2.6.6 ro root=/dev/sda6 elevator=deadline
  这里用了Deadline的I/O调度器,它比系统默认的AnticipatoryI/O调度器更为小巧,在数据吞吐量非常大的数据库系统中表现得更有优势。

  五、内核源代码参数修改
  修改/usr/src/linux/include/linux/posix_types.h
  #define __FD_SETSIZE 1024  65536  
  设置fd_set支持的最大数量
    
  修改/usr/src/linux/include/linux/fs.h
  #define INR_OPEN 1024  65536
  #define NR_FILE 8192  65536
  #define NR_RESERVED_FILES 10  128
  设置最大打开文件数量(TCP连接数量)

  修改/usr/src/linux/include/net/tcp.h
  #define TCP_TIMEWAIT_LEN (60*HZ)  1*HZ
  #define TCP_SYNACK_RETRIES  5  3  
  设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上
  也是减少重试时间

  make menuconfig中,去掉没用的选项,打开以下选项的开关:
  High Memory Support (支持4GB以上内存)
  Symmetric multi-processing support (支持多CPU)
  TCP syncookie support (可以防DOS)
  设置文件打开数等的其他方法(好处就是可以不重新编译内核)
  在 /etc/init.d/sshd里加入(统一加在. /etc/rc.d/init.d/functions行后面)
  [code:1:b6bef7e40f]ulimit -n 65535 >/dev/null 2>&1
  ulimit -u 16384 >/dev/null 2>&1[/code:1:b6bef7e40f]
  重起sshd:nohup /etc/init.d/sshd restart &
  BTW:其实limits.conf不好,因为他需要root su - user遗传给普通用户
  如果直接远程登陆是没效果的

  六、apache
  1、安装:采用worker线程工作模式
  [code:1:b6bef7e40f]./configure --prefix=/prefix  
  --enable-mods-shared=all  
  --enable-deflate  
  --with-mpm=worker[/code:1:b6bef7e40f][color=blue:b6bef7e40f]chmod +s /prefix/bin/httpd [/color:b6bef7e40f]#允许普通用户也可以启动apache
  2、配置:httpd.conf
  [code:1:b6bef7e40f]Timeout 60
  KeepAlive On
  MaxKeepAliveRequests 150
  KeepAliveTimeout   5

  StartServers         3
  MaxClients         3200   #支持3200个客户端哦
  ServerLimit        32
  MinSpareThreads     50
  MaxSpareThreads     250
  ThreadLimit   200
  ThreadsPerChild     100
  MaxRequestsPerChild 0

  #上面的几个参数对机器要求比较高,如果是比较差的机器,每台机1000个连接最多了,你可能要重新设置参数,我的机器是DELL 2850

  UseCanonicalName Off
  HostnameLookups Off
  ServerSignature Off[/code:1:b6bef7e40f]

  备注:
  要apache支持3200个客户端,默认最大支持1024(64*16)个客户端,所以必须修改apache的源代码树下的server/mpm/worker/worker.c
  把 #define DEFAULT_THREAD_LIMIT 64  --> 128 #每个子进程中包含的线程数
     #define DEFAULT_SERVER_LIMIT 16  -->  32  #最大的子进程总数

  注意,不要把这两个值设得太高,超过系统的处理能力,那就事与愿违了
  现在我的机子能承受每天350W的访问量,高峰期的load最多到2左右

  Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients

  大家可以根据自己的实际情况调试一下的。祝大家愉快。   :)


Apache 1.3 限制并发连接 晴

jed , 2007-4-19 08:27 , 服务器技术 , 评论(0) , 阅读(3739) , Via 本站原创
Apache 1.3 限制并发连接



由于网站内容有很多下载,而大家一般使用flasget下载,一般使用多线程,同时有很多人在大量下载资料的话,就会形成并发连接饱和,后面的人就无法下载使用了。

这个问题一直困扰我们。

解决的思路应该有两个方面,一个是限制单ip的并发连接。一个是增加服务器并发连接的容量。目前服务器默认是1024个连接,还不会增加。

关于限制并发的问题,经过多次测试,基本解决了apache 1.3 限制并发连接的问题。

http://www.gknw.net/development/apache/apache-1.3/win32/modules/

从这里下载:

mod_limitipconn-0.04-w32.zip

解压后,其中 有些说明文件。

有 mod_limitipconn.so 文件,拷贝文件到 apache 的 modules 目录下。



1、编辑  httpd.conf

在相应位置,增加

LoadModule limitipconn_module modules/mod_limitipconn.so

AddModule mod_limitipconn.c



2、在AddModule mod_limitipconn.c 后面,即增加 mod设置:

# Configuration for mod_limitipconn

<IfModule mod_limitipconn.c>

   <Location /somewhere>

        MaxConnPerIP 3

        # exempting images from the connection limit is often a good

        # idea if your web page has lots of inline images, since these

        # pages often generate a flurry of concurrent image requests

        NoIPLimit image/*

   </Location>



   <Location /mp3>

        MaxConnPerIP 1

       # In this case, all MIME types other than audio/mpeg and video*

        # are exempt from the limit check

        OnlyIPLimit audio/mpeg video

   </Location>

</IfModule>

# End of mod_limitipconn.



3、设置

ExtendedStatus On



4、在这里一般以为就可以了,结果出现严重错误,apache无法启动。

错误是:

The Apache service named D:\Server\Apache\Apache.exe reported the following error:

>>> Invalid command 'ExtendedStatus', perhaps mis-spelled or defined by a module not included in the server configuration <<<

before the error.log file could be opened.

More information may be available in the error.log file.   .



通过搜索,发现是因为mod_status模块 没有加载的缘故。

通过loadModule 和 downmodule 加载 mod_status模块。

重新启动apahce,解决问题。



5、如果要看 access文件,可以修改:

# Optional supress logging of denied access

CustomLog logs/access_log common env=!LIMITIP



6、控制特殊文件的下载:

AddType application/x-rar .rar .iso #添加自定义minetype,控制iso和rar的下载



< IfModule mod_limitipconn.c >
< Location / >
MaxConnPerIP 5
NoIPLimit image/*
< /Location >

< Location /upload >
MaxConnPerIP 1 #upload文件夹限制下载
OnlyIPLimit audio/mpeg video/* application/x-rar #只对音频视频文件,自定义 minetype文件起作用
< / Location >
< / IfModule >

apache如何限制用户线程数? 晴

jed , 2007-4-17 08:48 , 服务器技术 , 评论(0) , 阅读(4008) , Via 本站原创
限制客户端一个IP同时连接数,实际应用:限制flashget,网络蚂蚁等软件只有2个进程有效

apache如何限制用户线程数?

限制客户端一个IP同时连接数,实际应用:限制flashget,网络蚂蚁等软件只有2个进程有效。
(注释:/opt/httpd/是我的apache的安装目录,大家可以自行改成自己的路径)

首先,从http://dominia.org/djao/下载mod_limitipconn-0.22.tar.gz
上传解压后运行

#/opt/httpd/bin/apxs -c -i -a mod_limitipconn.c 将此外部DSO模块编译入Apache

检查/opt/httpd/modules是否有mod_limitipconn.so模块

配置apache配置文件,找到相应位置,如下:
LoadModule limitipconn_module modules/mod_limitipconn.so
#


 MaxConnPerIP 2


并将#ExtendedStatus On的注释去掉

重启Apache,检查是否可限制单一IP多个并发连接

测试效果,用flashget下载,默认是5个蚂蚁,只有2个可以连接并进行下载,其他的3个始终连接不上!--成功!!!
分页: 32/39 第一页 上页 27 28 29 30 31 32 33 34 35 36 下页 最后页 [ 显示模式: 摘要 | 列表 ]