一、主配置文件的格式

1、/etc/httpd/conf/httpd.conf

格式:Directive  Value

   配置参数|指令  值 

注意:

  配置参数|指令 字符不区分大小写

  指令有可能区分大小写,有些指令可以重复出现多次,取其值的和


2、配置文件分三段

  ### Section 1: Global Environment   全局配置

  ### Section 2: 'Main' server configuration   中心主机配置:用于仅提供一个站点时

  ### Section 3: Virtual Hosts   虚拟主机配置:用于提供多个站点时

中心主机和虚拟主机不能同时启用:默认启用的中心主机(经测试可以

配置文件语法测试:

      # service httpd configtest

  或:  # httpd -t

注意:

  绝大多数配置修改后,可通过service httpd reload来使其生效

  如果修改了ip和port,必须重启服务才能生效


二、常用的配置选项

1、监听的套接字

  Listen [IP:]port      # httpd的配置文件中指定都使用完整的单词,首字母大写

 1)IP省略时表示监听本机上所有可用的ip地址

 2)Listen指令可以出现多次,用于指明多个不同的监听端口或套接字

   Listen 172.16.100.11:80

   Listen 172.16.100.11:8080


2、持久连接

  连接建立后,每个连接资源获取结束不会断开连接,而继续等待其它资源请求并完成传输,那

如何断开?

数量限制:如100

时间限制:如30s

劣势:对并发访问量较大的服务器,开持久连接会使后面的有些请求得不到响应:

改进:简短,httpd-2.4支持毫秒级的KeepAliveTimeout,

非持久连接:每个资源都是单独通过专用的连接进行获取

   KeepAlive off|on

   MaxKeepAliveRequests 100  #获取了100个资源后就断开

   KeepAliveTimeout 15     # 超时时间,超出就断开

测试:

    # telnet server 80

    GET /URL HTTP/1.1


    Host:serverip

使用telnet测试KeppAlive的效果:

[[email protected] ~]# cd /var/www/html
[[email protected] html]# vim index.html

[[email protected] html]# cat index.html
This is First Page!
[[email protected] ~]# curl http://192.168.10.4
This is First Page!

KeepAlive off时:

[[email protected] conf]# telnet 192.168.10.4 80
Trying 192.168.10.4...
Connected to 192.168.10.4.
Escape character is '^]'.
GET /index.html http/1.1            #指定URL时一定要用/,否则找不到
Host:192.168.10.4

HTTP/1.1 200 OK
Date: Fri, 13 Jan 2017 02:14:24 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 13 Jan 2017 01:32:07 GMT
ETag: "101547-14-545efcd4ef200"
Accept-Ranges: bytes
Content-Length: 20
Connection: close                          #一个事务完成后,连接即断开
Content-Type: text/html; charset=UTF-8

This is First Page!
Connection closed by foreign host.     
[[email protected] conf]#

KeepAlive on时:

[[email protected] conf]# telnet 192.168.10.4 80
Trying 192.168.10.4...
Connected to 192.168.10.4.
Escape character is '^]'.
GET /index.html http/1.1
Host:192.168.10.4

HTTP/1.1 200 OK
Date: Fri, 13 Jan 2017 02:25:40 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 13 Jan 2017 01:32:07 GMT
ETag: "101547-14-545efcd4ef200"
Accept-Ranges: bytes
Content-Length: 20
Content-Type: text/html; charset=UTF-8

This is First Page!
GET                                     #连接没有断开,可以继续请求  
This is First Page!
Connection closed by foreign host.


3、MPM

MPM:多路处理模块  

  并发请求响应的不同实现

preforkworkerevent

  httpd-2.2不支持同时编译多个不同的MPM

  rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持

查看httpd的工作模式:# ps aux|grep httpd

              默认为/usr/sbin/httpd,其为prefork;

