第一章  HTTP概述


一、概述

1、什么是HTTP?

HTTP:hypertext transfer protocl 超文本链接协议,所谓超链接就是将不同位置的超文本文件HTML进行快速的查找并读取。HTTP协议是一个规范,可以实现不同区域的用户直接可以实现超文本连接。实现的条件是tcp/ip协议、DNS服务、URL地址。

最初http协议的特点

1、无状态连接,不能够反映出连接时客户端的登录状态。

2、短连接,完成一次客户端请求报文就断开连接。

3、非安全传输。

4、一条链路上只发送一个请求

5、请求只能从客户端发起,客户端不能接受响应报文以外的报文。

6、HTTP首部信息非压缩,造成首部越来越大,传输延时大。

HTML和XML的区别

两者都是通用标记语言,用来修饰文本内容,但是XML更适合于对数据进行修饰。比如表单

2、RFC是什么?

RFC(request for comments,征求修正意见书):用于制定http协议标准的设计文档。

3、动态网站

客户端对服务器发送一个请求,这个请求需要服务器端进行计算后才能得出来,就可以成为动态网站。

3.1、客户端动态

方法:将动态处理过程放在客户端来执行的过程就称为客户端动态。

实现技术:applet(java)


3.2、服务器端动态

技术:CGI:通用网关接口 common gateway interface ,这个CGI接口就是http协议和能够处理用户需要计算的请求的程序之间的管道或中间件。换句话说就是服务器在接收到客户端发送过来的请求后转发给程序的一组机制,这里的程序是指由客户端发起的请求,由服务器端程序编写的代码需要又程序来进行解释。常用的CGI程序包括:PERL、PHP、RUBY、C等编程语言。

4、http请求方法: 

        get:下载 

        head:仅仅请求响应首部 

        post:上传、提交表单 

        options:返回资源请求使用方法的方法。,类似请求方法的man操作。 

        put:上传,依赖于webdav。 

        delete:依赖于webdav,删除。 

        trace:追踪一个资源所经过的代理服务器。 

         

[root@37-test ~]# curl 10.40.0.175 -v

