阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

CentOS6下使用Apache部署HTTP服务

119次阅读
没有评论

共计 14689 个字符,预计需要花费 37 分钟才能阅读完成。

Apache– 目前用于实现 http 服务的软件有许多,包括主流的 Apache、Nginx,还有微软的 IIS 等,这篇文章只介绍 Apache 实现的各种功能的 http 服务,通过 Apache 的功能说明配置文件中每个指令的具体含义和用法。

目录

  • 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/ 目录下多了几个子目录,如

下图:

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

小 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 命令查看,

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

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

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

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

CentOS6 下使用 Apache 部署 HTTP 服务

        还有其他的参数如下:显示的版本信息依次更加详细,建议使用 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 命令来连接服务端并保持连接,测试进程数量的变化:

CentOS6 下使用 Apache 部署 HTTP 服务

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

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

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

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

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

CentOS6 下使用 Apache 部署 HTTP 服务

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,然后就不会有上诉的两个错误

CentOS6 下使用 Apache 部署 HTTP 服务

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 指令的值会递归到每个目录。

CentOS6 下使用 Apache 部署 HTTP 服务

5.2 设置指定目录的首页

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

[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 保持不变,效果如下:

CentOS6 下使用 Apache 部署 HTTP 服务

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

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

Options        设定目录能够进行的动作的参数,选项如下:

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

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

All            全部允许

None            全部禁用

CentOS6 下使用 Apache 部署 HTTP 服务

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 同样的效果。

CentOS6 下使用 Apache 部署 HTTP 服务

小 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>

CentOS6 下使用 Apache 部署 HTTP 服务

随后更改 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>

CentOS6 下使用 Apache 部署 HTTP 服务

<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

CentOS6 下使用 Apache 部署 HTTP 服务

CentOS6 下使用 Apache 部署 HTTP 服务

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 目录

CentOS6 下使用 Apache 部署 HTTP 服务

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

[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 满足要求,因此就不需要通过用户认证。满足其一即可。

CentOS6 下使用 Apache 部署 HTTP 服务

八、虚拟主机的实现

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

基于 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
# 然后重启服务

CentOS6 下使用 Apache 部署 HTTP 服务

CentOS6 下使用 Apache 部署 HTTP 服务

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 的不同端口,访问的资源不同

CentOS6 下使用 Apache 部署 HTTP 服务

CentOS6 下使用 Apache 部署 HTTP 服务

小 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 文件,我们修改

如下:

CentOS6 下使用 Apache 部署 HTTP 服务

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

CentOS6 下使用 Apache 部署 HTTP 服务

CentOS6 下使用 Apache 部署 HTTP 服务

小 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, 可以在提供的网页里边查找功能的设置方法。

CentOS6 下使用 Apache 部署 HTTP 服务

关于 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
设置用户认证密码的二进制文件

完整 PDF 文档可以到 Linux 公社资源站下载:

—————————————— 分割线 ——————————————

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2018 年资料 / 5 月 / 8 日 /CentOS6 下使用 Apache 部署 HTTP 服务 /

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

—————————————— 分割线 ——————————————

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计14689字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中