Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器,可以在大多数电脑操作系统中运行,由于其跨平台和安全性。被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

其程序包是httpd:

[root@www ~]# rpm -qa httpd

httpd-2.2.15-39.el6.centos.x86_64


httpd是yum安装或者是rpm包安装的话,主配置文件会默认保存在/etc/httpd/conf/httpd.conf

/etc/httpd/conf.d/*.conf为主配置文件的辅助性配置文件

下面来介绍一下httpd的程序的主配置文件重要的一些部分:


httpd.conf配置文件由三部分组成:

全局环境

主服务器配置

虚拟主机


一.全局环境

### Section 1: Global Environment

1.服务程序根目录:指出服务器保存其配置、出错和日志文件等的根目录。

ServerRoot "/etc/httpd"


2.PID文件存放路径:相对路径

PidFile run/httpd.pid


3、开启或关闭持续连接:

KeepAlive {On|Off}


4.持续连接最大连接数

MaxKeepAliveRequests 50   #最大连接数50


5.持续连接超时时间

KeepAliveTimeout 15       #超时时间为15s,单位默认为s

   

6.针对MPM的设置,为多道处理模块

## Server-Pool Size Regulation (MPM specific)

prefork:一个进程响应一个请求,稳定可靠,任何进程崩溃了,不会影响另外一个进程,尤其并发量很大时对资源消耗比较大,尤其涉及到大量的进程切换;
worker:一个进程生成多个线程,一个线程响应一个请求
event:一个进程同时响应多个请求,但不会生成线程


注:对于worker模式:启动多个进程,每个进程生成多个线程,对于thread由于多个线程共享同一个进程资源,所以某个线程打开某一个文件并进行了访问的话,那么第二个线程就不用再打开了,直接访问就可以了;这样效率会高一些;但是多个线程在工作时写一个资源的话会导致资源争用,所以为了避免资源竞争,必须要加锁,因此不能良好的解决锁竞争的话,事实上线程是不是比进程的效率更高,这个很难说,尤其是Linux并不是原生态支持线程的,这也是为什么默认使用prefork而不使用worker的原因。


http -l  #查看编译进内核的模块

如果向使用不同的MPM,直接修改文件/etc/sysconfig/httpd文件中的HTTPD项即可

#HTTPD=/usr/sbin/httpd.worker


preforck模块:

<IfModule preforck.c>     判断模块是否存在

  StartServers           默认启动的工作进程数

  MinSpareServers        最少空闲进程数

  MaxSpareServers        最大空闲进程数

  ServerLimit            最大活动进程数

  MaxClients             最大并发连接数,最多允许发起的连接请求个数

  MaxRequestsPerChild    每个子进程在生命周期内最大允许服务的请求个数

</IfModule>

实例:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>


worker模块:

<IfModule worker.c>

StartServers           默认启动的工作进程数

MaxClients             最大并发连接数

MinSpareThreads        最少空闲线程数

MaxSpareThreads        最多空闲线程数

ThreadsPerChild        每个自己进程生成的线程数

MaxRequestsPerChild    每个子进程在生命周期内最大允许服务的请求个数

</IfModule>

实例:

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>


7、监听套接字

Listen [IP:]port

此指令可以出现多次,用于指定监听多个不同的套接字,IP地址可以省略,如果IP地址省略则表示监听在本机所有的ip地址上

Listen  172.16.31.5:80

Listen 8080


8.DOS模块的加载方式,动态模块

# Dynamic Shared Object (DSO) Support

LoadModule module_name /path/to/module

可以使用绝对路径,也可以使用相对路径,如果使用相对路径,则是相对于ServerRoot所定义的位置而言的

httpd -m    #列出所有已加载的DOS模块与非DOS模块

实例:

LoadModule auth_basic_module modules/mod_auth_basic.so



二.主服务器配置

### Section 2: 'Main' server configuration

1.主服务器管理员邮箱

ServerAdmin root@localhost


2.主服务器名称

#ServerName www.example.com:80


3.配置站点根目录

DocumentRoot /path/to/somewhere

只能使用绝对路径

#DocumentRoot "/var/www/html"


4.页面访问属性

 <Direcotry "/path/to/somewhere">

    Options 选项

       Indexes:缺少指定的默认主页时,允许将目录中的所有文件以列表形式返回给用户,危险:慎用

       FollowsymLinks:允许跟随符号链接所指向的岁暗示文件

       None:所有的都不启用

       All: 所有的都启用

       ExecCGI: 允许使用mod_cgi模块执行CGI脚本

       Includes: 允许mod_include模块实现服务器端包含

       IncludesNOEXEC:允许包含但不允许执行CGI脚本

       MultiViews:允许使用mod_negotication实现内容协商

       SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号连接所指向的原始文件

  </Direcotry>

默认:

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

5.针对主服务器根目录的配置

# This should be changed to whatever you set DocumentRoot to.

基于主机的访问控制(2.2系列的配置)

<Direcotry "/path/to/somewhere">

    Options

    AllowOverride

        None 不禁用下面选项

    Order 次序,写在后面的为默认

        allow,deny: 没有允许的都拒绝

        deny,allow:没有拒绝的都允许

    Allow from   允许通过的主机

    Deny from    拒绝通过的主机

         可以是单独的ip地址,也可以是一个网段

          172.16.0

          172.16.0.0

          172.16.0.0/24

          172.16.0.0/255.255.255.0

           表示的都为172.16.0网段

</Direcotry>

如果都匹配或都不匹配时则以默认的为准,否则以匹配到的为准



6.定义默认主页面

DirectoryIndex

查询顺序为依次查询

DirectoryIndex index.html index.html.var


7.错误日志位置

ErrorLog logs/error_log


8.错误日志记录级别

LogLevel warn


9.配置日志功能

CustomLog logs/access_log combined

access.log 访问日志,其需要记录的内容需要自定义

error.log 错误日志,

访问日志:

CustomLog "/path/to/log_file" LogFormat

LofFormat定义的日志格式,只解释最常用的一种

"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

 %h: 客户端地址

 %l:远程的登陆名,通常为-

 %u: 认证时的远程用户名,通常为-

 %t: 接收到的请求时的时间,为标准英文格式时间+时区

 \":表示转义,显示"

 %r:请求报文的起始行

 %>s: 响应状态码

 %b:以字节响应报文的长度,不包含头报文

 %{Referer}i:记录指定请求报文首部的内容

 %{User-Agent}i:用户使用的工具      

详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats



10.路径别名

Alias /alias/ "/path/to/somewhere"

意味着访问http://Server_IP/alias时,其页面文件来自于/path/to/somewhere中

实例;

Alias /icons/ "/var/www/icons/"



11.指定默认的字符集

AddDefaultCharset

实例:

AddDefaultCharset UTF-8



12.脚本路径别名(CGI接口)

CGI:Common Gateway Interface(通用网关接口)使web可以跟一个应用程序进行通信,从通信环境中获得结果,前提必须加载mod_alias和mod_cgi模块

一般在第一行写入 echo “Content-Type:text/html”

ScriptAlias /URL/ "/path/to/somewhere" somewhere下的文件可以被执行

格式一般为

cat << EOF

  Content-Type:text/html

  <pre>

    The Time is : `date`

  </pre>

EOF



13.基于用户的访问控制

虚拟用户:不是系统上的用户,只是为了获取某种特定的资源烈性的一种虚拟用户

可以基于文件、SQL数据库、DBM、ldap认证

认证类型(auth)

 basic:基本认证,账号和密码以明文发送

 digest:摘要认证,hash编号以后再发送

认证提供者(authentiation provide):账号和密码的存放位置

授权机制(authorization):根据什么进行授权

案例:基于文件,做基本认证根据用户和组进行授权

   1、编辑配置文件,为需要认证的目录配置认证机制

   <Directory "/server-status">

       options None

       AllowOverride AuthConfig 使用认证配置

       AuthType Basic 使用基本认证

       AuthName "Private Area" 质询时标题

       AuthUserFile /etc/http/conf/.htpasswd  密码的存放位置

       Require  user tom  jerry |Require  valid-user  可访问的用户

    </Directory>

   注:

Require  valid-user   #运行帐号文件中的所有用户访问

Require  user  tom    #仅允许指定用户登录

   

   2、使用htpsswdm命令使用生成认证库

     htpasswd

     -c 创建密码,创建第一个用户时使用

     htpasswd -c -m /etc/http/conf/.htpasswd tom

     -m MD5格式存放

     -b 批量模式

     -D 删除用户

   3、基于组认证

   <Directory "/server-status">

       options None

       AllowOverride AuthConfig 使用认证配置

       AuthType Basic 使用基本认证

       AuthName "Private Area" 质询时标题

       AuthgroupFile /etc/http/conf/.htpasswd  密码的存放位置

       Require group GroupName  可访问的用户

   </Directory>

      先创建用户,在创建组

      组文件:

组文件:每一行定义一个组

格式:

GROUP:user1  user2  user3


三.虚拟主机

### Section 3: Virtual Hosts

如果开启虚拟主机就需要开启:

NameVirtualHost *:80


一个物理服务器提供多个站点;使用虚拟要先取消中心主机

注意:先注释或取消Main Server;注释DocumentRoot指令即可


基于不同的IP实现不同的虚拟主机:变化IP

基于不同的port实现不同的虚拟主机:变化port

基于不同的主机名实现不同的虚拟主机:变化ServerName的值

通过请求报文中的HOST来实现不同的虚拟主机的访问

 <VirtualHost IP:port>

    SeverName               #主机名

    DocumentRoot ""         #服务器目录

       <Directory "">

       </Directory>

    ServerAlias             #配置别名

    ServerAdmin             #管理邮箱

 </VirtualHost>

虚拟主机可以单独配置用户认证、访问日志、错误日志、别名、脚本别名等


基于主机名的实例:

<VirtualHost IP:80>

    DocumentRoot  /var/www1

    ServerName  www.test.com

    ServerAlias web.test.com

    ServerAlias test.com

    ErrorLog logs  

    CustomLog       "/var/log/httpd/access_test.log"   combind

</VirtualHost>


<VirtualHost IP:80>

    DocumentRoot    /var/www2

    ServerName  www.oracle.com

    ErrorLog logs  

    CustomLog     "/var/log/httpd/access_oracle.log"   combind

</VirtualHost>