1.HTTP协议简介

HTTP(HyperText Transfer Protocol,超文本传输协议)是Internet上应用最为广泛的一种网络协议,所有的WWW文件都必须遵循这个标准。HTTP是一个客户端和服务器端请求和应答的标准。通过web浏览器或其他的工具,由HTTP客户端使用URL发起一个请求,建立一个到服务器指定端口的TCP连接。

tcp:传输控制协议,面向连接的协议;通信前需要建立虚拟链路;结束后拆除链路

udp:User Datagram Protocol,无连接的协议

0-1023:众所周知,永久的分配给固定的应用使用,特权端口

1024-41951:亦为注册端口,但要求并不是特别严格,分配给程序注册为某应用使用

41952+:客户端程序随机使用的端口;动态端口,或私有端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range

HTTP/1.1定义了7种动作来表明Request-URI指定资源的不同操作方式,如下


GET:从服务器获取一个资源;

HEAD:只从服务器获取文档的响应首部;

POST:向服务器发送要处理的数据;

PUT:将请求的主体部分存储在服务器上;

DELETE:请求删除服务器上指定的文档;

TRACE:追踪请求到达服务器中间经过的代理服务器;

OPTIONS:请求服务器返回对指定资源支持使用的请求方法;

HTTP服务器回应客户端状态码主要有以下几个

  • 1xx:100-101, 信息提示;

  • 2xx:200-206, 代表请求已被成功接收

  • 3xx:300-305, 重定向,指明后续的请求地址

  • 4xx:400-415, 错误类信息,客户端错误

  • 5xx:500-505, 错误类信息,服务器端错误

常用的状态码:

200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK

301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently

302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found

304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified

401: 需要输入账号和密码认证方能访问资源;Unauthorized

403: 请求被禁止;Forbidden

404: 服务器无法找到客户端请求的资源;Not Found

500: 服务器内部错误;Internal Server Error

502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway

2.常见的web服务器

  • Apache http server

  • Lighttpd

  • IIS

  • Nginx

  • Zeus web server

  • Sun ONE

3.Apache http server是一个开源的WEB服务器,可以在大多数的操作系统中运行。

4.Apache的安装

  • rpm方式

    rpm -ivh httpd-2.2.3-11.e15_1.3.i386.rpm

  • yum方式

    yum install httpd  -y

5.常规配置

5.1Apache服务的相关命令

service httpd start  启动

service httpd restart 重启

service httpd stop  停止

service httpd status 状态

service httpd reload 重载

5.2Apache服务的自启动

chkconfig httpd on

chkconfig httpd off

chkconfig httpd --level 35 on

chkconfig httpd --level 35 off

5.3配置文件

wKioL1YnPAaBQiorAAKsU68kksY438.jpg

主配置文件/etc/httpd/conf/httpd.conf由3部分组成

  • Global Environment:全局配置

  • Main server configuration:主服务配置

  • Virtual Hosts:虚拟主机配置

5.4查看Apache载入的模块,httpd -M

wKiom1YnPMzTlN8JAAGJp_iD-LU771.jpg

5.5在Apache中可通过容器Directoy,File,Location对配置或某个虚拟主机进行控制,常见的容器是文件系统和网络空间

  • 文件系统使用的格式:

    <Directory />

   参数

  </Directory>


  • 网络空间格式:

    <Location  路径>

    参数

    </Location>

5.6apache的简单配置,编辑/etc/httpd/conf/httpd.conf,定义根目录DocumentRoot "/data/web/html",这个目录必须在本机存在的,在这个目录下我们可以放入以html结尾的文件。

wKioL1YqVRax1hc_AAA3zReRjjk361.jpg

启动httpd服务,

[root@lys html]# service httpd start

wKioL1YqVeXT9kcoAACnj2vce4g802.jpg

确实监听在80端口了。然后我们可以打开浏览器,默认会打开index.html这个页面