[[email protected] conf]# ps aux|grep httpd
root      1581  0.0  2.0 233260 10148 ?        Ss   10:05   0:00 /usr/sbin/httpd
apache    1620  0.0  1.0 233260  5328 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1621  0.0  1.2 233260  5996 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1622  0.0  1.2 233260  5988 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1623  0.0  1.2 233260  5992 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1624  0.0  1.0 233260  5332 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1625  0.0  1.0 233260  5328 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1626  0.0  1.0 233260  5328 ?        S    10:24   0:00 /usr/sbin/httpd
apache    1627  0.0  1.0 233260  5328 ?        S    10:24   0:00 /usr/sbin/httpd
root      1635  0.0  0.1 103244   856 pts/1    S+   10:34   0:00 grep httpd

查看模块列表:

  httpd -l查看静态编译的模块

  httpd -M列出所有已模块,包括静态编译和DSO模块

[[email protected] conf]# httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

更换支持不同的MPM的主程序:

 vi /etc/sysconfig/httpd启用变量:

   HTTPD=/usr/sbin/httpd.work|httpd.event 

再重启httpd服务

[[email protected] httpd]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[[email protected] httpd]# ps aux|grep httpd
root      2059  0.0  0.7 175940  3852 ?        Ss   10:40   0:00 /usr/sbin/httpd.worker
apache    2061  0.0  0.6 520200  3248 ?        Sl   10:40   0:00 /usr/sbin/httpd.worker
apache    2063  0.0  0.6 520200  3232 ?        Sl   10:40   0:00 /usr/sbin/httpd.worker
apache    2064  0.0  0.6 520200  3236 ?        Sl   10:40   0:00 /usr/sbin/httpd.worker
root      2174  0.0  0.1 103244   856 pts/0    S+   10:40   0:00 grep httpd

MPM的配置详解:

## Server-Pool Size Regulation (MPM specific)
## 

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>   #判断prefork.c模块是否存在,存在则这个容器中的配置有效,否则无效
StartServers       8         # 默认启动的工作进程数
MinSpareServers    5         # 最少空闲进程数
MaxSpareServers   20         # 最大空闲进程数
ServerLimit      256         # 最大活动子进程数,最大值为20000,如果需要更大,需要修改源码参数再重新编译
MaxClients       256     # 客户端并发请求的最大数=serverlimit * 线程数,超过MaxClients限制的任何连接尝试将排队
MaxRequestsPerChild  4000   # 每个子进程在生命周期内所能够响应的最大请求数,0表示不限定
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers         4     # 默认启动的工作进程数
MaxClients         300     # 客户端并发请求的最大数
MinSpareThreads     25     # 最小空闲线程数
MaxSpareThreads     75     # 最大空闲线程数
ThreadsPerChild     25     # 每个子进程可生成的线程数
MaxRequestsPerChild  0     # 每个子进程在生命周期内所能够响应的最大请求数,0表示不限定
</IfModule>

#

注意:

   ServerLimit 要放在 MaxClients 前面!

   如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。


4、DSO 动态共享对象

 配置模块加载:

   LoadModule <module_name>  <module_path>  

 模块路径:可使用相对路径,相对于ServerRoot指令指向的位置而言

 注意:建议使用service httpd reload重新装载配置文件


5、配置站点根目录

 DocumentRoot /path/to/somewhere  # 指定站点根目录

DocumentRoot  "/var/www/html"

 但是/var/www/html目录下的页面文件,并非就一定能访问,可以使用Direcory容器来指定路径的访问属性:

<Direcotry "/path/to/somewhere">   

  Options

<Direcoty>

  Direcotry的容器可以出现多次,指定多个路径的访问属性 


6、配置页面访问属性

 1)配置的方式有两种

文件系统路径:

   <Directory [~] "/PATH/TO/SOMEDIR">     # 支持正则表达式,但尽量不用,速度慢

     Options....

   </Diretory>  

URL路径:

    <Location [~] "URL">

      Options...

    </Location>

限制单个文件:

   <File [~] "">

    Options....

   </File>

