zoukankan      html  css  js  c++  java
  • linux Apache 安装笔记

    关键词: apache install php resin mod_gzip mod_expire webalizer cronolog

    内容摘要:

    从简化安装==>性能调优==>方便维护的角度,讨论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

    升级/维护:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;
    按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。
    系统安装:系统管理员的职责就是安装系统=>安装好一台DSO模式的APACHE,然后COLON,
    应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
    系统升级:系统管理员:升级系统/升级APACHE
    应用升级:系统管理员:升级应用模块
    具体的说明:

    WEB应用的容量规划

    APACHE主要是一个内存消耗型的服务应用,我个人总结的经验公式:

    apache_max_processerials_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
    apache_max_process = apache_max_processerials_with_good_perfermance * 1.5

    为什么会有一个apache_max_processerials_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_processerials_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_processerials_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 statuserials_module libexec/mod_status.so
    #server side include已经过时了
    #LoadModule includeserials_module libexec/mod_include.so
    #不需要将没有缺省index文件的目录下所有文件列出
    #LoadModule autoindex_module libexec/mod_autoindex.so
    #尽量不使用CGI:一直是APACHE安全问题最多的地方
    #LoadModule cgi_module libexec/mod_cgi.so
    #LoadModule asiserials_module libexec/mod_asis.so
    #LoadModule imap_module libexec/mod_imap.so
    #LoadModule action_module libexec/mod_actions.so
    #不使用安全校验可以大大提高访问速度
    #LoadModule accesserials_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 aliaserials_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设置放在另外一个文件中:
    <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/accesserials_log" combined

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

    升级维护:

    由于使用标准化的DSO模式安装APACHE,APACHE的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在
    <IfModule mod_name>
    CONFIGURATIONS..
    </IfModule>
    里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:
    #AddModule mod_gzip.c
    就屏蔽了mod_gzip,其他模块不首任何影响。

    安装和维护过程:

    系统安装:系统管理员的职责就是安装系统和一个按照DSO模式安装的APACHE,然后COLON。
    应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
    系统升级:系统管理员:升级系统/升级APACHE
    应用升级:应用管理员:升级应用模块:PHP CAUCHO等
    系统备份/恢复:如果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和PHP模块的独立升级。

    如果APACHE是按照以下方式安装:
    ./configure --prefix=/home/apache --enable-shared=max --enable-module=most
    PHP是按照以下方式安装:
    ./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql

    以后单独升级APACHE的时候,仍然是:
    ./configure --prefix=/home/apache --enable-shared=max --enable-module=most
    make
    su
    #/home/apache/bin/apachectl stop
    #make install

    单独升级php时,仍然是:
    ./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
    make
    su
    #/home/apache/bin/apachectl stop
    #make install

    小技巧:

    Apache安装后,缺省根目录下没有但很有用的2个文件:

    favicon.ico: favicon.ico是一个16x16的站点图标文件,如果浏览器发现有这个文件,在地址栏中会用这个图标替换调浏览器的网页图标。IE6和MOZILLA等主流浏览器都支持这个功能。
    robots.txt: 用于告诉搜索引擎的爬虫程序(spider)网站那些页面可以被索引,那些不可以。具体说明请参考:
    http://www.robotstxt.org/wc/robots.html 

    参考文档:
    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

    上一篇:《Linux下USB设备检测
    下一篇:《linux samba 配置

  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/fengyv/p/2423944.html
Copyright © 2011-2022 走看看