wKiom1YqVUvDZ0QNAACAHnT_VVg316.jpg

  • 指定监听地址和端口:默认是Listen [IP:]80

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

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

     Listen 192.168.108.5:80

     Listen 192.168.108.5:8080

  • 持久连接相关:持久连接:连接建立后,每个资源获取结束不会断开连接,而继续等待其它资源请求并完成传输,非持久连接:每个资源都是单独通过专用的连接进行获取

    KeepAlive Off|On       是否持久连接

    MaxKeepAliveRequests 100 在持久连接期间,所允许的最大请求数量

    KeepAliveTimeout 15    在同一个客户连接中,下一个请求的等待时间

  • MPM

    多路处理模块:并发请求响应的不同实现,主要有三种模式prefer,worker,event

    prefer:一个主进程,生成多个子进程,每个子进程处理一个请求

    worker:多个主进程生成多个子进程,子进程又生成多个线程,每个线程处理一个请求

    event:一个主进程生成多个子进程,每个子进程处理N个请求

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

  httpd -M: 查看所有模块,包括静态编译和DSO模块

wKioL1YqVlPyoAOLAAGXCi6LyeY797.jpg

  

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

StartServers       8  //指定apache启动时httpd的进程数  

MinSpareServers    5  //apache保持的最小空闲线程数

MaxSpareServers   20  //apaceh保持的最大空闲线程数

ServerLimit      256  //指定apache允许配置同时处理的客户端请求的最大值

MaxClients       256 //指定apache可以同时处理的客户端最大请求数

MaxRequestsPerChild  4000 //每个子进程的最大被请求数

</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  //指定apache启动时httpd的进程数

MaxClients         300  //指定apache可以同时处理的客户端最大请求数

MinSpareThreads     25   //apache保持的最小空闲线程数

MaxSpareThreads     75   //apaceh保持的最大空闲线程数

ThreadsPerChild     25   //指定每个子进程的最大线程数

MaxRequestsPerChild  0    

</IfModule>

  • DSO  

 配置指令模块加载:

 LoadModule <module_name> <module_path>

  • DocumentRoot指向的路径为URL起始的位置

  • Directory中的访问控制定义

    (1) Options

    Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用;

    FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容;

    None: none

    All: 所有的都启用;

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

    Order: 检查次序

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

    Order Deny Allow: 

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

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

    Order Allow Deny

    Deny from 172.16.100.2

    Allow from 172.16.0.0/16

  • 定义默认的主页面

    DirectoryIndex index.html index.html.var dtefault.html自左而右,找到首次匹配到的文件;就将其做为默认主页面返回

  • ErrorLog logs/error_log 错误日志的格式

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

  • 路径别名主目录名是DocumentRoot "/var/www/html"

    Alias /URL/ "/path/to/some_directory"

    例如:Alias /bbs/ "/web/bbs/htdocs/"

    URL: http://www.magedu.com/bbs/index.html --> /web/bbs/htdocs/index.html

  • AddDefaultCharset UTF-8  选定字符集,常用字符集:GBK, GB2312, GB18030

  • 基于用户的访问控制

    <Directory "/data/web/html/employee"> 

    options None

    AllowOverride None

    AuthType Basic

    AuthName "Employee information, only for employee"

    AuthUserFile /etc/httpd/users/.htpasswd

    Require user tom ,jeery

    </Directory>

http协议支持的认证方式:basic,digest两种。basic认证的实现

  1. 定义安全域

    <Directory "/data/web/html/employee"> 

    options None

    AllowOverride None

    AuthType Basic

    AuthName "Employee information, only for employee"

    AuthUserFile /etc/httpd/users/.htpasswd

    Require user tom ,jeery

    </Directory>

2. 提供用户账号文件

htpasswd命令用于维护此文件

htpasswd [ -c ] [ -m ] [ -s ] [ -D ] passwdfile username

-c: 添加第一用户时创建此文件;

-m: 以md5格式加密用户密码存放;

-s: 以sha格式加密用户密码存放;

-D:删除指定用户

实现方法:第一步创建用户目录mkdir /etc/httpd/users。然后新建用户

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

htpasswd  -m /etc/httpd/users/.htpasswd jerry

wKiom1YqWbCw_3VEAABGiYM-Y_E390.jpg

wKioL1YqWfyjYteBAABTMfs6afU483.jpg

用户及密码文件都生成了,接下来重载服务

service httpd reload  


wKioL1YqWoHRazSxAAHS2W4o__4482.jpg

输入用户名和密码就能进入页面了。