支持正则表达式(这种方式匹配正则速度快):

  <LocationMatch "">|<DirectoryMatch "">|<FileMatch "">

   Options...

  <LocationMatch>

  如果要配置其属性的URL能映射到某具体文件系统路径,则建议使用<Directory> 


 2)Options详解

Options:选项(页面访问属性)

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

 FollowsymLinks:允许跟随符号链接所指向的原始文件,危险

  None:所有的属性都不启用

  All:所有的属性都启用

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

  Includes:允许使用mod_include模块实现服务器端包含(SSI)

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

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

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


7、基于主机(来源地址)访问控制

也是使用Direcotry容器来定义,Direcotry容器分为2段

一段配置页面访问属性,一段配置访问控制 

<Direcotry "/path/to/somewhere">

  Options

  AllowOverride

  Order

  Allow

  Deny

<Direcotry>

 1)Options 页面访问属性

    上面已经学习了

 2)基于来源地址访问控制

常用的指定:

 AllowOverride None|All|AuthConfig|Limit  

      下面的选项是否被禁用,不禁用|禁用,如果禁用则下面的配置无效,被所使用的配置覆盖

 Order:检查次序

 Allow:允许

 Deny:拒绝

常用指令的参数:

 Order Allow,Deny:只有明确Allow的来源地址才允许访问,其它的均为Deny(白名单)

 Order Deny,Allow:只有明确Deny的来源地址才允许访问,其它的均为Allow(黑名单)

 Allow from:允许访问的来源地址

 Deny from:拒绝访问的来源地址

   from后可跟上的地址格式:

                IP地址:如:192.168.10.3

                网络地址:如:192.168.10.0/24

                all:所有的,默认

注意:最终匹配法则

  如果列表中有多条Allow和Deny语句就把所有语句定义的加起来

  如果一个IP在Allow和Deny中都没有定义那么就使用默认的,Order Allow,Deny默认是Deny

  如果一个IP在Allow和Den中都有定义那么就使用默认的,Order Deny,Allow默认是Allow

例子:

  该httpd服务器有2个IP地址,分别为:

[[email protected] ~]# hostname -I
192.168.10.4 192.168.100.5

  修改配置文件为:

</Directory>

#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
    #Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None

#
# Controls who can get stuff from this server.
#
    Order allow,deny
    Allow from 192.168.10.0/24

</Directory>

例子:

 1)移除站点的首页,访问首页看是否还会列出站点内的所有文件

[[email protected] html]# mv index.html index.html.bak
[[email protected] html]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

 2)使用192.168.10.4访问

 3)使用192.168.100.5访问
【httpd】02、httpd配置详解


8、定义默认主页面

 DirectoryIndex index.html index.html.var

   自左而右,找到首次匹配到的文件,就将其作为默认主页面返回


9、用户目录

 如果让每个用户都可以创建个人站点:http://Server_IP/~Username/

   userdir disablied  禁止  建议禁止,安全

如果允许的话可以使用:userdir public_html   

  public_html是户家目录下的目录名称所有位于此目录中的文件均可通过前述的访问路径进行访问

  前提:用户的家目录得赋予运行httpd进程的用户拥有执行权限

     setfacl -m u:apache:x ~Username

例子:

<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    UserDir public_html

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    # 
    #UserDir public_html

</IfModule>

使用xj用户,在家目录下创建站点文件:

[[email protected] conf]# useradd xj
[[email protected] conf]# su - xj
[[email protected] ~]$ 
[[email protected] ~]$ ls
[[email protected] ~]$ mkdir public_html
[[email protected] ~]$ cd public_html
[[email protected] public_html]$ ls
[[email protected] public_html]$ vim index.html
[[email protected] public_html]$ cat index.html
xj's Home
[[email protected] public_html]$

用户的家目录得赋予运行httpd进程的用户拥有执行权限:

[[email protected] public_html]$ exit
logout
[[email protected] conf]# cd ~xj
[[email protected] xj]# ls
public_html
[[email protected] xj]# ls -l
total 4
drwxrwxr-x 2 xj xj 4096 Jan 13 12:47 public_html
[[email protected] xj]# ls -ld ..
drwxr-xr-x. 3 root root 4096 Jan 13 12:43 ..
[[email protected] xj]# 
[[email protected] xj]# cd
[[email protected] ~]# 
[[email protected] ~]# cd /home
[[email protected] home]# ls -l
total 4
drwx------ 5 xj xj 4096 Jan 13 12:48 xj
[[email protected] home]# ls -l xj
total 4
drwxrwxr-x 2 xj xj 4096 Jan 13 12:47 public_html
[[email protected] home]# ls -l xj/public_html/index.html 
-rw-rw-r-- 1 xj xj 10 Jan 13 12:47 xj/public_html/index.html
[[email protected] home]# cd xj/public_html/
[[email protected] public_html]# setfacl -m u:apache:x /home/hadoop/
setfacl: /home/hadoop/: No such file or directory
[[email protected] public_html]# setfacl -m u:apache:x /home/xj
[[email protected] public_html]# getfacl /home/xj
getfacl: Removing leading '/' from absolute path names
# file: home/xj
# owner: xj
# group: xj
user::rwx
user:apache:--x
group::---
mask::--x
other::---

[[email protected] public_html]#

【httpd】02、httpd配置详解


10、配置日志功能

日志文件目录:/var/log/httpd/

            access.log

            error.log

错误日志: 

  Errorlog logs/error_log

  Loglevel warn             

访问日志:要自定义日志格式

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

 Customlog logs/access_log combined

[[email protected] httpd]# tail -1 /var/log/httpd/access_log
192.168.10.10 - - [13/Jan/2017:12:50:39 +0800] "GET /~xj/ HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36"

combined  为此格式的名称,方面后面可直接调用

%h:客户端地址

%l:远程登录名,客户端用户通过identd登录时使用的名称,一般为-(空)

%u:用户认证登录的名字,无登录机制一般为-

%t:收到客户端请求时的时间

\":显示引号本身,而不作为引用符号

%r:请求报文首行

   <method> <url> <version>

%>s:响应状态状态码

%b:响应报文的大小,单位为字节,不包含首部信息

%{Refer}i:记录Http首部Referer对应的值:即访问入口,从哪个页面跳转至此页面 “-”表示直接访问,

%{User-Agent}i:记录http首部User-Aget对应的值,即浏览器类型

%{Forba}i:请求首部报文中内容对应的值

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


11、路径别名

 Alias /alias/ "/path/to/some_directory/"

  表示访问http://Server_IP/alias/时,其页面文件来自于/path/to/some_directory/这个路径

例子:

  在配置文件中配置了:Alias /bbs/ "/bbs/test/"

[[email protected] conf]# mkdir -pv /bbs/test
[[email protected] conf]# cd /bbs/test
[[email protected] test]# vim test.html
[[email protected] test]# cat test.html
Test Page

【httpd】02、httpd配置详解

  就跟FTP的虚拟目录一样的

注意:

  前面的目录最后加“/",后面的目录也一定要加,前面不加,后面的也一定不要加,要保持一致


12、设定默认字符集

 AddDefaultCharset UTF-8

  指定默认的字符集

 常用字符集:GBK,GB2312,GBK18030


13、CGI脚本路径别名

CGI:Common Gateway Interface  通过网关接口,是一种协议

使WEB可以跟一个应用程序进行通信,从通信环境中获得结果

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

  Alias就是URL-->FileSystem Directory

  httpd服务在识别文件的类型是靠后缀名或文件内容的,如果识别不了,浏览器将提示下载该文件。

如果我想将脚本的执行结果返回给客户端将怎么做呢?

  使用CGI,CGI的工作机制:

    当用户请求的文件只一个脚本时,内核将文件加载至用户空间,通过CGI交给该脚本的执行环境,

