httpd服务深入剖析

    每天我们都要访问各种各样的网站,提供这些网站服务的web程序就是httpd软件,它是http协议的实现,是由Apache基金会维护的一个项目,http在互联网中有着举足轻重的地位,接下来,下面我就将依次介绍httpd的配置文件选项httpd实现虚拟主机httpd基于ssl做https、以及httpd的用户访问


httpd的配置文件选项解析

    ServerRoot "/etc/httpd"   :httpd服务的根目录

    Timeout 60 :默认响应时间

    KeepAlive Off:保持持久连接,即,连接请求时不断开,默认为Off。

    MaxKeepAliveRequests 100 :持久连接时,最大的请求数。

    KeepAliveTimeout 15:持久连接的响应时间,到达时间后,连接被断开。


    prefork:

<IfModule prefork.c>
StartServers       8    #服务启动时开启的进程数
MinSpareServers    5    #最小的空闲进程数
MaxSpareServers   20    #最大的空闲进程数
ServerLimit      256    #为MaxClient最多启动多少个进程数

MaxClients       256    #客户端同时允许处理的最大的进程数,并发连接数,小于上面的数

MaxRequestsPerChild  4000    #每个进程允许处理的最大的请求数,处理完后,进程结束。
</IfModule>


    work:

<IfModule worker.c>
StartServers         4    #服务启动时,开启多少个进程
MaxClients         300    #最大的连接数,即并发数
MinSpareThreads     25    #最小的空闲线程数
MaxSpareThreads     75    #最大的空闲线程数
ThreadsPerChild     25    #每个进程可以启动多少个线程数
MaxRequestsPerChild  0    #每个线程最大可以处理的请求数,0表示无限制

</IfModule>


监听的地址和端口:

Listen [IP]:PORT

系统默认为Listen 80,监听在80端口,没有地址表示监听所有地址


LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so

其实还不止这些,我只列出部分,表示可以动态装载的模块


