Apache--目前用于实现http服务的软件有许多,包括主流的Apache、Nginx,还有微软的IIS等,这篇文章只介绍Apache实现的各种功能的http服务,通过Apache的功能说明配置文件中每个指令的具体含义和用法。关于http协议的介绍请参考文章:http://blog.51cto.com/13570193/2108347


目录

  • Apache的功能特性

  • 开启Apache

  • 变换Apache的处理模式(MPM)

  • 配置文件中的全局环境配置

  • 多样化设置目录的显示内容

  • 路径别名

  • 基于用户(组)认证的访问控制

  • 虚拟主机的实现


一、Apache的功能特性

1.高度模块化

        Apache支持把更多的功能以模块化的形式存在,通过加载和卸载模块完成不同功能的增加和删除,类似于Linux内核的模块化,可以加载和卸载内核的驱动模块。构成了core+modules模型;

2.支持动态加载和卸载模块

        就是类似热拔插一样的功能,可以实现不重启服务的情况加载和卸载模块并使其生效。

3.支持多路处理模块MPM

        Apache可以有三种(处理)工作模式,分别为:

    prefork---多进程I/O模型,一个进程处理一个请求,是Apache的默认工作模式

该工作模式下存在一个主进程和多个子进程,那些个子进程由主进程生成和回收。主进程负责生成套接字、管理子进程,但是不负责处理请求,主进程由root身份执行;子进程才是真正负责处理请求的角色,一开始会有多个空闲子进程等待处理请求,一个子进程处理一个请求,子进程由apache用户执行。        

    worker----复用多进程I/O模型

该工作模式下,存在一个主进程,同样地主进程负责管理子进程,并不处理请求,主进程生成多个子进程,同时每个子进程生成多个线程,一个线程处理一个请求,这样假设子进程数为M,每个子进程的线程数为N,则此工作模式可以并发处理M*N个请求。该模式下占用内存小,多用于大型网站。

    event-----事件驱动模型

event和worker工作类似,都是并发处理M*N个请求。但是event做出的改进是,每个子进程中对线程划分的更加详细,有管理线程和服务线程两种,为什么要这样设计呢,我们知道HTTP1.1版本默认为持久连接keepalive,如果建立连接却没有发送请求,就会一直占用此连接的带宽直到规定时间才会释放,因此加入了管理进程,专门监视keepalive类型的服务线程,当发生真正的请求的时候,管理线程把请求转交给服务线程处理,处理完毕后管理线程会释放服务线程的资源。增加了带宽的利用率。

4.虚拟主机

        有些网站的访问量低的可怜,这么低的访问量如果专门用一台服务器来搭建的话,实在是划不来,因此就想到了在一台服务器上搭建多个网站,多个网站共用一台服务器降低资源消耗,这样的功能就叫做虚拟主机功能。一个服务器搭建多个网站,每个网站对应不同的域名,外部客户端想要访问的时候,DNS会将这些不同网站的域名解析到同一台服务器,服务器根据HTTP请求的首部行中的域名信息,将请求转至对应的目录资源。

小tips:虚拟主机和虚拟机的区别->虚拟主机是一台主机上边部署多个网站的功能,支撑这么多网站的主机运行的是同一个操作系统;而虚拟机是一个系统通过VMware、LVM等技术虚拟出来的多个主机,这些虚拟的主机可以运行不同的操作系统。

5.CGI通用网关接口

        支持动态网页。这样说会很晦涩,先来说什么是网关,网关就是两个网段内的主机进行通信的交界口,同一网段内的主机通信时是不需要经过网关的,但是一旦不同网段的主机进行通信,就需要把数据先交给网关,让网关转交给另一个网段。同理再来看CGI,web服务器只能发送静态页面,当服务器收到例如index.php的文件请求时,服务器总不能把index.php发送出去吧,因为这是一个动态文件啊,此时CGI会把index.php处理成一种规定的数据格式,然后交给php解释器执行,随后再把执行后的数据经过CGI处理,最后把结果由服务端发送给客户端,这里的CGI就是起到了静态请求和动态请求的转换接口。