执行环境将执行结果返回给httpd,httpd再返回给用户

  CGI是不安全的,很多程序的实现,要求具有SUID或SGID权限;现在web站点一般都不用,很早以前mail服务可能还会使用,实现起来简便

  现在开发动态网站,脚本和前端通信时都不基于CGI了,比如php使用SAPI,python使用UWSGI

实现CGI功能的模块:

   mod_alias   #使用Alias功能

   mod_cgi    #实现CGI协议

ScriptAlias /URL/ "/path/to/somewhere/"  

  somewhere下的文件要有执行权限

  也可以在Direcotry容器中使用ExecCGI属性定义实现

例子:使用bash脚本通过CGI,将脚本的执行结果返回给用户

#使用配置文件中默认ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"配置
[[email protected] ~]# 
[[email protected] ~]# cd /var/www/
[[email protected] www]# ls
cgi-bin  error  html  icons
[[email protected] www]# cd cgi-bin/
[[email protected] cgi-bin]# ls
[[email protected] cgi-bin]# vim test.sh 

[[email protected] cgi-bin]# cat test.sh 
#!/bin/bash
#
cat << EOF
Content-Type: text/html

<pre>
The time is : `date`.
</pre>

EOF
[[email protected] cgi-bin]# chmod +x test.sh
[[email protected] cgi-bin]# ./test.sh 
Content-Type: text/html               #脚本的执行结果第一行一定得为这个,才符合CGI的规范
                                      #这里一定得使用空白行,否则执行不了,报500
<pre>
The time is : Fri Jan 13 23:50:42 CST 2017.
</pre>

[[email protected] cgi-bin]#

【httpd】02、httpd配置详解

14、基于用户的访问控制(表单认证)

虚拟用户:非系统用户,只是为了访问某个服务的资源所使用的认证标志

质询:WWW-Authenticate

    服务器用401状态拒绝客户端请求,说明需要用户提供用户名和密码,弹出对话框:

认证:Authorization:客户端用户填入帐号密码后再次发请求至服务器,认证通过,则请求授权

认证时httpd服务器上的帐号和密码保存在哪?

  文件,不安全,不易管理

  Idap轻量级目录服务访问协议 

  SQLDB:

  dbm:

认证类型(auth):

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

  digest:摘要认证,hash编程之后发送,大多数浏览器不支持

认证提供者(authentication provider):帐号和密码的存放位置,默认是文件;authn

授权机制(authorization):根据什么进行授权(根据用户还是组什么的授权)

安全域需要用户认证后方能访问的路径,应该有其名称,用户向用户通知此认证的原因等


案例:认证机制的实现

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

1)定义安全域

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

   Options None

   AllowOverride AuthConfig

   AuthType Basic 使用基本认证

   AuthName "Private Area" 质询时的标题(提示信息)

   AuthBasicProvider file  # 不写也可以,默认使用的就是文件

   AuthUserFile /etc/http/conf/.htpasswd  认证文件的存放位置

   Require valid-user 可访问的用户:所有位于AuthUserFile文件中定义的用户都允许登录

 </Directory>

   Require另一种实现方式:Require user tom jerry...:仅允许user1,user2等出现AuthUserFile文件中定义的特定几个用户登录       

2)提供用户的帐号文件 

   使用htpsswd命令用于维护此文件

[[email protected] ~]# rpm -ql httpd-tools
/usr/bin/ab
/usr/bin/htdbm
/usr/bin/htdigest
/usr/bin/htpasswd
/usr/bin/logresolve
/usr/share/doc/httpd-tools-2.2.15

[[email protected] ~]# htpasswd --help
Usage:
	htpasswd [-cmdpsD] passwordfile username
	htpasswd -b[cmdpsD] passwordfile username password

	htpasswd -n[mdps] username
	htpasswd -nb[mdps] username password
 -c  Create a new file.
 -n  Don't update file; display results on stdout.
 -m  Force MD5 encryption of the password.
 -d  Force CRYPT encryption of the password (default).
 -p  Do not encrypt the password (plaintext).
 -s  Force SHA encryption of the password.
 -b  Use the password from the command line rather than prompting for it.
 -D  Delete the specified user.
