<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[APACHE安装笔记]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Wed, 25 Apr 2007 01:17:47 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	简化安装==>性能调优==>方便维护的角度，讨论WEB服务的规划==>HTTPD安装/应用模块配置==>升级/维护等过程。<br/>让APACHE的升级和PHP RESIN等应用模块的升级完全互不影响。<br/><br/>摘要：<br/><br/>WEB应用容量规划：根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式； <br/>APACHE安装过程：apache的通用的简化安装选项，方便以后的应用的模块化配置；<br/>修改 HARD_SERVER_LIMIT：<br/>vi /path/to/apache_src/src/include/httpd.h<br/>#define HARD_SERVER_LIMIT 2560 <===将原来的 HARD_SERVER_LIMIT 256 后面加个“0”<br/>apache编译：<br/>/path/to/apache_src/configure --prefix=/another_driver/apache --enable-shared=max --enable-module=most <br/>可选应用模块/工具的安装：php resin mod_gzip mod_expire及各个模块之间的配合；<br/>PHP安装：<br/>/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --enable-track-vars --with-other-modules-you-need<br/>mod_resin安装：<br/>/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs <br/>Mod_gzip安装：<br/>/path/to/apache/bin/apxs -i -a -c mod_gzip.c<br/>工具：cronolog安装：<a href="http://www.cronolog.org" target="_blank">http://www.cronolog.org</a> ;<br/>升级/维护：看看通用和模块化的安装过程如何简化了日常的升级/维护工作；<br/>按照以上的方法：系统管理员和应用管理员的职责可以清楚的分开，互相独立。<br/>系统安装：系统管理员的职责就是安装系统=>安装好一台可以适应任何情况的APACHE，然后COLON，<br/>应用安装：由应用管理员负责具体应用所需要的模块并设置HTTPD。<br/>系统升级：系统管理员：升级系统/升级APACHE<br/>应用升级：系统管理员：升级应用模块 <br/>具体的说明：<br/><br/>WEB应用的容量规划<br/><br/>APACHE主要是一个内存消耗型的服务应用，我个人总结的经验公式：<br/>apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2<br/>apache_max_process = apache_max_process_with_good_perfermance * 1.5<br/><br/>为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢？原因是在低负载下系统可以使用更多的内存用于文件系统的缓存，从而进一步提高单个请求的响应速度。在高负载下，系统的单个请求响应速度会慢不少，而超过apache_max_process，系统会因为开始使用硬盘做虚拟内存交换空间而导致系统崩溃。此外，同样的服务：2G内存的机器的apache_max_process一般只设置到1G内存的1.7倍，因为APACHE本身会因为管理更多的进程而产生性能下降。<br/><br/>例子1：<br/>一个apache + mod_php的服务器：一个apache进程一般需要4M内存<br/>因此在一个1G内存的机器上：apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500<br/>apache_max_process ＝ 500 * 1.5 = 750<br/>所以规划你的应用让服务尽量跑在500个APACHE以下，并设置APACHE的软上限在800个。<br/><br/>例子2：<br/>一个apache + mod_resin的服务器： 一个apache进程一般需要2M内存<br/>在一个2G内存的机器上： apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000<br/>因此：apache_max_process ＝ 2000 * 1.5 = 3000<br/><br/>以上估算都是按小文件服务估算的（一个请求一般大小在20k以下）。对于文件下载类型站点，可能还会受其他因素：比如带宽等的影响。<br/><br/>APACHE安装过程<br/><br/>服务器个数的硬上限HARD_SERVER_LIMIT的修改：<br/>在FREEBSD和LINUX等UNIX操作系统下APACHE缺省的最大进程数是256个，需要修改apache_1.3.xx/src/include/httpd.h<br/>#ifndef HARD_SERVER_LIMIT<br/>#ifdef WIN32<br/>#define HARD_SERVER_LIMIT 1024<br/>#elif defined(NETWARE)<br/>#define HARD_SERVER_LIMIT 2048<br/>#else<br/>#define HARD_SERVER_LIMIT 2560 &nbsp;<===将原来的HARD_SERVER_LIMIT 256 后面加个“0”<br/>#endif<br/>#endif<br/><br/>解释：<br/>APACHE缺省的最大用户数是256个：这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置，但随着内存成本的急剧下降，现在大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了，而且APACHE的软上限max_client是受限于HARD_SERVER_LIMIT的，因此如果WEB服务器内存大于256M，都应该调高APACHE的HARD_SERVER_LIMIT。根据个人的经验：2560已经可以满足大部分小于2G内存的服务器的容量规划了（APACHE的软上限的规划请看后面）。<br/><br/>APACHE的编译：通用的编译选项能使安装过程标准化<br/>./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=most<br/><br/>解释：<br/>--prefix=/another_driver/apache/： 一个系统使用寿命最低的一般就是硬盘，因此：将服务数据和系统完全分开，不仅能提高了数据的访问速度，更重要的，大大方便系统升级，备份和恢复。<br/><br/>--shared-module=max：使用动态加载方式会带来5%的性能下降，但和带来的好处相比更本不算什么：比如模块升级方便，系统升级风险降低，安装过程标准化<br/><br/>--enable-module=most：用most可以将一些不常用的module编译进来，比如后面讲到的mod_expire是就不在apache的缺省常用模块中<br/><br/>如果不想build so, 也可以这样:<br/>./configure &#92;<br/>"--with-layout=Apache" &#92;<br/>"--prefix=/path/to/apache" &#92;<br/>"--disable-module=access" &#92;<br/>"--disable-module=actions" &#92;<br/>"--disable-module=autoindex" &#92;<br/>"--disable-module=env" &#92;<br/>"--disable-module=imap" &#92;<br/>"--disable-module=negotiation" &#92;<br/>"--disable-module=setenvif" &#92;<br/>"--disable-module=status" &#92;<br/>"--disable-module=userdir" &#92;<br/>"--disable-module=cgi" &#92;<br/>"--disable-module=include" &#92;<br/>"--disable-module=auth" &#92;<br/>"--disable-module=asis"<br/><br/>但结果会发现，这样编译对服务性能只能有微小的提高（5%左右），但却失去了以后系统升级和模块升级的灵活性，无论是模块还是APACHE本身升级都必须把所有SOURCE加在一起重新编译。<br/><br/>apache的缺省配置文件一般比较大：我们可以使用去掉注释的方法精简一下：然后再进入具体的培植过程能让你更快的定制出你所需要的。<br/>grep -v "#" httpd.conf.default >httpd.conf<br/><br/>需要修改的通用项目有以下几个：<br/><br/>#服务端口，缺省是8080，建议将整个APACHE配置调整好后再将服务端口改到正式服务的端口<br/>Port 8080 => 80<br/><br/>#服务器名：缺省没有<br/>ServerName name.example.com<br/><br/>#最大服务进程数：根据服务容量预测设置<br/>MaxClients 256 => 800<br/><br/>#缺省启动服务后的服务进程数：等服务比较平稳后，按平均负载下的httpd个数设置就可以<br/>StartServers 5 => 200<br/><br/>不要修改：<br/>以前有建议说修改：<br/>MinSpareServers 5 => 100<br/>MaxSpareServers 10 => 200<br/><br/>但从我的经验看来：缺省值已经是非常优化的了，而且让APACHE自己调整进程个数还是比较好的。<br/><br/>特别修改：<br/>在solaris或一些比较容易出现内存泄露的应用上：<br/>MaxRequestsPerChild 0 =>3000<br/><br/>应用模块和工具的安装配置：<br/><br/>由于使用模块动态加载的模式，所以可以方便的通过简单的配置调整来把APACHE定制成你需要的：最好把不常用模块全部清除（无论处于安全还是效率）。<br/>比如：对于静态页面服务器：就什么模块都不加载，对于PHP应用就加上PHP模块，对于JAVA应用就把RESIN模块加载上。而且各种模块的插拔非常简单。<br/><br/><br/>一般说来，可以不需要的模块包括：<br/>#LoadModule env_module libexec/mod_env.so<br/>#LoadModule negotiation_module libexec/mod_negotiation.so<br/>#LoadModule status_module libexec/mod_status.so<br/>#server side include已经过时了<br/>#LoadModule includes_module libexec/mod_include.so<br/>#不需要将没有缺省index文件的目录下所有文件列出<br/>#LoadModule autoindex_module libexec/mod_autoindex.so<br/>#尽量不使用CGI：一直是APACHE安全问题最多的地方<br/>#LoadModule cgi_module libexec/mod_cgi.so<br/>#LoadModule asis_module libexec/mod_asis.so<br/>#LoadModule imap_module libexec/mod_imap.so<br/>#LoadModule action_module libexec/mod_actions.so<br/>#不使用安全校验可以大大提高访问速度<br/>#LoadModule access_module libexec/mod_access.so<br/>#LoadModule auth_module libexec/mod_auth.so<br/>#LoadModule setenvif_module libexec/mod_setenvif.so<br/><br/>最好保留的有：<br/>#用于定制log格式<br/>LoadModule config_log_module libexec/mod_log_config.so<br/>#用于增加文件应用的关联<br/>LoadModule mime_module libexec/mod_mime.so<br/>#用于缺省index文件：index.php等<br/>LoadModule dir_module libexec/mod_dir.so<br/><br/>可用可不用的有：<br/>#比如：需要在~/username/下调试php可以将<br/>LoadModule userdir_module libexec/mod_userdir.so<br/>#比如：需要将以前的URL进行转向或者需要使用CGI script-alias<br/>LoadModule alias_module libexec/mod_alias.so<br/><br/><br/>常用的模块：<br/>最常用的可能就是php和JAVA WEB应用的wrapper，此外，从性能上讲：mod_gzip可以减少40%左右的流量，从而减少机器用于传输的负载，而mod_expires可以减少10%左右的重复请求，让重复的用户请求CACHE在本地，根本不向服务器发出请求。<br/><br/>建议将所有MODULE的配置都放到<br/><br/>PHP的安装：<br/>/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-need<br/>需要修改的配置：<br/>AddType application/x-httpd-php .php .php3 .any_file_in_php<br/><br/>resin的安装设置：<br/>/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs <br/><br/>一般将具体的resin设置放在另外一个文件中：<br/><IfModule mod_caucho.c><br/>CauchoConfigFile /path/to/apache/conf/resin.conf<br/></IfModule><br/><br/>mod_expires的安装配置：<br/><IfModule mod_expires.c> <br/>ExpiresActive on<br/>#所有的.gif文件1个月以后过期<br/>ExpiresByType image/gif "access plus 1 month"<br/>#所有的文件缺省1天以后过期<br/>ExpiresDefault "now plus 1 day"<br/></IfModule><br/><br/>mod_gzip的安装：<br/>/path/to/apache/bin/apxs -i -a -c mod_gzip.c<br/><br/><br/>mod_gzip和PHP在一起的配置<br/><IfModule mod_gzip.c><br/>mod_gzip_on Yes<br/>mod_gzip_minimum_file_size 1000<br/>mod_gzip_maximum_file_size 300000 <br/>mod_gzip_item_include file &#92;.htm$<br/>mod_gzip_item_include file &#92;.html$<br/>mod_gzip_item_include file &#92;.php$<br/>mod_gzip_item_include file &#92;.php3$<br/>mod_gzip_item_include mime text/.*<br/>mod_gzip_item_include mime httpd/unix-directory <br/>#不要让mod_gzip和php的session使用同一个临时目录：php_session需要通过php.ini设置session.save_path = /tmp/php_sess<br/>mod_gzip_temp_dir /tmp/mod_gzip<br/>mod_gzip_dechunk Yes<br/>mod_gzip_keep_workfiles No<br/></IfModule><br/>mod_gzip和mod_php的配合：不要让mod_gzip和mod_php使用同一个临时目录；<br/><br/>mod_gzip和RESIN配合：要让mod_gzip在mod_caucho后LOAD，否则mod_gzip不起作用<br/>...othr modules<br/>AddModule mod_so.c<br/>AddModule mod_caucho.c<br/>#notice: mod_gzip must load after mod_caucho<br/>AddModule mod_gzip.c<br/>AddModule mod_expires.c<br/>...<br/><br/><IFModule mod_gzip.c><br/>mod_gzip_on Yes<br/>mod_gzip_dechunk yes<br/>mod_gzip_keep_workfiles No<br/>mod_gzip_minimum_file_size 3000<br/>mod_gzip_maximum_file_size 300000 <br/>mod_gzip_item_include file &#92;.html$<br/>mod_gzip_item_include mime text/.*<br/>mod_gzip_item_include mime httpd/unix-directory<br/>mod_gzip_item_include handler 'caucho-request'<br/></IFModule><br/><br/>日志轮循工具cronolog的安装和设置：cronolog可以非常整齐的将日志按天轮循存储<br/>缺省编译安装到/usr/local/bin/下，只需要将配置改成：<br/><br/>CustomLog "&#124;/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log" combined<br/><br/>日志将按天截断并存放在以weekday为目录名的目录下：比如：log/1是周一，log/5是周五, log/0是周日<br/><br/>升级维护：<br/><br/>由于使用标准化的DSO模式安装APACHE，APACHE的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活，建议将所有独立模块的配置都放在<br/><IfModule mod_name><br/>CONFIGURATIONS..<br/></IfModule><br/>里，这样配置非常容易通过屏蔽某个模块来进行功能调整：比如：<br/>#AddModule mod_gzip.c<br/>就屏蔽了mod_gzip，其他模块不首任何影响。<br/><br/>安装和维护过程：<br/><br/>系统安装：系统管理员的职责就是安装系统和一个可以适应任何情况的APACHE，然后COLON。 <br/>应用安装：由应用管理员负责具体应用所需要的模块并设置HTTPD。 <br/>系统升级：系统管理员：升级系统/升级APACHE <br/>应用升级：应用管理员：升级应用模块 <br/>系统备份/恢复：如果APACHE不在缺省的系统盘上，只需要将APACHE目录备份就可以了，遇到系统分区的硬件问题直接使用预先准备好的系统COLON，直接将APACHE所在物理盘恢复就行了。 <br/>系统管理员：APACHE的最简化安装 OS + APACHE(httpd core only) <br/>应用管理员：应用模块定制 　 +so<br/>+php<br/>+so<br/>+caucho<br/>+ssl <br/>应用： 纯静态页面服务:<br/>image.example.com<br/><a href="http://www.example.com" target="_blank">www.example.com</a> bbs.example.com mall.example.com <br/><br/>　<br/><br/>参考文档：<br/><br/>Apache<br/><a href="http://httpd.apache.org" target="_blank">http://httpd.apache.org</a><br/><br/>php<br/><a href="http://www.php.net" target="_blank">http://www.php.net</a><br/><br/>Resin<br/><a href="http://www.caucho.com" target="_blank">http://www.caucho.com</a><br/><br/>mod_gzip<br/><a href="http://www.remotecommunications.com/apache/mod_gzip/" target="_blank">http://www.remotecommunications.com/apache/mod_gzip/</a><br/><br/>Cronolog<br/><a href="http://www.cronolog.org" target="_blank">http://www.cronolog.org</a><br/><br/>mod_expires<br/><a href="http://httpd.apache.org/docs/mod/mod_expires.html" target="_blank">http://httpd.apache.org/docs/mod/mod_expires.html</a> <br/>Tags - <a href="http://www.dzhope.com/tags/apache%25E4%25BC%2598%25E5%258C%2596/" rel="tag">apache优化</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] APACHE安装笔记]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>