APACHE安装笔记
gunguymadman
|
1#
gunguymadman 发表于 2008-12-11 01:56
APACHE安装笔记
摘要:
具体的说明: [url=]WEB应用的容量规划[/url]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/ --shared-module=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:不常用模块全部清除 一般说来,可以不需要的模块包括: #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和JAVAWEB应用的wrapper,此外,从性能上讲:mod_gzip可以减少40%左右的流量,从而减少机器用于传输的负载,而mod_expires可以减少10%左右的重复请求,让重复的用户请求CACHE在本地,根本不向服务器发出请求。 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设置放在另外一个文件中: <IfModule mod_caucho.c> CauchoConfigFile /path/to/apache/conf/resin.conf </IfModule> mod_expires的安装配置: <IfModule mod_expires.c> ExpiresActive on #所有的.gif文件1个月以后过期 ExpiresByType image/gif "access plus 1 month" #所有的文件缺省1天以后过期 ExpiresDefault "now plus 1 day" </IfModule> mod_gzip的安装: /path/to/apache/bin/apxs -i -a -c mod_gzip.c mod_gzip和PHP在一起的配置 <IfModule mod_gzip.c> 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 </IfModule> 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 ... <IFModule mod_gzip.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' </IFModule> 日志轮循工具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核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在 <IfModule mod_name> CONFIGURATIONS.. </IfModule> 里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如: #AddModule mod_gzip.c 就屏蔽了mod_gzip,其他模块不首任何影响。 安装和维护过程:
参考文档: 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 |