On Windows, NetWare and TPF systems the '-m' flag is used by default.
On all other systems, the '-p' flag will probably not work.

htpasswd 

  -c 创建认证文件,后续创建其它用户时,不需要加-c,加了会重新创建认证文件并覆盖原文件

  -s 以sha格式加密存放

  -m MD5格式加密存放

  -b 批量模式

  -D 删除用户

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

[[email protected] conf]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
New password: 
Re-type new password: 
Adding password for user tom
[[email protected] conf]# ls -a
.  ..  .htpasswd  httpd.conf  magic
[[email protected] conf]# cat .htpasswd 
tom:$apr1$c5.gBsiS$0mTbCKvwApYJDqFsl/xAE0

3)基于组认证

 <Directory "/www/htdocs/fin">

    Options None

    AllowOverride AuthConfig

    AuthType Basic 使用基本认证

    AuthName "Private Area" 质询时标题

   AuthUserFile /etc/http/conf/.htpasswd

    AuthGroupFile /etc/http/conf/.htgroup

    Require group GroupName  可访问的组

</Directory>

组文件的格式:(手动创建)

  每行定义一个组

    先创建用户,再创建组

      组名1:用户1 用户2 用户3

【httpd】02、httpd配置详解

15、虚拟主机

  一个物理服务器可以服务于多个站点,每个站点可通过一个或多个虚拟主机来实现

httpd三种类型的虚拟主机:

     基于IP(代价昂贵)

     基于PORT(很少用)

     基于FQDN(最常用),在httpd-2.2版本中需要启用NameVirtualHost *:80

注意:启用虚拟主机得先关闭“main server" 中心主机

        #经测试不关闭也可以,但如果80端口被虚拟主机占用了,那么中心主机访问不了,需要在配置文件中监听多个端口(有没被虚拟主机占用的端口)即可,即虚拟主机的优先级更高

   方法:注释DocumentRoot指令即可        

定义虚拟主机的方法:

 <VirtualHost "IP:port">

    ServerName   (不基于主机名做虚拟主机时可不写)

    ServerAlias  (可不写)

    DocumentRoot  (一定要写)

   <Directory "">

      Options

   </Directory>

 </VirtualHost>

注意:

  大多数可用全局或‘main’server中的指令,都可以定义有Virtualhost中        

  配置所使用的IP和PORT都要是已经被监听的

  虚拟主机可以创建多个

 中心主机、基于IP、基于端口、基于FQDN都可以混用

下面的实验环境是没有注销中心主机,也没有修改中心主机的配置:

添加监听8080端口:

#Listen 12.34.56.78:80
Listen 80
Listen 8080

1)基于ip的虚拟主机

<VirtualHost 192.168.10.5:80>
 DocumentRoot "/web/a.com/html"

</VirtualHost>

【httpd】02、httpd配置详解【httpd】02、httpd配置详解

 2)基于端口

<VirtualHost 192.168.10.4:8080>
 DocumentRoot "/web/a.com/html"

</VirtualHost>

【httpd】02、httpd配置详解【httpd】02、httpd配置详解

 3)换用IP和PORT

<VirtualHost 192.168.100.5:8080>
 DocumentRoot "/web/a.com/html"

</VirtualHost>

【httpd】02、httpd配置详解【httpd】02、httpd配置详解

【httpd】02、httpd配置详解【httpd】02、httpd配置详解

 4)基于FQDN

<VirtualHost *:80>
 ServerName www.a.com
 DocumentRoot "/web/a.com/html"

</VirtualHost>

【httpd】02、httpd配置详解

测试中我们发现中心主机和基于IP,PORT,FQDN都可以混用:

<VirtualHost *:8080>
 ServerName www.a.com
 DocumentRoot "/web/a.com/html"