6.支持反向代理

7.可以实现负载均衡

8.支持路径别名

        为了不让用户知道服务端资源的真正目录,可以对目录做一个别名,用户只需要知道这个别名即可,别名会自动跳转到真正的目录。

9.可以实现安全认证机制


二、开启Apache

CentOS中默认都会提供Apache的rpm包,这样我们安装Apache就会很简单了,直接yum安装,

[root@CentOS6 ~]# yum -y install httpd
...
# 出现如下信息表示安装成功
Installed:
  httpd.x86_64 0:2.2.15-59.el6.centos                                                                                    

Complete!

那么如何利用Apache开启http服务呢,我们先来看看http相关的文件,安装成功之后会在/etc/httpd/目录下多了几个子目录,如下图:

blob.png

我们会发现日志、模块、运行状态的目录都是软链接文件,进入各自真正的目录后,日志目录下都是xxx_log-xxx的文件,模块目录下都是xxx.so的文件,但是运行状态目录下没有文件,下面来具体说一说该运行状态目录下的文件的作用,

blob.png

如果把http服务开启之后生成的httpd.pid删除,再次查看httpd的状态,显示了错误信息,

blob.png

如果尝试停止httpd,虽然会出现显示服务停止成功OK的标志,但是httpd进程还存在,说明stop失败,

blob.png

现在手动恢复该进程文件,一切又恢复正常。说明start、stop、status的httpd服务命令都是依靠这个httpd.pid进程文件来对指定的进程生效,如果把这个进程文件删除,将无法识别httpd的进程,也就无法对httpd进程进行操作。由此我们也可以认识到判断一个服务是否在运行最准确的方法是查看相应端口监听状态。

blob.png

小tips:httpd.pid进程文件是httpd主进程开启之后将PID写入的,主进程终止之后该进程文件会删除。如果在主进程开启之前随意手动写了一个PID至进程文件中,则会在主进程开启之后覆盖手动写的PID。

总结:另外Apache本身也会提供开启http服务的程序,该程序存放位置为/usr/sbin/apachectl,该文件为shell脚本,我们也可以通过该脚本达成和/etc/init.d/httpd同样的效果。


三、变换Apache的处理模式(MPM)

当前的Apache仅仅支持prefork模式和worker模式,event模式目前还在测试阶段,因此我们主要关心前两种模式。那么怎么查看Apache的当前的处理模式呢,我们可以利用开启服务的命令来判断当前的处理模式。首先确保http服务属于开启状态,然后利用pstree和ps命令查看,

blob.png

我们可以确定Apache默认在不修改的情况下会工作在prefork模式下,至于变换Apache的处理模式则要用到/etc/sysconfig/httpd文件,只需要修改文件中HTTPD参数然后重启http服务,就可以变换工作模式了。

blob.png

更改之后在利用pstree和ps命令查看不同。

blob.png


四、配置文件中全局环境设置