Include conf.d/*.conf:httpd服务的配置文件包含/etc/httpd/conf.d下所有以.conf结尾的配置文件


User apache
Group apache

httpd服务启动后,切换到apache用户,apache组


DocumentRoot "/var/www/html"

这里表示的是站点的根目录,rpm包安装的都在此处


用户访问控制有关:

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

<Directory />:这里表示的是一个容器


Options后面的参数有:

Indexes :如果服务器目录下没有主页时,默认显示该目录中所有文件

All:所有目录属性都有效,为默认选项

None:所有目录属性都无效,只能浏览

FollowSymLinks:允许符号链接,如果存在这点,用户可能会访问到站点根目录之外的目录

ExecCGI:表示这个目录下,允许执行CGI程序



AllowOverride后面的参数有:

All:是访问文件可以覆盖系统配置

None:服务器忽略访问文件的配置

FileInfo:允许访问文件中可以使用AddType等参数

AuthConfig:允许访问控制文件使用AuthName和AuthType对用户的访问做策略

Limit:允许对访问目录的主机的IP地址和主机名做限制


Order allow,deny
Allow from all

allow是允许,deny表示拒绝

Order指定了两者的顺序

Allow from all:表示允许所有主机连接

以上的允许或拒绝后跟的可以是IP地址、网络。


httpd的日志有两种:

分别是访问日志和错误日志

错误日志:

ErrorLog logs/error_log    #定义了错误日志存放的位置

LogLevel warn:定义错误日志的级别

访问日志:以下是格式:

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

日志信息中的变量:

%h:表示客户端主机地址IP

%l:表示远程登录名,一般情况下为-

%u:表示在认证时,所要输入的用户名,无认证情况下为-

%t:表示服务器在接收到客户端请求的时间

%r:表示一个请求报文其实的行

%>s:表示客户端发出请求后,所得到的状态码

%b:这是响应报文的长度,默认为byte

%{HEADER_NAME}i:记录指定首部对应的值


虚拟主机的配置信息:

NameVirtualHost *:80

启用虚拟主机时,要将此处的#去掉,这个只在httpd2.2上有

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /www/docs/dummy-host.example.com
    ServerName dummy-host.example.com
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>

以上用<VirtualHost>这个容器封装起来了虚拟主机的各种配置,*号可以是IP地址,*表示监听所用

ServerAdmin:填写管理员的邮箱地址,在web无法提供服务时显示出来

DocumentRoot:这里定义了这个虚拟主机所在的目录

ServerName:服务名称,如果基于主机名的话,各个虚拟主机应该不一致

ErrorLog:错误日志的存放位置

CustomLog:访问日志的存放位置及定义的格式


httpd服务搭建:

1、基于CGI脚本实现动态页面的展示

    CGI的规范:

       Content-Type:text/html

       <pre>             #封装标签

       </pre>

它在httpd的配置文件上,是这样的:

ScriptAlias   /cig-bin    “/var/www/cgi-bin”

我们可以利用我们学过的bash写一个CGI脚本,实现动态内容的展示

#vim cgi.sh
#!/bin/bash
#This is a cgi scritp used in bash

cat << EOF
Content-Type: text/html

<pre>
<h1><font color=#0000FF> The time of now is:</font> <font color=#FFD306>$(date) </font></h1>
<h2><font color=#FF0000> Next show you the status of apache! </font> </h2>
Next show you status about apache:
$(ps aux | grep httpd )
<meta http-equiv="refresh" content="6";url="#" />
</pre>
EOF

然后,我们在浏览器上输入:IP/cgi-bin/cgi.sh

显示效果如下所示:

wKioL1PnUHawehUpAAIqEzJokig194.jpg

注意:这当中不能有特权指令,因为httpd执行的用户是apache,是非特权用户


基于用户做访问控制

    用户的认证方式:

    基本认证:基于明文的,basic

    摘要认证:基于密钥的,digest

  基于这种认证的用户并不是系统上的用户,而是虚拟的用户

  所谓的虚拟用户是用于某种服务或某种资源的凭证,这里是访问httpd资源的虚拟用户。

    可以指定一个文本文件:用户名是明文的,密码是加密的隐藏文件(.htpasswd)

认证和授权

      authentication provider:账号和密码的存储机制;

              httpd中简称为:authn

       authorization provider:授权提供者

              httpd中简称为:

没有基于表单的认证时,可以做基于站点的认证

     authn:存放用户的名和密码

      authz:存放的是用户可以访问的资源权限


以下为一案例:

创建要被认证的站点

[root@localhost ~]# cd /var/www/html/
[root@localhost html]# mkdir boss
[root@localhost html]# cd boss/
[root@localhost boss]# vim index.html
<h1>This is the boss area</h1>

更改配置文件,添加内容如下所示:

<Directory “/var/www/html/boss”>
     Options none
     AllowOverride AuthConfig  #做认证相关配置
     AuthType     Basic     #支持明文,一般浏览器不支持加密
     AuthName      “Boss place”        #认证前输出的提示信息
     AuthBasicProvider file               #默认为file,可有可无的
     AuthUserFile   /etc/httpd/conf/.htpasswd     #认证文件存放的位置
     Require user boss   #允许哪个用户登入,也可以为valid-user(合理的用户)
</Directory>

创建认证文件

默认情况下,httpd自带了一个这样的工具:htpasswd

常用选项:

-c:如果文件不存在,则创建,一般是第一次使用时添加

-m:以md5的形式编码存储用户的密码信息

#htpasswd�Cc �Cm /etc/httpd/conf/.htpasswd tom
#cat/etc/httpd/conf.d/.htpasswd
boss:$apr1$hkWjvT/U$F/YsSneENADpkG7iHl6Eb0

通过浏览器进行验证:wKioL1PnVrSQ21nxAAE3t51JxUQ050.jpg

输入用户名boss和密码之后

wKioL1PnVtSSzOZrAAC2_NDqptU062.jpg

这样基于用户的身份认证的实验就算成功了


虚拟主机

一个服务器只提供一个站点的服务器称之为主服务器,虚拟主机是一台物理主机可以提供多个站点

     区分不同的虚拟主机:虚拟主机间使用不同的访问路径

       基于端口:一般都是基于80端口,有冲突

       基于IP:可行,但是IP地址紧缺

       基于主机名:是现在用的比较多的一种虚拟主机方式

1、使用虚拟主机的前提,取消主服务器

       注释主服务的站点提供路径:DocumentRoot

2、定义虚拟主机

       <VirtualHostIP:PORT>

              ServerName

              DocumentRoot

              ServerAlias    

              ErrorLog

              CustomLog

       </VirtualHost >

    可以出现多次,定义多个虚拟主机

注意:httpd2.2特性,要启动基于主机名的虚拟主机要启用NameVirtualHost IP:PORT


案例:

1、基于端口上的虚拟主机,分别为80和8080

    在配置文件中添加:Listen 8080监听8080端口

    一定要注释掉DocumentRoot,否则实验不会成功

       <VirtualHost 172.16.30.10:80>

              ServerName  www.365lsy.com

              DocumentRoot “/web/host1/”

       </VirtualHost >

 

       <VirtualHost 172.16.30.10:8080>

              ServerName  www.365lsy.com

              DocumentRoot “/web/host2/”

       </VirtualHost >

创建上面的目录,分别在目录里添加主页

[root@localhost boss]# mkdir -pv /web/host{1,2}
[root@localhost web]# cd /web/host1
[root@localhost host1]# vim index.html
<h1>This is WEB 1</h1>
[root@localhost host1]# cd ../host2
[root@localhost host2]# vim index.html
<h1>This is WEB 2</h1>

做语法检查httpd�Ct或service httpd configtest

注意:如果后面直接检测是不会成功的,因为不能解析,所以,我们可以搭建一个DNS服务器或是把主机的hosts文件更改一下。

在hosts文件中加一条如:172.16.30.10    www.365lsy.com


启动服务后,在浏览器里检测:

wKioL1PnYAXAzxXXAABGvk-TvT4808.jpg

wKiom1PnXwCxlcRDAABJ9EE0TbE237.jpg


2、基于两个地址上做虚拟主机:172.16.30.10和172.16.30.20

[root@localhost ~]# ifconfig eth0:0 172.16.30.20

更改配置文件

<VirtualHost 172.16.30.10:80>

     ServerName  www.365lsy.com

     DocumentRoot “/web/host1/”

</VirtualHost >

 

<VirtualHost172.16.30.20:80>

     ServerName www.365lsy.com

     DocumentRoot “/web/host2/”

</VirtualHost >

然后在浏览器中输入ip地址做验证:

wKioL1PnZQ6wrltfAABB4JNY19k480.jpg

wKiom1PnZALS05arAABDuoIJ780714.jpg


3、基于主机名的虚拟主机:www.365lsy.com和mail.365lsy.com

<VirtualHost 172.16.30.10:80>

     ServerName  www.365lsy.com

     DocumentRoot “/web/host1/”

</VirtualHost >

 

<VirtualHost172.16.30.10:80>

     ServerName mail.365lsy.com

     DocumentRoot “/web/host2/”

</VirtualHost >

为了实验能成功完成,我们也要更改一下hosts文件,加上一条

172.16.30.10         mail.365lsy.com

验证配置文件后,重启服务

用浏览器验证虚拟主机是否能够被解析

wKiom1PnZumxedzeAABF4FvNTxs972.jpg

wKioL1PnaA-zkXjVAABF2MNBfZg356.jpg


httpd基于SSL做https

http协议:文本编码

可以用telnet向服务器发起请求

    由于这种传输是明文的,所以对于数据传输来说,是不安全的,在应用层和之间添加了半层SSL,应用程序可以用也可以不用。

    rpm包安装的httpd程序,要使用ssl需要安装一个模块:mod_ssl

    SSL会话是基于IP建立的,主机名只是在验证用户信息时,起了作用,如果有多台虚拟主机时,只能有一个台主机用SSL会话,所以,每个IP仅能够创建一个SSL会话。

步骤如下所示:   

    1、 安装mod_ssl

    2、 为服务器端生成私钥,并为其提供证书

    3、 配置实用https的虚拟主机

[root@localhost ~]# yum install -y mod_ssl

查看配置文件

在/etc/httpd/conf.d/下

访问日志为TransferLog Logs/ssl_access_log

重要的一个:

SSLCertificateFile  服务器端的证书文件

SSLCertificateKeyFile服务器端的私钥文件,解密客户端发过来加密的数据

<VirtualHost  _defualt_:443>可以更改IPPORT


建立CA服务器

[root@localhost ~]#(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

生成自签证书

[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:www.365lsy.com
Email Address []:[email protected]

准备文件

[root@localhost ~]#cd /etc/pki/CA
[root@localhost ~]#touch serialindex.txt
[root@localhost ~]#echo 01 >serial

为httpd建立私钥和证书

[root@localhost ~]#mkdir /etc/httpd/ssl
[root@localhost ~]#cd /etd/httpd/ssl
[root@localhost ~]#(umask 077;openssl genrsa -out httpd.key 2048)

生成请求

[root@localhost ~]#openssl req -new  -key httpd.key -out httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:mail.365lsy.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

签署证书

[root@localhost ~]#openssl ca -in  httpd.csr  -out httpd.crt -days 365

更改ssl对应的配置文件

[root@localhost ~]#cd/etc/httpd/conf.d/
[root@localhost ~]#vim ssl.conf            #更改下面的内容
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
DocumentRoot "/web/host1"
ServerName www.365lsy.com:443

更改配置文件之后,重启服务

在浏览器里输入:https://www.365lsy.com

wKiom1PncezgbNpCAACMpSRdgAQ470.jpg

下载证书,改名为.crt后缀,安装证书在本地

wKioL1Pnc86zAbdIAAFzyKaisqk139.jpg

关闭浏览器后,再次输入https://www.365lsy.com

wKiom1PncvWSErKKAABbr62o2eM455.jpg

实验成功,是通过https访问的


总结,到此处,我们的httpd2.2的讲解就结束了,下一次,我们将讲解httpd源代码的编译安装

你可能感兴趣的:(apache,Web,httpd)