</VirtualHost>

【httpd】02、httpd配置详解【httpd】02、httpd配置详解

额外经常用于每个虚拟主机的配置有:

  ErrorLog

  CustomLog

  <Director>

  <Location>

  ServerAlias  


16、https协议的实现

http over ssl = https 

http 文本格式

https 二进制格式

ssl:v3 Secure Socket Layer

tls:v1 Transport Layer Security

http:文本协议,80/tcp

https:二进制格式的协议,443/tcp


ssl会话的简化过程:

1、tcp三次握手建立虚连接

2、ssl会话协商

 1)客户端发送可供选择的加密方式(tcp第三次握手时)

 2)服务器端发送证书和选定的加密方式给客户端

 3)证书验证

     如果信任给其发证书的CA:

       a、验证证书的合法性,用CA的公钥解密证书上的数字签名

       b、验证证书的内容的合法性,

       c、检查证书的有限期限

       d、证书是否已被吊销

       e、证书中拥有者的名字,与访问的目标主机要一致

  4)客户端生成临时会话**(对称**),并使用服务器端的公钥加密此数据发送给服务器,完成**交换

  5)服务器用此**加密用户请求的资源,响应给客户端

注意:ssl会话是基于IP地址创建,不支持基于FQDN的虚拟主机;所以单IP的主机上,仅可以使用一个https虚拟主机


案例:基于mod_ssl模块实现对ssl的支持

 1)为服务器申请数字证书

通过私有CA获取证书:

    1)创建私有CA

    2)在服务器创建证书签署请求

    3)CA签证

 2)配置httpd支持使用ssl,及使用的证书

    # yum -y install mod_ssl

[[email protected] conf]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem

 3)编辑配置文件:/etc/httpd/conf.d/ssl.conf配置使用ssl的虚拟主机:

      启用  DocunmentRoot

      启用  ServerName

配置证书和私钥:

      SSLCertificatFile      证书文件

      SSLCertificatKeyFile   **文件(私钥)

 4)重启httpd服务

 5)测试

GUI:测试基于https访问相应的主机【httpd】02、httpd配置详解

  在客户端导入CA的公钥就没有此警告信息了。

CLI: openssl s_client -connect 验证的服务器地址:端口(443) [-cert 自己的证书路径] -CAfile CA证书的路径


16、URL Rewrite:URL重写

  httpd的URL重写功能很强大,也很复杂,但直接在httpd上直接配置URL重写很少,httpd一般作为后端服务器,通常都是在前端的反向代理器上配置URL重写,所以到学习nginx时,再学习配置URL重写


17、服务器内置的status页面

 mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。

这些数据通常包括但不限于:

(1) 处于工作状态的worker进程数;

(2) 空闲状态的worker进程数;

(3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数;

(4) 当前服务器总共发送的字节数;

(5) 服务器自上次启动或重启以来至当前的时长;

(6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数;

查看是否装载了该模块:

[[email protected] html]# httpd -M|grep status
  status_module (shared)
 Syntax OK

内生的status信息,且此信息可以通过 web予以显示

处理器:是当文件被调用时,Apache内部的表示形式,一般每种文件类型都有自己的隐式处理器

显示的定义使用的处理器:SetHandler

启用status页面只要取消注释和定义访问控制即可:

<Location /server-status>

    SetHandler server-status

#    Order deny,allow

#    All from all

</Location>

此信息不应该让别人看见,建议做用户认证

【httpd】02、httpd配置详解

服务器版本信息,

服务器安装时间

服务器当前时间,

服务器重启时间(最近一次启动(或重新加载配置文件的的时间)

父服务器生成时间:重新加载一次配置文件即+1

服务器运行时间

各工作进程状态:

  总共256个工作进程   _:空闲表示等待连接,S:表示启动,R:表示读取客户端请求

                W:正在发送响应报文,K:表示长连接,D:DNS查询,.:没有启动的工作进程

已启动的各工作进程的PID及状态