HTTPD 服务 http与https的实现


     Httpd是由ASF(apache software foundation)维护的开源项目之一 也是目前最为流行的web服务器之一 目前有三个维护版本 分别为2.1 2.2 2.4 特性丰富:高度模块化的设计 出色的稳定性 支持OSD 丰富的第三方插件

    基于TCP的socket通信的网络模型

wKioL1Pnbw3ht387AAJH04iLzYo762.jpg

    服务端启动进程创建调用socket()创建套接字设备 然后调用bind()绑定地址调用listen()监听众所周知的端口号调用accept()阻塞等待连接请求  客户端创建套接字设备发起tcp连接请求等到连接建立 服务收到套接字设备的写入数据开始读数据 一直循环直到读写结束(数据交换)客户端发起tcp断开请求服务端响应四次断开后 此次通信结束。

 

   安装httpd软件包 yum install httpd

wKioL1PnbzLzEgcwAAPGHtv7CCI190.jpg



软件结构

wKiom1PnbjWiAKPqAAGGPKKl5WU898.jpg

配置选项

Section 1: Global Environment 全局配置类:定义进程自己的工作特性及virtual host共享的参数

     1)ServerTokens OS:当访问页面不正常时在页面下方现实的web server及操作系统类型等信息 通常为了安全不启用

       

     2)ServerRoot "/etc/httpd" :服务脚本的根目录 在全局配置段都以此目录作为根目录

     3)PidFile run/httpd.pid   :脚本pid文件所在目录 相对路径根为ServerRoot所定义的目录

     4)KeepAlive Off :是否至此长连接

     5)MaxKeepAliveRequests 100 :最大常连接时一次连接允许请求的资源的最大个数

     6)KeepAliveTimeout 15 : 最大长连接时一次连接允许连接时间长度的最大数

     7)Timeout 60:超时时间 :当发送或接受数据 客户端无反应的超时时间

     8)prefork MPM:多进程模型 一个主控进程 有主控进程fork自己生成子进程响应客户端请求

                       <IfModule prefork.c>

                        StartServers       8 :预先启动的服务进程个数

                        MinSpareServers    5:空闲进程的区间      5=<spareservrer<=20

                        MaxSpareServers   20

                        ServerLimit      256 : 启动服务进程的最大个数

                        MaxClients       256:连接客户端的最大个数

                        MaxRequestsPerChild  4000 :每个启动的进程允许响应的次数的最大值

                        </IfModule>

9)worker MPM:多线程模型 生成多个进程 每个进程生成多个线程

               <IfModule worker.c>

                StartServers       4 :预先启动的服务进程个数

                MaxClients       300 :允许连接的最大客户端个数

                MinSpareThreads   25 :空闲线程的个数区间 25=<sparethead<=75

                MaxSpareThreads   75 :   

                ThreadsPerChild     25:  每个服务进程所启用的最大线程个数

                MaxRequestsPerChild  0:每个线程允许响应的请求个数 0表示不限制

               </IfModule>

10)Listen 80:监听的端口号 【可以有多个 用于创建基于端口号的虚拟主机】

11)LoadModule:动态装载模块

                     格式为:LoadModule    module_name  path_of_module

