1.HTTP协议简介

http是一种用于互联网数据传输的协议,其英文全称为Hyper Transfer Protocol。它是一种应用层协议。主要有requestresponse两种报文格式。http的出现和发展极大的促进了web网站的发展。互联网中的web服务器都是基于http协议来进行数据的传输的,web服务器运行时,其监听在tcp的80端口。

版本:

       早起出现的协议版本为http0.9。当服务器运行在该模式下时,客户端的每个请求都是单独存在的,服务器并不知道客户端请求的是一个页面,这样就就使得客户端的请求无状态化了;随着协议的发展,出现了http1.0,在改版中对该缺点进行了改进,并添加了保持连接的机制(keep-alive),这样就会使得客户端一次能够请求到一个完成的页面。同时该版本中引用了多用途互联网邮件扩展(MIME),这使得数据的传输过程变得规范化了。同时该版本中引入缓存的机制,这极大的加快了网站的响应速度。而这一优点在http1.1得到了更好的发展,新版本还提供了更多的请求方法,更精细的缓存控制以及持久连接的机制。这极大的促进了web服务器的发展。


2.HTTP协议报文描述

方法:http方法主要有以下几种,方便客户端的请求访问

GET        用于请求服务器端的主题
HEAD       只要求服务器返回响应首部,不需要返回整个主题
POST       用户客户端提交表单操作
PUT        上传,需要结合webdav实现
DELETE     删除
OPTIONS    用于返回请求资源所支持方法的方法
TRACE      跟踪从请求方到获得资源之间经过的代理服务器
#以上方法可以在浏览网页时按F12查看详细内容和过程

响应码:客户端在访问服务器时的返回状态

Linux学习之web服务器(1)--基于源码实现SSL的安全连接_http

报文格式:


报文格式:
    起始行
    首部
    主题(实体内容)
request报文:
    <method><request-URL><version>    #方法/请求目录/http协议版本
    <headers>                         #头部
    <entity-body>                     #实体内容
response报文:
    <version><status><reason-phrase>  #版本/状态码/原因
    <headers>                         #头部
    <entity-body>                     #实体内容利用

利用telnet观察上述参数:

[root@station1 ~]# telnet 172.16.0.1 80
Trying 172.16.0.1...
Connected to 172.16.0.1.
Escape character is '^]'.
GET /centos6.repo http/1.1                 #方法/请求目录/协议版本
Host: 172.16.0.1                           #主机
HTTP/1.1 200 OK                            #版本/状态码/结果及原因
Date: Thu, 22 Aug 2013 13:01:44 GMT        #日期
Server: Apache/2.2.15 (CentOS)             #服务器信息
Last-Modified: Sat, 17 Aug 2013 10:06:13 GMT
ETag: "20de6-12d-4e421db6ce2c1"
Accept-Ranges: bytes
Content-Length: 301
Connection: close
Content-Type: text/plain; charset=UTF-8
[base]                                     #返回请求内容                                  
name=CentOS $releasever $basearch on local server 172.10.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/centos-6.4-$basearch/
gpgcheck=0
[epel]
name=Fedora EPEL for CentOS$releasever $basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/fedora-epel/$releasever/$basearch/
gpgcheck=0
Connection closed by foreign host.



3.源码安装apache简介

了解了http工作的简单原理,下面我将向大家介绍一款web服务器的高性能工具apache服务器。在RHEL6.4的系统中自带的为httpd2.2版本,我们可以通过yum来安装,但是在实际的生产中还需要我们基于源码来实现。在这里我们以新出的httpd2.4的版本为例进行相关的讲解。

于apache2.4的新特性大家可以参考网站:

http://httpd.apache.org/docs/trunk/new_features_2_4.html

在安装apache源码之前,我们首先需要确定系统上的apr版本。默认RHEL6.4自带的apr版本太低不能使用,这里我们也采用1.4以上的版本进行源码编译,经笔者实践在安装apache的过程中会对pcre包产生依赖,我们先对其进行安装,过程如下:

1.源码安装:

[root@station1 ~]#yum -y install pcre-devel
(1) 编译安装apr
[root@station1 ~]#tar xf apr-1.4.6.tar.bz2
[root@station1 ~]#cd apr-1.4.6
[root@station1 ~]#./configure --prefix=/usr/local/apr
[root@station1 ~]#make
[root@station1 ~]#make install
(2) 编译安装apr-util
[root@station1 ~]#tar xf apr-util-1.5.2.tar.bz2
[root@station1 ~]#cd apr-util-1.5.2
[root@station1 ~]#./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@station1 ~]#make
[root@station1 ~]#make install
(3) 编译安装httpd
[root@station1 ~]#tar xf httpd-2.4.6.tar.bz2
[root@station1 ~]#cd httpd-2.4.6
[root@station1 ~]#./configure
--prefix=/usr/local/apache                #指定安装目录
--sysconfdir=/etc/httpd24                 #指定配置文件目录
--enable-so                               #启用模块化
--enable-ssl                              #开启ssl
--enable-cgi                              #启用cgi
--enable-rewrite                          #开启重写
--with-zlib                               #开启数据压缩传输
--with-pcre                               #指定pcre
--with-apr=/usr/local/apr
--with-apr-util=/usr/local/apr-util
--enable-modules=most
--enable-mpms-shared=all
--with-mpm=event                          #默认使用基于event模型
[root@station1 ~]#make
[root@station1 ~]#make install

2.获取启动脚本(可以利用之前系统自带的http2.2脚本进行更改获取)

[root@station1 ~]# cp /etc/rc.d/init.d/httpd  /etc/rc.d/init.d/httpd24
[root@station1 ~]# vim /etc/rc.d/init.d/httpd24     #修改如下
    apachectl=/usr/local/apache/bin/apachectl
    httpd=${HTTPD-/usr/local/apache/bin/httpd}
    prog=httpd
    pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}
[root@station1 ~]# service httpd24 startxiu

3.修改帮助文档和PATH环境变量并连接头文件

[root@station1 ~]#vim /etc/man.config
    MANPATH /usr/local/apache/man
[root@station1 ~]# vim /etc/profile.d/apache.sh
    export PATH=/usr/local/apache/bin:$PATH
[root@station1 ~]# ln -sv /usr/local/apache/include /usr/include/httpd


4.apache配置文件详解

基于源码安装后的apache的配置目录指定为/etc/httpd24目录下的。

其中httpd.conf为主配置文件,extra为额外配置文件,这与RHEL6.4系统上默认安装的apache2.2有很大区别,希望友友们多加注意。#

[root@station1 httpd24]# vim httpd.conf
ServerRoot "/usr/local/apache"        #文件中首先定义了服务器的根目录
Listen 80                             #设置服务器的监听端口
#LoadModule foo_module modules/mod_foo.so #用于需要功能的相关模块加载操作
LoadModule mpm_event_module modules/mod_mpm_event.so #默认工作在event模式,这在我们源码安装时指定的。我们可以在这里修改加载其它工作模型的模块
User daemon                           #默认启动进程的用户名
Group daemon                          #默认启动进程的组
ServerName 172.16.21.100:80           #指定服务器的域名,这里我们使用IP地址,如果你源码编译的apache需要首先修改该项,否则无法启动
DocumentRoot "/usr/local/apache/htdocs" #apache服务器默认的工作文档目录
<Directory "/usr/local/apache/htdocs"> #用于对目录权限进行限制
Options Indexes FollowSymLinks         #根据不同的需求设置选项Indexes表示索引文件,当请求的页面不存在会显示出该目录下的所有内容,FollowSymLinks设置是否在该目录下允许软链接
AllowOverride None                     #设置不允许进行覆盖
Require all granted                    #授权所有网段的用户访问
</Directory>                           #限制完成用该行结束
ErrorLog "logs/error_log"              #设置错误访问日志的存放目录
CustomLog "logs/access_log" common     #定义正确访问的日志信息
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" #做脚本别名

其它的额外功能可以通过extra目录中的文件进行定义

[root@station1 httpd24]# ls extra/
httpd-autoindex.conf  httpd-languages.conf           httpd-ssl.conf
httpd-dav.conf        httpd-manual.conf              httpd-userdir.conf
httpd-default.conf    httpd-mpm.conf                 httpd-vhosts.conf
httpd-info.conf       httpd-multilang-errordoc.conf  proxy-html.conf


5.案例实现apache服务器的简单应用

~建立httpd服务器(基于编译的方式进行),要求:

1.提供两个基于名称的虚拟主机:

   www1.magedu.com

       页面文件目录为/web/vhosts/www1

       错误日志为/var/log/httpd/www1.err

       访问日志为/var/log/httpd/www1.access

   www2.magedu.com

       页面文件目录为/web/vhosts/www2

       错误日志为/var/log/httpd/www2.err

       访问日志为/var/log/httpd/www2.access

2.为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;

3.通过www1.magedu.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);

4.www1主机仅允许172.16.0.0/16网络中的客户机访问;www2主机可以被所有主机访问;

~为上题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;

1.要求使用证书认证,证书中要求使用的国家(CN)、州(Henan)、城市(Zhengzhou)和组织(MageEdu);

2.设置部门为TECH,主机名为www2.magedu.com,邮件为admin@magedu.com;