wKioL1YqWszyF_v0AAB07MSPdo4245.jpg


  • 虚拟主机:一个物理器可以服务于多个站点,每个站点可通过一个或多个虚拟主机来实现.这里要注意几个问题,第一就是启用虚拟主机必须先注释DocumentRoot "/data/web/html",第二启用NameVirtualHost 192.168.108.6:80。

1.基于IP

<VirtualHost 172.16.100.11:80>

ServerName www.a.com

DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

<VirtualHost 172.16.100.21:80>

ServerName www.b.org

DocumentRoot /vhost/b.org/htdocs/

</VirtualHost>


2.基于端口

<VirtualHost 172.16.100.11:80>

ServerName www.a.com

DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

<VirtualHost 172.16.100.11:808>

ServerName www.b.com

DocumentRoot /vhost/b.com/htdocs/

</VirtualHost>

3.基于FQDN

NameVirtualHost 172.16.100.11:80

<VirtualHost 172.16.100.11:80>

ServerName www.a.com

DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

<VirtualHost 172.16.100.11:80>

ServerName www.b.org

DocumentRoot /vhost/b.org/htdocs/

</VirtualHost>

wKiom1YqXJiCjuXhAABZTtVGEOw579.jpg

这里只演示基于FQDN的虚拟主机,因为没有www.a.com的解析,想要在浏览器中打开,必须修改hosts文档,如下。

wKiom1YqXWnTjIB6AAEQjjxDBPg870.jpg

  • 内置的status页面

<Location /server-status>

SetHandler server-status

Order deny,allow

Deny from all

Allow from 172.16.0.0/16

</Location>

wKioL1YqXSfxbvc-AAZ3tosifcA851.jpg

  • curl命令

curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

curl [options] [URL...]

curl的常用选项:

-A/--user-agent <string> 设置用户代理发送给服务器

-basic 使用HTTP基本认证

--tcp-nodelay 使用TCP_NODELAY选项

-e/--referer <URL> 来源网址

--cacert <file> CA证书 (SSL)

--compressed 要求返回是压缩的格式

-H/--header <line>自定义头信息传递给服务器

-I/--head 只显示响应报文首部信息

--limit-rate <rate> 设置传输速度

-u/--user <user[:password]>设置服务器的用户和密码

-0/--http1.0 使用HTTP 1.0

[root@lys html]# curl -A "IE" http://192.168.108.6

www.a.com

wKioL1YqX6qBfO3GAAHwj1xniqc179.jpgwKioL1YqYAniRkU6AADmCkdrv3A735.jpg

  • https

SSL会话的简化过程

(1) 客户端发送可供选择的加密方式,并向服务器请求证书;

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

(3) 证书验正:

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