* About to connect() to 10.40.0.175 port 80 (#0)

*   Trying 10.40.0.175... connected

* Connected to 10.40.0.175 (10.40.0.175) port 80 (#0)

> GET / HTTP/1.1

> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2

> Host: 10.40.0.175

> Accept: */*

< HTTP/1.1 303 See Other

< Server: nginx/1.0.6

< Date: Mon, 12 Dec 2016 01:27:48 GMT

< Content-Type: text/html

< Transfer-Encoding: chunked

< Connection: keep-alive

< Set-Cookie: PHPSESSID=943sje87u4dbod4e8j3d4pcko5; path=/

< Expires: Thu, 19 Nov 1981 08:52:00 GMT

< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

< Pragma: no-cache

< Set-Cookie: PHPSESSID=vq0ai9pib0mlgtc8m1p5nihfs3; path=/

< Location: http://10.40.0.175/home/auth/login?redirect=http%3A%2F%2F10.40.0.175

* Connection #0 to host 10.40.0.175 left intact

* losing connection #0

二、代理 和缓存
为客户端访问源服务器资源提供帮助,替代客户端完成数据请求。

1、分类:

1.1、按是否有缓存分

缓存代理服务器

无缓存代理服务 

2.1、按HTT缓存机制分

公共缓存:网页信息

私有缓存:个人账户密码等信息

2、代理和缓存的区别是什么?

客户端请求web服务,缓存服务器查看自己是否有请求内容,如果有就提供如果没有就不提供,而代理服务器是在用户提供请求的时候,代替客户端查询,并将查询结果返回给客户端,通常缓存和代理服务结合使用。 

如果仅仅提供缓存不提供代理,当自己没有资源可用,而是有用户去查询资源,并缓存用户资源的情况称为旁路缓存服务器。

3、http的状态码: 

  1、200:表示请求处理成功

2、204:表示请求处理成功,但响应内容中不包括主体的信息。

3、206:表示客户端发送了范围请求(断点续传),而服务器端也做出了正确响应。3

4、301:表示永久性重定向,客户端所请求的服务器端url已经发生了变化,服务器发送了新的url地址,并希望下次访问时使用此新地址。

5、302:临时性重定向

6、303:提示客户端使用的请求方法不合适,并提出建议,此次请求正确执行

7、400:客户端请求中存在着语法错误

8、401:表示对服务器的请求有认证要求,并提示认证失败。

9、403:表示客户端请求被服务器拒绝了。

10、404:服务器端无法找到客户端请求的资源

11、500:表示服务器端在执行请求时发生了错误

12、503:表示服务器目前处于高负荷、停机维护等状态,目前无法处理请求。

三、http报文首部


1、什么是HTTP报文首部

用于记录HTTP请求或者响应时需要提供的信息资料存放位置


2、分类

2.1、HTTP请求报文首部:

请求方法、URL、HTTP版本、HTTP首部字段等信息

361307.tmp

2.2、HTTP响应报文首部:

HTTP版本、状态码、HTTP首部字段

2.3HTTP首部字段的结构

由首部字段名和字段值构成,中间用冒号“:”分隔。

2.4HTTP首部字段的类型

2.4.1、通用首部字段

102444.tmp

855142.tmp

2.4.2、请求首部字段

963490.tmp

2.4.3响应首部字段

117750.tmp

2.4.4、实体首部字段

108515.tmp

988047.tmp

  

3、手动发送http请求信息

3.1、安装telnet

3.2、填写http首部信息

[root@37-test ~]# telnet 10.40.0.175 80

Trying 10.40.0.175...

Connected to 10.40.0.175.

Escape character is '^]'.

GET / HTTP/1.1

HOST:10.40.0.175


HTTP/1.1 303 See Other

Server: nginx/1.0.6

Date: Tue, 13 Dec 2016 07:59:22 GMT

Content-Type: text/html

Transfer-Encoding: chunked

Connection: keep-alive

Set-Cookie: PHPSESSID=340e3hnjvr20tsrrq55hdlreb4; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: PHPSESSID=cc2flkv34krodu52iqnm2rto56; path=/

Location: http://10.40.0.175/home/auth/login?redirect=http%3A%2F%2F10.40.0.175


4、一次http事务的完成过程: 

1、建立连接 

2、接收请求 

3、处理请求 

4、获取资源 

读取硬盘资源,需要I/O操作,需要系统内核先将资源从磁盘读到内核所占用的内存中,然后内核再将资源放到HTTP服务开启的进程所使用的内存空间上。

5、构建响应 

6、回送响应 

7、记录日志 

四、HTTP认证

1、basic认证

客户机发送链接请求到服务器

服务器发送认证要求

客户端提交用户名,密码并通过basic64进行编码

缺点是密码可以随意破解

2、digest(质询/响应)认证

客户机发送验证请求到服务器

服务器发送一个随机码给客户机,要求按此加密用户名、密码

客户机发送认证信息和加密信息。

相对basic认证,提高了密码的安全性,但同样不能认证客户机身份

3、SSL认证

客户机通过证书证明用户身份的认证方法,证书需要购买或者通过搭建证书服务器生成并管理。

4、双因素认证

认证方法采用两种认证,通常一方面认证计算机的身份,另外认证客户人的身份

5、表单(form)认证

最常用的认证方式,此认证方式有网站来认证,而不是通过http协议自身来认证(basic和digest是http协议自带的认证方式)。这样就造成了安全技术上的参差不齐。

6、keepalive认证

目前http协议都是默认采用keepalive连接的,那么他的认证就需要使用cookic,用户在首次进行认证后,服务器会发送一个cookieid号,来对于用户真实的账户密码,并发送给客户机,客户机在长连接时,需要再访问其他网页的时候,会在请求报文中发送cookieid来进行身份验证。

第二章 HTTP应用

一、应用程序

1、历史与相关程序

httpd、(apache)a patchy server 一个充满补丁的服务器,

            ASF:apache software foundation 隶属于一个软件基金会。同时还包括tomcat、cassandra、hadoop、lucene、cloudstack。 

nginx:主要做反向代理。 

lightttpd: 

2、应用程序服务器 

为完成http动态请求,需要计算处理编译脚本的应用程序。

IIS:windows 

tomcat:(apache ,jsp,opensource) 

websphere:商业的,IBM公司、支持JSP,commodity 

weblogic:oracle公司、支持jsp,commodity 

jboss:红帽 

3、apache特点

     高度模块化,支持正向、反向代理、缓存、认证等。 

        mpm:multipath processing module 多进程模块 

                perfork:一个进程响应一个请求 

                worker:一个进程生成多个线程,一个线程响应一个请求 

                event:事件驱动模式。 

主流版本: 

1.3:稳定,不提供维护 

2.0:接近1.3 

2.2: 

2.4: 

名词解释:

反向代理就是是网站通过一台机器发布到公网。。你访问的时候是直接访问那台代理机器的,然后通过那台机器才访问到网站。你无法得到网站的真实ip地址。这样的好处是保护了网站服务器,而且可以通过一个被动代理服务器将很多机器解析到同一ip地址。

二、httpd安装:

1、编译安装

./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd2.3 --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-modules=most --enable-mpms-shared=all --with-mpm=event 

APR和APR-UTILS主要是为不同平台提供相同的通用接口而产生的,默认情况下,linux是有安装这两个软件包的,所有在编译安装httpd的时候也可以同时编译安装新的apr软件。 

--enable-modules=most        ##指定装载模块的数量,静态加载模块,在编译时将模块直接放到httpd的程序中。通过httpd.conf的<ifmodule module.c>来管理。

<IfModule mod_dav_fs.c>

    # Location of the WebDAV lock database.

    DAVLockDB /var/lib/dav/lockdb

</IfModule>


-enable-mpms-shared=all    ##指定可以动态加载模块,模块没有加载到httpd程序中,启动httpd的时候不会加载此类模块,而是给一个module.so文件,需要loadmodule语法来加载。

# LoadModule foo_module modules/mod_foo.so

#

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

LoadModule authn_dbm_module modules/mod_authn_dbm.so

参考资料:http://blog.sina.com.cn/s/blog_6238358c01017gdu.html

1、添加编译安装的httpd的可执行命令的路径(环境 变量)

[root@gongbing ~]# vi /etc/profile.d/httpd.sh 

[root@gongbing ~]# . /etc/profile.d/httpd.sh 


2、检查当前apachectl命令是否是编译安装的路径。

[root@gongbing ~]# hash

hits command

   1 /usr/local/test/apache/bin/apachectl


3、执行apachectl命令

[root@gongbing ~]# apachectl start


4、查看当前运行模式(event)

[root@gongbing ~]# httpd -t -D DUMP_MODULES

Loaded Modules:

 core_module (static)

 so_module (static)

 http_module (static)

 authn_file_module (shared)

 authn_core_module (shared)

 authz_host_module (shared)

 authz_groupfile_module (shared)

 authz_user_module (shared)

 authz_core_module (shared)

 access_compat_module (shared)

 auth_basic_module (shared)

 reqtimeout_module (shared)

 filter_module (shared)

 mime_module (shared)

 log_config_module (shared)

 env_module (shared)

 headers_module (shared)

 setenvif_module (shared)

 version_module (shared)

 mpm_event_module (shared)

 unixd_module (shared)

 status_module (shared)

 autoindex_module (shared)

 dir_module (shared)

 alias_module (shared)



5、查看当前httpd相关详细信息。

[root@gongbing ~]# httpd -V

Server version: Apache/2.4.20 (Unix)

Server built:   Dec 23 2016 12:18:31

Server's Module Magic Number: 20120211:57

Server loaded:  APR 1.5.2, APR-UTIL 1.5.4

Compiled using: APR 1.5.2, APR-UTIL 1.5.4

Architecture:   64-bit

Server MPM:     event

  threaded:     yes (fixed thread count)

    forked:     yes (variable process count)

Server compiled with....

 -D APR_HAS_SENDFILE

 -D APR_HAS_MMAP

 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)

 -D APR_USE_SYSVSEM_SERIALIZE

 -D APR_USE_PTHREAD_SERIALIZE

 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT

 -D APR_HAS_OTHER_CHILD

 -D AP_HAVE_RELIABLE_PIPED_LOGS

 -D DYNAMIC_MODULE_LIMIT=256

 -D HTTPD_ROOT="/usr/local/test/apache"

 -D SUEXEC_BIN="/usr/local/test/apache/bin/suexec"

 -D DEFAULT_PIDLOG="logs/httpd.pid"

 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"

 -D DEFAULT_ERRORLOG="logs/error_log"

 -D AP_TYPES_CONFIG_FILE="/etc/httpd24/mime.types"

 -D SERVER_CONFIG_FILE="/etc/httpd24/httpd.conf"



6、修改脚本

[root@gongbing ~]# cp /etc/init.d/httpd  /etc/init.d/httpd24

[root@gongbing ~]# vi /etc/init.d/httpd24 

apachectl=/usr/local/test/apache/bin/apachectl

httpd=${HTTPD-/usr/local/test/apache/bin/httpd}


pidfile=${PIDFILE-/usr/local/test/apache/logs/httpd.pid}



7、额外的配置文件,通常编译安装的httpd程序,配置虚拟主机、默认配置、ssl、mpm等需要首先取消incloud相关的注释,然后到一下文件中配置才可。

[root@gongbing ~]# ll /etc/httpd24/extra/

总用量 68

-rw-r--r--. 1 root root  2889 12月 23 12:27 httpd-autoindex.conf

-rw-r--r--. 1 root root  1837 12月 23 12:27 httpd-dav.conf

-rw-r--r--. 1 root root  2942 12月 23 12:27 httpd-default.conf

-rw-r--r--. 1 root root  1119 12月 23 12:27 httpd-info.conf

-rw-r--r--. 1 root root  5078 12月 23 12:27 httpd-languages.conf

-rw-r--r--. 1 root root  1033 12月 23 12:27 httpd-manual.conf

-rw-r--r--. 1 root root  4444 12月 23 12:27 httpd-mpm.conf

-rw-r--r--. 1 root root  2234 12月 23 12:27 httpd-multilang-errordoc.conf

-rw-r--r--. 1 root root 13248 12月 23 12:27 httpd-ssl.conf

-rw-r--r--. 1 root root   694 12月 23 12:27 httpd-userdir.conf

-rw-r--r--. 1 root root  1475 12月 23 12:27 httpd-vhosts.conf

-rw-r--r--. 1 root root  3161 12月 23 12:27 proxy-html.conf



使用虚拟主机功能

1、关闭DocumentRoot

#DocumentRoot "/usr/local/test/apache/htdocs"


2、开启virtualHost功能

# Virtual hosts

Include /etc/httpd24/extra/httpd-vhosts.conf


3、配置/etc/http24/extra/httpd-vhosts.conf

<VirtualHost *:8080>

        documentroot "/usr/local/test/dtedu/"

        servername www.inno.com.cn

        ErrorLog "/var/log/dtedu/dteduerror.log"

        <Directory "/usr/local/test/dtedu">

                options none

                allowoverride none

                order deny,allow

                deny from 10.40.0.57

        </Directory>

</VirtualHost>


<VirtualHost *:80>

        documentroot "/usr/local/test/gongbing/"

        servername www.gongbing.com.cn

        ErrorLog "/var/log/inno/innoerror.log"

        <Directory "/usr/local/test/gongbing">

                options none

                allowoverride none

                order deny,allow

                deny from 10.40.0.57

        </Directory>


<VirtualHost *:80>

        documentroot "/usr/local/test/inno/"

        servername www.inno.com.cn

        ErrorLog "/var/log/inno/innoerror.log"

        <Directory "/usr/local/test/inno">

                options none

                allowoverride none

                order deny,allow

                deny from 10.40.0.57

        </Directory>



4、开启8080端口(/etc/htttpd24/httpd.conf)

Listen 80

Listen 8080



5、修改工作模式,仅需修改loadmodule即可(编译方式)

#LoadModule mpm_event_module modules/mod_mpm_event.so

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

LoadModule mpm_worker_module modules/mod_mpm_worker.so


安装pcre的前提需要安装gcc、gcc-c++。