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 配置

  • 相关阅读:
    jQuery的实用技巧
    jQuery中的Ajax
    jQuery中的动画
    jQuery中的事件
    jQuery中的DOM操作
    详解jQuery的选择器
    微信小程序开发教程(九)视图层——.wxss详解
    微信小程序开发教程(八)视图层——.wxml详解
    14 组合查询
    13 创建高级联结
  • 原文地址:https://www.cnblogs.com/fengyv/p/2423944.html
Copyright © 2011-2022 走看看