12)Include conf.d/*.conf :包含的配置文件

13)User apache

    Group apache

    进程运行的用户及组

 

Section 2: 'Main' server configuration主服务器配置段:用于定义主服务器工作特性

 

     1)ServerAdmin root@localhost :管理员邮箱地址 若有需要改成自己可用的邮箱地址

     2)ServerName www.stu.com:80  服务器名字 不填写进程回去反解当前域名若解析不成功会报错  并使用本机主机名但不影响进程使用

3)DocumentRoot "/var/www/html":主服务器站点根目录

4)<Directory “/var/www/html”>

     Options Indexs   FollowSymlinks  定义访问选项  Indexs 当站点根目录不存在时是否列出目录索引   FollowSymLinks 访问连接文件时是否跳转至源文件

     AllowOverride None  是否允许.htacess中的权限覆盖此权限模型

     Order allow , deny 权限顺序 先允许后拒绝

     Allow from all 允许所有网络地址访问

</Directory>

 

5)DirectoryIndex index.html index.html.var 定义主页文件 按顺序启用

6)AccessFileName .htaccess :是否启用每个目录自定义权限模型

7)TypesConfig /etc/mime.types:支持的MIME(多用途网络邮件扩展)类型

8)ErrorLog logs/error_log:错误日志

9)LogLevel warn:日志级别{debug, info, notice, warn, error, crit,alert, emerg.}

10)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

     自定义日志格式:LogFormat “格式” 格式名

         %h :客户端IP地址

         %l  :远程登录名

         %u :认证时输入的用户名

         %t  :响应时间

         %r  :请求报文方法是什么

         %>s  :响应的状态码

         %{Referer}i :从哪个连接跳转过来

         %b  : 响应报文的字节长度

         %{User-Agent}i :客户端浏览器及操作系统类型及版本

   12)CustomLog logs/access_log combined :访问日志的文件路径及格式

   13)Alias /icons/ "/var/www/icons/":目录别名 可以脱离/var/www/html 目录限制

   14)ScriptAlias /cgi-bin/ "/var/www/cgi-bin/":脚本路径别名

   15)    <Location /server-status>

       AuthType Basic  认证的类型

       AuthName "admin status" 认证名字 或 提示

       AuthBasicProvider file  认证的存类型

       AuthUserFile /etc/httpd/conf/.htpasswd 认证的文件在哪

       Require valid-user 认证要求的模式

       SetHandler server-status 设置内置的处理器

       </Location>

基于基本认证的权限匹配模型

 

Section 3: Virtual Hosts :虚拟主机配置段

 

1)NameVirtualHost 172.16.101.34:80:开启基于主机名的虚拟主机

2)<VirtualHost 172.16.101.34:80> 

      ServerAdmin webmaste@stu34.com

      DocumentRoot /web/vhosts/www1

      ServerName www1.stu34.com

      ErrorLog logs/www1.err

      CustomLog logs/www1.access common

      </VirtualHost>

Ssl 安全的套接字层

 通信模型

wKioL1Pnb9DggqHfAAECvmfy5Oc404.jpg

客户端发起请求 首先要建立tcp连接(三次握手)然后创建ssl会话过程是这样的 服务器向客户端发送加密的根证书 客户端解密验证根证书有效性(详情参考 数据加密解密 私有ca创建篇) 如果没有问题就建立连接而后所有过程基于ssl会话模式传输数据 此机制的建立是基于IP的一次一个IP只能对应一个ssl会话 因为服务器证书只有一个

    

 

实验:配置三种虚拟主机 并实现 server-status 使用基本认证实现用户的认证 创建https服务器


wKiom1PnbtzClqoZAAH7_oPhClE700.jpg

为了演示方便一次性创建所有要求内容

首先创建基于端口的虚拟主机

注释掉DocumentRoot项



wKiom1Pnbv-jcHE9AABIWrUcEXg895.jpg

首先开放多个端口

创建虚拟主机

wKiom1PnbzbwV7PJAAMEJUe3pdw980.jpg

客户端测试:


wKioL1PncH6RCLH3AAB2mvlHqMM097.jpg

wKiom1Pnb2XBJT_gAABoiIl6hUI334.jpg



基于IP虚拟主机

为服务器网卡配置另一个ip为172.16.101.35

Ifconfig eth0:0 172.16.101.35

wKiom1Pnb4XRStPbAADOUoI8JAE166.jpg


Echo “172.16.101.34” >/web/vhosts/ww1/index.html

Echo “172.16.101.35” >/web/vhosts/ww2/index.html

配置文件

wKioL1PncLuzipZmAAMc62trntU795.jpg


测试

wKioL1PncNiRZtYFAABTcD1-cWc360.jpg

wKiom1Pnb7_Tz2kjAABKzbtPD98481.jpg

创建基于主机名虚拟主机

Echo “Tis is www1.stu34.com” >/web/vhosts/www1/index.html

 

Echo “Tis is www2.stu34.com” >/web/vhosts/www1/index.html

配置文件如下

wKioL1PncPTxE8cJAAN25eNwNCE993.jpg


测试

修改win客户端的hosts文件添加如下解析

wKioL1PncR6AcT7pAAAygdmqmag011.jpg


wKioL1PncTWSnjw9AABZ7yU-uK4328.jpg

wKiom1PncBzTCdJlAABlQ2YtkV4547.jpg

基于basic认证的目录控制

编辑配置文件

wKioL1PncU7yOePbAAG1bo58Skw387.jpg


创建认证文件

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

wKioL1PncXCQgnz1AACCZUtzxlo979.jpg

测试

wKiom1PncHPiEJBvAAFSm5Uznsw662.jpg


输入帐号密码后

wKiom1PncJPj4XIdAALTXabJe4Y838.jpg


创建基于ssl的https服务

创建私有CA

(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

 Openssl  req  -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 1000

给http主机派发证书

  创建证书存放路径mkdir -pv /etc/httpd/ssl

 (umask 077 ;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

  生成证书请求

   Openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr 

  签署证书

   Openssl ca -in /etc/httpd/ssl/httpd.crs -out /etc/httpd/ssl/httpd.crt -days 1000

详情参考 加密解密过程及私有CA创建

 

首先安装mod_ssl模块

Yum install mod_ssl

Vim /etc/httpd/conf.d/ssl.conf

内容如下

wKiom1PncLvwxepaAAJ2-1Oup7g792.jpg

wKioL1PncdSSGXfvAAJ6BVL62Gw427.jpg


重启服务 测试

wKioL1PncfCxhfN-AAGoUhpowks115.jpg


本机不含有私有CA的公钥cacert.pem 将其导入即可不会出现此界面

至此已经可以使用https方式访问

 

源代码编译安装httpd-2.4

httpd-2.4的新特性:

1)MPM支持在运行时装载;

--enable-mpms-shared=all --with-mpm={prefork|worker|event}

2)正式支持event mpm

3)异步读写

4)在每模块及每目录分别使用不同的日志级别

5)增强版的表达式分析器

6)毫秒级的keep alive的timeout

7)基于FQDN的虚拟主机不再需要NameVirtualHost指令;

8)支持用户使用自定义变量

httpd程序依赖于apr和apr-util 首先安装这两个rpm包

Apr:apache portable runtime apache可移植运行环境

新增了一些模块:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip

 

修改了一些配置机制:不再支持使用order, allow, deny定义基于ip的访问控制;改为require

下载http-2.4源代码文件

./configure --prefix=/usr/local/apache 
--sysconfdir=/etc/httpd24 
--enable-so 
--enable-ssl 
--enable-cgi 
--enable-rewrite 
--with-zlib 
--with-pcre 
--with-apr=/usr/local/apr 
--with-apr-util=/usr/local/apr-util/ 
--enable-mpms-shared=all 
--with-mpm=event 
--enable-modules=most
Make && make install


配置文件大同小异