Apache中提供了两个配置文件,分别为/etc/httpd/conf/httpd.conf(主要),/etc/httpd/conf.d/*.conf额外,用户可以在此修改配置文件),其中主要的配置文件多用来设定全局指令,不建议普通用户在主配置文件中修改;对于额外的配置文件,可以把对特定功能的指令配置设定在此目录下,并且文件必须以.conf结尾。

主配置文件中的内容分为三大部分,分别为全局环境配置主服务的配置虚拟主机的配置,对应于section{1..3},其中全局环境(section1)配置中各个指令的含义如下:     

        ServerTokens    允许在客户端显示的服务器版本信息,如下图所示,

blob.png

        还有其他的参数如下:显示的版本信息依次更加详细,建议使用Prod保护服务器端的安全。

        +------+-----------------------------+

        | Prod | Apache                      |

        +------+-----------------------------+

        | Major| Apache/2                    |

        +------+-----------------------------+

        | Minor| Apache/2.2                  |

        +------+-----------------------------+

        | Min  | Apache/2.2.15               |

        +------+-----------------------------+

        | OS   | Apache/2.2.15 (CentOS)      |

        +------+-----------------------------+

        | Full | Apache/2.2.15 (CentOS) DAV/2|

        +------+-----------------------------+

        Listen [IP:]PORT    httpd监听的IP和端口,IP缺省表示所有IP,一般为所有IP:80

该指令不能注释(#)不写,如果该指令缺省不写,启动服务会出现异常。

        ServerRoot    定义配置文件的根目录,一般为/etc/httpd/

        Timeout    连接状态能够持续的时间

        AddDefaultCharset     定义httpd传输数据的编码格式,一般为UTF-8

编码格式不对应会在浏览器上显示乱码,只能修改浏览器的编码格式

        KeepAlive     是否开启持久连接的指令,默认On开启状态,Off为关闭状态

每次从服务器下载文件的时候都需要建立一次TCP连接,如果为Off,下载完毕后会断开此次TCP连接;如果为On,下载完毕后会继续保持此次TCP连接。

        MaxKeepAliveRequests    一次TCP连接能够发送的最大请求数,例如值为3时,可以利用GET发送4次请求,第1次不算哦!!

该参数只有在KeepAlive设置为On的时候才会生效,设置为0表示没有限制

        KeepAliveTimeout    在本次TCP连接中等待下一个请求的时间,超过会断开此次TCP连接

该参数同样只有在KeepAlive设置为On的时候才会生效

可以利用telnet测试keepalive

telnet ip port     # 如果没有修改的话,则是80端口
GET /xxx1 http/1.1 # xxx1为/var/www/html下的一个文本文件
host:xxxx          # xxxx为客户端的IP地址
上述命令完毕之后需要按shift+enter键才能返回结果

        <IfModule prefork/worker.c> ... </IfModule>

                MPM的参数配置,具体的各个参数含义如下:

                StartServers       启动httpd服务会开启几个进程

                MinSpareServers    进程队列中最小处于预备状态的进程数

                MaxSpareServers    进程队列中最大处于预备状态的进程数

                ServerLimit        服务器开启处理http请求的最大进程数

                MaxClients         可以同时连接到httpd服务的最大连接数量,和ServerLimit的数值一样,默认最大值为256

                MaxRequestsPerChild    每个子进程处理http请求的最大数量,超过该值会释放子进程,0表示无限制

下图所示为prefork处理模式下的进程的状态,可以让多个终端利用telnet命令来连接服务端并保持连接,测试进程数量的变化:

blob.png

blob.png

修改/etc/sysconfig/httpd文件,再来看看worker模式下的进程/线程状态

blob.png

但是4个子进程*25个线程=100个线程,这样就会超过75个线程的限制,因此会出现下图所示的情况,刚开启httpd就有一个进程被杀死。不过手速要快,不然看不到这种情况。

blob.png

        LoadModule xxx.so 模块的路径      表示启动httpd服务时加载的模块

httpd -l     # 查看加载的静态模块
httpd -M     # 查看加载的静态和动态模块

例如关于认证的auth_basic_module模块,修改之前httpd -M可以看到该模块加载成功,但是把他注释掉之后,再利用httpd -M可以看到实时的卸载。

blob.png

        Include     可以读入的配置文件,/etc/httpd/conf.d/*.conf之所以可以充当配置文件的原因

        User apache / Group apache    处理http请求的用户和用户组都为Apache

小tips:可以利用httpd -t 或者service httpd configtest 来检测配置文件的语法错误,检测通过则会显示Syntax OK的标志,但是只能检测文件的语法错误,并不能保证服务能够正常的运行。


五、多样化设置目录的显示内容

        ServerName    指定服务器的域名

刚安装Apache启动的时候,会在start部分停留好久,之后会报两个错误,但是不影响服务的正产启动,这种情况就是ServerName没有指定,导致DNS解释失败,因此我们需要在ServerName指令后添加主机名:port,然后就不会有上诉的两个错误  

blob.png

        ServerAdmin      管理员的邮箱服务器,错误信息都会发送至该服务器

        UseCanonicalName 建议设置为Off,如果为On,则httpd只认定ServerName

5.1 设置全局站点首页

因为Web服务器说白了就是让互联网上的其他用户访问自己目录下的文件,但是不可能让用户访问所有的文件吧,因此就需要设置用户可以访问的目录和目录权限,如下:

        DocumentRoot     定义用户访问的根目录,一般为/var/www/html

        DirectoryIndex   定义用户访问一个网站的首页,默认为index.html

什么是首页,就是用户在网址列只输入到目录,因为没有指定要访问的文件,因此会显示DirectoryIndex设置的文件,文件显示的内容就是首页。

可以设置多个首页,默认显示第一个文件

DocumentRoot "/var/www/html"
DirectoryIndex index.html index.html.var

上面内容的意思是只输入域名或者IP地址后(后面没有跟具体的文件名),则默认进入/var/www/html目录下,并且如果目录下存在index.html/index.html.var的文件,则在网址列的URL仅输入到目录的时候,会去显示该目录下的index.html/index.html.var文件(同时存在按照先后顺序),即DirectoryIndex指令的值会递归到每个目录。

blob.png
5.2 设置指定目录的首页

上面设定首页的方法是对全部目录生效的,那如果只针对特定目录设置不同的首页内容,该怎么做呢?配置文件中为我们提供了<Directory "xxx"> ... </Directory>的指令,他表示的含义是对目录进行访问控制,具体用法如下:

[root@CentOS6 conf.d]# pwd

/etc/httpd/conf.d

[root@CentOS6 conf.d]# cat isolinux.conf 

<Directory "/var/www/html/isolinux">

DirectoryIndex splash.jpg

</Directory>

上边已经说过,建议修改指令参数在/etc/httpd/conf.d/目录下新增加文件进行修改,我在该目录下新建了isolinux.conf的文件,在该文件中利用目录的访问控制加入指定目录的DirectoryIndex为splash.jpg(图片格式),而全局的DirectoryIndex仍然为index.html保持不变,效果如下:

blob.png

5.3 设置目录的特殊访问控制

当然<Directory>指令的功能不止于上面设置目录首页的功能,还有更多的功能可以借助不同的参数来实现,例如Options,AllowOverride等。

        Options <+/- 增加或删除选项>        设定目录能够进行的动作的参数,选项如下:

            Indexes         如果该目录内没有找到设定为首页的文件,则将该目录内的所有文件的索引列出来,即该目录下的每个文件名

            FollowSymLinks  字面意思:跟踪符号链接,就是可以访问到该链接文件的源文件,如果该链接文件指向了/var/www/html外的其他文件,该选项可以使其生效。

            All             全部允许

            None            全部禁用

isolinux.png

Options选项是在配置文件中生效的,那么AllowOverride则是在客户端要访问的目录内生效的,现在配置文件中利用AllowOverride指定能够生效的选项,然后在指定目录内添加.htaccess,在该文件中设定访问控制选项。

其实/etc/httpd/conf/httpd.conf文件中的AccessFileName指令定义了 .htaccess文件。

        AllowOverride     允许.htaccess文件可以覆盖主配置文件的选项设定,实现避免多个个人首页目录维护同时修改主配置文件

主配置文件需要root身份才可以修改,主配置文件需要重启服务才会生效,因此加入了.htaccess文件,只需要在该文件中进行修改用以覆盖主配置文件的参数设定

                All       允许所有

                None      全部禁止,则.htaccess文件失效

                AuthConfig 只允许用户认证可以被覆盖

                Limit      Order可以被覆盖

                Indexes    允许Indexes可以被覆盖,这里的Indexes和Options里的Indexes不是同一个意思

                Options <选项>    允许目录可以进行的动作

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat root.conf      # 新添加的root.conf配置文件
<Directory "/var/www/html">
    AllowOverride Options Indexes         # 允许Indexes选项
</Directory>
[root@CentOS6 html]# pwd
/var/www/html
[root@CentOS6 html]# cat .htaccess        # 在指定目录下创建.htaccess文件
Options Indexes

可以达到和直接在配置文件里指定Options Indexes同样的效果。

index.png

小tips:在这里说说明一下AllowOverride中的选项中Option Indexes和Indexes的区别,Option Indexes的具体实现已经在上例中说了,是用来实现显示目录的文件名的;现在来看看Indexes的用法

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat root.conf 
<Directory "/var/www/html">
    AllowOverride Indexes
</Directory>
[root@CentOS6 html]# pwd
/var/www/html
[root@CentOS6 html]# cat .htaccess 
DirectoryIndex index.html

重启服务,本机访问127.0.0.1,可以看到出现了首页内容,由此可以得出Indexes是可以来用来实现目录首页的功能的。
5.4 根据客户端设置访问控制

Order 根据不同的客户端IP设置不同的访问权限,Order选项需要写到<Directory>、<Files "xxx">、<FilesMatch "xxx">、<Location "xxx"> 或者.htaccess文件中

还可以实现同一个IP可以访问不同的目录

Order定义处理顺序,allow from/deny from表示具体的策略

Order deny,allow 拒绝所有,允许特定

Order allow,deny 允许所有,拒绝特定

例如:

Order allow,deny

拒绝所用访问

Order deny,allow

允许所有访问

Order allow,deny
allow from all
deny from 192.168.138.150

允许所有访问,但是192.168.138.150无法访问

Order deny,allow
deny from 192.168.138.150
allow from all

允许所有访问

Order deny,allow
deny from 192.168.138.0/24
allow from 192.168.138.150

拒绝192.168.138.0/24网段的所有主机访问,但是允许192.168.138.150访问,当出现在一个交叉集的时候,后者会覆盖前者,交叉集外的仍然生效。

5.5 目录内文件的访问控制

Apache不仅可以实现目录的访问控制,还可以实现目录内特定文件的访问控制,这里借助的是<Files "xxx"> ... </Files><FilesMatch "xxx"> ... </FilesMatch>令,区别是前者针对指定的文件进行设置,后者针对符合匹配条件的文件进行设置,而且后者支持正则表达式。

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat isolinux.conf 
<Directory "/var/www/html/isolinux">
    Options Indexes FollowSymlinks
</Directory>

blob.png


随后更改isolinux.conf文件

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat isolinux.conf 
<Directory "/var/www/html/isolinux">
    Options Indexes FollowSymlinks
</Directory>
<FilesMatch "^boot">     # 以boot开头的文件
    Order allow,deny     # 表示拒绝所有人访问
</FilesMatch>

blob.png

<Location "xxx"> ... </Location>

URL的访问控制

<LocationMatch "xxx"> ... </LocationMatch>

支持正则表达式的URL的访问控制


六、路径别名

路径别名可以隐藏服务器上的真实路径,当收到访问该别名的请求时,服务器自动跳转到真实的目录下返回资源给客户端,这一过程对客户端是透明的。

Alias /xxx "实际目录"     网站根目录下的xxx目录会自动链接到后边的实际目录

例如:Alias /icons/ "/var/www/icons/"

网址列输入http://hostname/icons,会访问到/var/www/icons/目录下的文件,而实际上/var/www/html/icons目录下并没有文件  

在/etc/httpd/conf/httpd.conf主配置文件中默认存在这些指令,首先要在/var/www/html/目录下创建icons目录

[root@CentOS6 html]# pwd
/var/www/html
[root@CentOS6 html]# mkdir icons

blob.png

blob.png

ScriptAlias /xxx "实际目录"    和Alias类似,只不过该实际目录下存放的是具有执行能力的文件

例如:ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"


七、基于用户(组)认证的访问控制

每个网站都会有后台管理员管理网站后台的一些工作,但是网站后台不是每个用户都可以登录,因此需要设置用户的访问控制,实现用户认证的功能。具体的设定如下:

[root@CentOS6 conf.d]# cat isolinux.conf 
<Directory "/var/www/html/isolinux">
    AuthType Basic     # Basic表示明文
    AuthName "isolinux"
    AuthUserFile "/etc/httpd/conf.d/.htuser"  # 存放用户和密码的文件   
    Require User Bob     # 表示只有后边指定的用户才可以登录,Valid-User表示只要输入密码正确就可以登录
</Directory>
# htpasswd命令创建两个用户Bob Alice
[root@CentOS6 conf.d]# htpasswd -cm /etc/httpd/conf.d/.htuser Bob    # -c表示首次创建的时候指定的用户文件,-m 表示MD5加密 
New password: 
Re-type new password: 
Adding password for user Bob
[root@CentOS6 conf.d]# htpasswd -m /etc/httpd/conf.d/.htuser Alice   # 第二次创建用户的时候不需要加-c,否则会覆盖文件中的其他用户
New password: 
Re-type new password: 
Adding password for user Alice
[root@CentOS6 conf.d]# cat .htuser 
Bob:$apr1$QO7u9/CG$tWj182TGwOBXg6.EIi36/1
Alice:$apr1$DPDl0yte$a7jtviDXWzpnfEped6VYh1

然后重启httpd,会出现如下效果,当输入指定的用户Bob和密码的时候,才能够进入isolinux目录

blob.png

下面的是基于用户组认证的访问控制

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat isolinux.conf 
<Directory "/var/www/html/isolinux">
    AuthType Basic
    AuthName "isolinux"
    AuthUserFile "/etc/httpd/conf.d/.htuser"
    AuthGroupFile "/etc/httpd/conf.d/.htgroup"     # 新增加的组文件
    Require Group group1
</Directory>
[root@CentOS6 conf.d]# cat .htgroup                # 将Bob和Alice加入组
group1:Bob Alice

重启服务之后,只要是组里边的用户都可以登录isolinux目录,同时Alice也可以(上个例子中的Alice是不可以登录)。

基于客户端IP和用户(组)的双重认证,需要借助选项Satisfy,

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat isolinux.conf 
<Directory "/var/www/html/isolinux">
    Order Deny,Allow
    deny from all
    allow from 172.18.251.124    # 只允许172.18.251.124的IP能够登录该isolinux目录
    AuthType Basic
    AuthName "isolinux"
    AuthUserFile "/etc/httpd/conf.d/.htuser"
    AuthGroupFile "/etc/httpd/conf.d/.htgroup"
    Require Group group1         # 保持上边的例子不变,仍然为Bob Alice
    Satisfy Any                  # Any表示只要符合其中一项即可,All表示必须同时满足IP和用户(组)才能登录
</Directory>

如下图所示,访问(服务端IP)172.18.250.183/isolinux,因为客户端IP满足要求,因此就不需要通过用户认证。满足其一即可。

blob.png


八、虚拟主机的实现

虚拟主机的实现有三种实现方案,分别为

        基于IP:每个虚拟主机至少一个IP

        基于Port:每个虚拟主机至少一个独立的Port

        基于域名:每个虚拟主机至少一个域名

8.1 基于IP的虚拟主机

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat virtualhost.conf 
<VirtualHost 192.168.124.1:80>     # 124.1和138.254是同一主机上的两个IP
    DocumentRoot/var/www/html
    <Directory "/var/www/html">    # 因为/var/www/html目录下添加默认的首页,所有设置了Options Indexes指令。
        Options Indexes
    </Directory>
</VirtualHost>
<VirtualHost 192.168.138.254:80>
    DocumentRoot/var/www/error
    <Directory "/var/www/error">
        Options Indexes
    </Directory>
</VirtualHost>
[root@CentOS6 www]# pwd
/var/www
[root@CentOS6 www]# ls
cgi-bin  error  html  icons  manual
# 然后重启服务

blob.png     

blob.png

8.2 基于Port的虚拟主机
这种方法是基于一个ip上绑定多端口来实现的

[root@CentOS6 conf.d]# cat virtualhost.conf 
Listen 192.168.138.254:8090    # 设置监听的端口号
Listen 192.168.138.254:8080
<VirtualHost 192.168.138.254:8090>
    DocumentRoot/var/www/html
    <Directory "/var/www/html">
        Options Indexes
    </Directory>
</VirtualHost>
<VirtualHost 192.168.138.254:8080>
    DocumentRoot/var/www/error
    <Directory "/var/www/error">
        Options Indexes
    </Directory>
</VirtualHost>

可以看到同一IP的不同端口,访问的资源不同

blob.png

blob.png

小tips:设置好基于port的虚拟主机后,重启httpd会失败,错误信息如下

(13)Permission denied: make_sock: could not bind to address 192.168.138.254:8090

no listening sockets available, shutting down

  able to open logs

这是由于SELinux的缘故,需要关闭SELinux,httpd就可以正常启动了。

/etc/httpd/conf.d/welcome.conf

8.3 基于域名的虚拟主机

一个IP上对应多个域名,不同的域名对应各自的站点,先来配置httpd的配置文件,www.a.linux.com对应/var/www/html目录,www.b.linux.com对应/var/www/error目录,

[root@CentOS6 conf.d]# pwd
/etc/httpd/conf.d
[root@CentOS6 conf.d]# cat virtualhost.conf 
NameVirtualHost *:80     # 加入NameVirtualHost指令
<VirtualHost *:80>
    DocumentRoot/var/www/html
    ServerName www.a.linux.com    # 指定该虚拟主机的域名
    <Directory "/var/www/html">
        Options Indexes
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot/var/www/error
    ServerName www.b.linux.com
    <Directory "/var/www/error">
        OptionsIndexes
    </Directory>
</VirtualHost>

接下来回到windows主机的浏览器进行设置,因为这里没有配置DNS服务器,所有需要手动的将www.a.linux.com和www.b.linux.com的IP-192.168.138.254添加到hosts文件中,windows中该文件在C:\Windows\System32\drivers\etc的目录下的hosts文件,我们修改如下:

blob.png

浏览器测试如下:会发现不同域名访问的结果不一样。

blob.png

blob.png


小tips:Apache的功能还有很多,关于更加详细的功能实现的指令我们可以借助Apache提供的文档(不是man哦),而是Apache额外提供的一个软件包,我们需要安装才能够查阅,这个软件就是httpd-manual,

yum -y install httpd-manual

安装成功之后会在/etc/httpd/conf.d/目录下多出一个manual.conf的文件,文件内容如下,其实就是给我们提供了一个网页

[root@CentOS6 conf.d]# cat manual.conf 
#
# This configuration file allows the manual to be accessed at 
# http://localhost/manual/
#
AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/var/www/manual$1"

<Directory "/var/www/manual">
    Options Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

我们可以再网址列输入IP/manusl,可以在提供的网页里边查找功能的设置方法。

blob.png

关于Apache的一些文件的作用:

/etc/httpd/modules

        modules -> /usr/lib64/httpd/modules 

Apache所支持的模块都包含于该目录下

/etc/httpd/run/httpd.pid

        /etc/httpd/run/ -> /var/run/

Apache开启http服务的进程文件

/var/www/html/

初始设置的首页目录

/var/www/error/

错误信息所在目录

/var/www/icons/

Apache的一些图标都存放在该目录下

/var/www/cgi-bin/

可执行的网页程序放置的目录

/usr/sbin/httpd 

二进制执行文件

/usr/bin/htpasswd

设置用户认证密码的二进制文件