(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

(b) 验正证书的内容的合法性:完整性验正

(c) 检查证书的有效期限;

(d) 检查证书是否被吊销;

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

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

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

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

配置httpd支持https:

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

测试:通过私建CA发证书

(a) 创建私有CA

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

(c) CA签证

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

# yum -y install mod_ssl

配置文件:/etc/httpd/conf.d/ssl.conf

DocumentRoot

ServerName

SSLCertificateFile

SSLCertificateKeyFile

(3) 测试基于https访问相应的主机;

# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

  • 第一步:使用OpenSSL构建私有CA:

  • 1、生成私钥。

  • 2、生成自签署证书;

  • (1) 私钥用于签发证书时,向证书添加数字签名使用;

  • (2) 证书:每个通信方都导入此证书至“受信任的证书颁发机构”;

  • 配置文件:/etc/pki/tls/openssl.cnf

  • 工作目录:/etc/pki/CA/

  • 建立私有CA:

  • 1、生成私钥文件: /etc/pki/CA/private/cakey.pem

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

  • wKioL1YfjOLCH-WSAASgYDOQrC4499.jpg

  • 2、生成自签证书

  • # openssl req -new -x509 -key private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365 

  • wKiom1YfjT7i2C04AAVX2ebI3kw267.jpg

  • -new: 生成新的证书签署请求;

  • -key:私钥文件路径,用于提取公钥;

  • -days N: 证书有效时长,单位为“天”;

  • -out:输出文件保存位置;

  • -x509:直接输出自签署的证书文件,通常只有构建CA时才这么用;

  • 3、提供辅助文件

  • # touch /etc/pki/CA/index.txt

  • # echo 01 > /etc/pki/CA/serial

  • wKiom1YfjZnTD3FtAADuJCc3ybY792.jpg

  • 给节点发证书:我这边实验使用同一台主机,签发都在本机完成。

  • [root@lys ~]# rpm -q httpd      //查看本机是否安装httpd

  • httpd-2.2.15-26.el6.centos.x86_64

  • [root@lys ~]# cd /etc/httpd/

  • [root@lys httpd]# ll

  • total 8

  • drwxr-xr-x. 2 root root 4096 Oct 13 10:58 conf

  • drwxr-xr-x. 2 root root 4096 Oct 13 11:05 conf.d

  • lrwxrwxrwx. 1 root root   19 Jul 31 10:33 logs -> ../../var/log/httpd

  • lrwxrwxrwx. 1 root root   29 Jul 31 10:33 modules -> ../../usr/lib64/httpd/modules

  • lrwxrwxrwx. 1 root root   19 Jul 31 10:33 run -> ../../var/run/httpd

  • [root@lys httpd]# mkdir ssl     //新建一个ssl目录

  • 1、节点申请证书

  • 在证书申请的主机上进行如下步骤:

  • (1) 生成私钥;

  • [root@lys httpd]# cd ssl/

  • [root@lys ssl]# (umask 077;openssl genrsa -out httpd.key 2048) //生成私钥,保存为httpd.key

  • Generating RSA private key, 2048 bit long modulus

  • ..................................................................................................+++

  • ................................................................................+++

  • e is 65537 (0x10001)

  • [root@lys ssl]# ll

  • total 4

  • -rw------- 1 root root 1679 Oct 15 18:49 httpd.key

  • (2) 生成证书签署请求;

  • wKiom1Yfjw3CsRemAAHVj6p2aRY643.jpg

  • [root@lys ssl]# ll    //查看当前目录,确实生成了httpd.csr

  • total 8

  • -rw-r--r-- 1 root root 1001 Oct 15 18:54 httpd.csr

  • -rw------- 1 root root 1679 Oct 15 18:49 httpd.key

  • 注意:

  • (a) 其中的subject信息部分,要与CA的保持一致;

  • (b) Common Name要使用此主机在通信真实使用名字;

  • (3) 把请求发送给CA:

  • 2、CA签发证书

  • (1) 验正请求者信息

  • (2) 签署证书

  • # openssl ca -in /PATH/FROM/CSR_FILE -out /PATH/TO/CRT_FILE -days 365

  • wKiom1Yfj9jh4t96AAIlS5i8kKE661.jpg

  • [root@lys CA]# ls

  • cacert.pem  crl        index.txt.attr  newcerts  serial

  • certs       index.txt  index.txt.old   private   serial.old

  • [root@lys CA]# cat index.txt    

  • V 161014105825Z01unknown/C=CN/ST=Wuhan/O=MageEdu/OU=Ops/CN=www.magedu.com

  • [root@lys CA]# ls newcerts/

  • 01.pem

  • [root@lys CA]# cd certs/

  • [root@lys certs]# ll

  • total 8

  • -rw-r--r-- 1 root root 4446 Oct 15 19:00 www.magedu.com.crt

  • (3) 把签署好的证书发还给请求者

  • [root@lys certs]# cp www.magedu.com.crt /etc/httpd/ssl/

  • [root@lys certs]# cd /etc/httpd/ssl/ 

  • [root@lys ssl]# ll               //已收到CA签署好的证书

  • total 16

  • -rw-r--r-- 1 root root 1001 Oct 15 18:54 httpd.csr

  • -rw------- 1 root root 1679 Oct 15 18:49 httpd.key

  • -rw-r--r-- 1 root root 4446 Oct 15 19:03 www.magedu.com.crt

这里为了试验需要我把www.magedu.com改名为httpd.crt

第二步:配置httpd支持使用ssl,及使用的证书

配置文件:/etc/httpd/conf.d/ssl.conf,修改以下5个地方即可:

DocumentRoot "/vhosts/a.com/htdocs"

ServerName www.a.com:443  

<VirtualHost *:443> 

SSLCertificateFile /etc/httpd/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

保存退出。

第三步:测试基于https访问相应的主机,在此之前,我们需要把证书安装到IE浏览器中去

wKiom1YqZv7BXULtAABh6i93VM4177.jpg