3.此服务禁止来自于192.168.1.0/24网络中的主机访问;

详解:

1.详细的源码安装过程和主配置文件修改已在上文叙述,下面首先来进行虚拟主机的配置:

[root@station1 httpd24]# ls
extra  httpd.conf  magic  mime.types  original  ssl
[root@station1 httpd24]# vim httpd.conf     #取消注释以下三行
LoadModule ssl_module modules/mod_ssl.so    #ssl功能开启
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include /etc/httpd24/extra/httpd-vhosts.conf #启用虚拟主机配置文件
#接着编辑虚拟主机配置文件添加内容如下(这里会与2.2版本有部分区别):
[root@station1 httpd24]# cd extra/
[root@station1 extra]# vim httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/web/vhosts/www1"         #设置www1文档主目录
    ServerName "www1.magedu.com"            #设置服务器主机名
    <Directory "/web/vhosts/www1">          #对目录进行控制
        Options None
        AllowOverride none
        Require ip 172.16.0.0/16       #限定语序访问的IP,默认拒绝所有
    </Directory>
    CustomLog "/var/log/httpd/www1.access" combined  #自定义访问日志
    ErrorLog "/var/log/httpd/www1.err"      #自定义错误日志
       <Location /server-status>            #控制服务器状态的显示信息
        SetHandler server-status            #开启处理过程
        AuthName "server-status"            #设置认证名
        AuthType Basic                      #设置基本的认证类型
        AuthUserFile /etc/httpd24/.htpass   #设置验证用户文件
        Require user status                 #允许status用户进行访问
    </Location>
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "/web/vhosts/www2"         #设置主机www2的主目录
    ServerName "www2.magedu.com"            #设置www2主机名
    <Directory "/web/vhosts/www2">          #对主目录进行控制
        Options None
        AllowOverride none
        Require all granted                 #允许所有的用户访问
    </Directory>  
    CustomLog "/var/log/httpd/www2.access" combined  #定义访问日志
    ErrorLog "/var/log/httpd/www2.err"      #定义错误日志
</VirtualHost>

2.完成主页文件的设置并完成www1状态输出的加密工作。

#大部分的状态加密设置已经虚拟主机www1中的localtion选项中进行了设置,下面只需要生成用户status的密码文件。
[root@station1 ~]# cd /etc/httpd24/
[root@station1 httpd24]# htpasswd -cm .htpass status
New password:
Re-type new password:
Adding password for user status

3.在主机制作CA证书并完成对主机www2进行授

#CA证书制作
[root@station1 ~]# cd /etc/pki/CA/
[root@station1 CA]#(umask 077; openssl genrsa -out private/cakey.pem 2048)
[root@station1 CA]#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
[root@station1 CA]#touch index.txt
[root@station1 CA]#echo 01 > serial
#对apache服务器进行签署认证
[root@station1 ssl]#(umask 077; openssl genrsa -out httpd24.key 2048)
[root@station1 ssl]#openssl req -new -key httpd24.key -out mycert.pem
[root@station1 ssl]#openssl ca -in mycert.pem -out httpd24.crt -days 365

4.完成ssl相关的配置工作,完成整个项目工作。

[root@station1 ~]# cd /etc/httpd24/extra/
[root@station1 extra]# vim httpd-ssl.conf
Listen 443                                       #设置监听端口
SSLSessionCache   "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
<VirtualHost 172.16.21.100:443>                  #设置ssl加密主机
DocumentRoot "/web/vhosts/www2"                  #ssl加密文档主目录
ServerName 172.16.21.100:443                   
ServerAdmin admin@magedu.com
ErrorLog "/usr/local/apache/logs/error_log"      #错误日志
TransferLog "/usr/local/apache/logs/access_log"  #访问日志
 <Directory "/web/vhosts/www2">
        Options None
        AllowOverride none
        Require ip 172.16.0.0/16        #设置访问地址,默认拒绝所有
    </Directory>
SSLCertificateFile "/etc/httpd24/ssl/httpd24.crt"  #设置签署过的密钥
SSLCertificateKeyFile "/etc/httpd24/ssl/httpd24.key" #设置私钥的存放地址

5.重启服务器,并进行简单的访问测试

因为我们没有DNS服务器,所以在用浏览器测试之前需要先设置好当前主机的hosts文件

Linux学习之web服务器(1)--基于源码实现SSL的安全连接_status_02

服务器状态:

Linux学习之web服务器(1)--基于源码实现SSL的安全连接_http_03

测试SSL连接(需要实现在)本地主机安装CA的公钥:

Linux学习之web服务器(1)--基于源码实现SSL的安全连接_http_04

Linux学习之web服务器(1)--基于源码实现SSL的安全连接_apache_05