一、HTTP协议
二、WEB服务器简介、安装与配置
三、基于SSL加密的网站
一、HTTP简介:
HTTP是"Hyper Text Transfer Protocol"(超文本传输协议)的缩写.目前普遍使用的HTTP协议版本为"HTTP 1.1".HTTP是用于从WWW服务器传输超文件到本地浏览器的传送协议,它可以使得浏览器更加高效,使用网络传输减少.它不仅能保证计算机正确快速的传送超文本内容,还可以确定传输文本是的哪一部分内容.HTTP是一个应用层协议,由请求和响应构成,是一个标准的C/S架构模型.HTTP是一个无状态协议.
特点:
1、支持客户端/服务器模式
2、简单快速,客户端向服务器请求服务时,只需要传送请求方法和路径即可
3、灵活,HTTP允许传输任意类型的数据对象.正在传输的类型由Content-Type加以标记
4、无连接,无连接的含义就是限制每次连接只处理一个请求.服务器处理完客户端的请求,并收到客户端的应答后,断开连接.
5、无状态,HTTP协议是无状态协议.无状态是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则必须重新传送.
HTTP请求和响应报文:
请求报文:
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据几个部分组成,报文格式如:
请求行:由请求方法(在下面介绍)字段、URL字段和HTTP协议版本3个字段组成,用空格分隔.如:GET /index.htm HTTP/1.1
请求头部:由关键字/值对组成,每行一对,关键字与值用英文模式的":"分隔.请求头部通知服务器有关于客户端请求的信息,典型的请求头部有:
User-Agent:产生请求的浏览器类型
Accept:客户端可识别的内容类型列表
Host:请求的主机名,允许多个域名同用一个IP地址,即虚拟主机
Accept-Lanague:告诉服务器能够发送哪些语言
Referer:提供了包含当前请求URI文档的URL
Accept-Charset:接受的字符集
Accept-Encoding:编码方式
空行:最后一个请求头部之后的一个空行,发送回车符和换行符,通知服务器不再有请求头
请求数据:请求数据不在GET方法中使用,而是在POST方法中使用.POST方法适用于需要客户端填写表单的场合
响应报文:
一个HTTP响应报文由三个部分组成,分别是:状态行、消息报头、响应正文.HTTP响应报文格式与请求报文格式类似,如:
<Version> <Status> <Reason-Phrase> #状态行
<Headers> #响应首部
<Entity-body> #返回请求的响应内容
状态行:Vesion表示服务器HTTP协议的版本;Status表示服务器返回的响应状态码(在下面介绍);Reason-Phrase表示状态码的文本描述;状态码由3位数字组成,每个数据定义了响应的类别,有五种可能的取值
HTTP请求方法:
HTTP/1.1协议中共定义了八种方法如:
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法.
HEAD:仅响应首部信息
GET:向特定的资源发出请求.
POST:向指定资源提交数据进行处理请求.
PUT:向指定资源位置上传新内容.
DELETE:请求服务器删除"Request-URL"所标识的资源.
TRACE:回显服务器收到的请求,主要用于测试.
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器.
方法名称区分大小写.当某个请求所针对的资源不支持对应的请求方法时,服务器就返回状态码405(Method Not Allowed);当服务器不认识或不支持对应的请求方法时,应返回状态码501(Not Implemented).
状态响应码:
1xx:信息性状态码
100:Continue 101:Switching Protocols
2xx:成功状态码
200:OK
3xx:重写向状态码
301:永久重写向 302:临时重写向 304:Not Modified
4xx:客户端错误状态码
404:Not Found 408:Request Timeout
5xx:服务器端错误状态码
500:Internal Server Error 502:Bad Gateway 504:Gateway Timeout
二、WEB服务器简介及配置
1、Linux下常用的WEB服务器软件有:Apache、Nginx、Tomcat、Lighttpd 在此主要讲解Apache2.2版本.Apache服务器其靠运行和处理方面的稳定性,可靠而优越的性能,成为WEB服务器领域中佼佼者.
2、Apache的配置文件介绍
1
2
3
4
5
6
7
8
|
/etc/rc .d /init .d /httpd
#服务运行脚本
/etc/httpd
#配置文件存放路径
/etc/httpd/conf/httpd .conf #主配置文件
/etc/httpd/conf .d/*.conf #扩展配置文件
/var/www/html
#默认网站存放目录
/var/www/cgi-bin
#默认CGI程序存放目录
/etc/httpd/logs
#apache日志生成目录
/etc/httpd/modules
#存放apache模块目录
|
3、Apache的工作机制
在处理动态网站时,Apache使用的则是CGI(通用网关接口),CGI的作用就是让前端服务器和后端的应用程序结合起来,来处理WEB服务器页面内的脚本。当WEB服务器对页面进行处理时,发现有脚本文件,则此时就会调用CGI这个接口来处理该脚本,当应用程序后将处理后的结果返回给WEB服务器,而此时的脚本已被格式化为Html语言格式。WEB服务器不能处理动态网页,而处理动态网页的都是CGI服务器
4、Apache的工作方式:
1)、CGI:Apache响应每一个用户的请求,都启动一个独立进程,而Apache自身也要启用一个进程,来等待用户请求,生成一个WEB进程后,又会生成一个处理进程,处理完成后,每一个进程按照之前配置进行回收
2)、模块化:当用户请求动态内容时,CGI的工作模式中的那个应用程序的进程不在是独立的进程,而是作为Apache的模块存在,在Apache的地址空间中运行
3)、FASTCGI:Apache的工作进程不在是一个独立的进程,而是作为一个服务存在的,当用户请求的页面有动态内容时,服务嘎嘎就向这个服务发起请求进行处理,这种方式的好处是自己有了管理进程的机制,而又是做为一个独立服务,因此可以架设在不同的服务器上
5、配置Apache的工作属性
主配置文件中,Apache指令不区分字符大不写,但约定俗成的慌里习惯:单词首字母大写;但指令的值很有可能区分大小写,有些指令可以重复使用多次
配置文件的构成: 主服务器和虚拟主机不能同时使用
全局配置:对主服务器或虚拟主机都生效,且有些功能是服务器自身属性
主服务器:主网站特性
虚拟主机:虚拟主机及属性的定义,基于IP地址、端口号、域名三种方式
6、Apache的管理命令
1
2
3
4
5
6
7
|
[root@localhost conf] # service httpd start #启动服务
[root@localhost conf] # service httpd stop #停止服务
[root@localhost conf] # service httpd restart #重启服务
[root@localhost conf] # service httpd reload #重新加载
[root@localhost conf] # service httpd status #查看服务状态
[root@localhost conf] # service httpd configtest #测试配置文件语法
[root@localhost conf] # httpd -t #测试配置文件语法
|
7、配置所选用的MPM属性
配置所使用编译进不同的MPM的Httpd,编辑/etc/sysconfig/httpd配置文件,定义如下行: HTTPD=/usr/sbin/httpd.worker
MPM:多道处理模块
prefork:一个进程响应一个请求
worker:一个进程生成多个线程,一个线程响应一个请求
event:一个主进程生成多个子进程,每个子进程处理多个请求,此模块V2.4版本以后才有
8、主配置文件指令介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
### Section 1: Global Environment #全局配置
ServerRoot
"/etc/httpd" #指定服务配置文件目录
PidFile run /httpd .pid #指定PID文件路径
LockFile run /httpd .lock #指定锁文件的位置
Timeout 60 #响应超时时间
KeepAlive Off|On #是否允许建立永久连接
MaxKeepAliveRequests 100 #最大请求连接
KeepAliveTimeout 15 #永久连接超时时间
# prefork MPM
<IfModule prefork.c> #检查是否使用prefork模块,如果使用prefork模块,则此配置生效
StartServers 8 #系统启动时建立的了进程数
MinSpareServers 5 #保留空闲服务器进程最小进程数
MaxSpareServers 20 #保留空闲服务器进程最大进程数
ServerLimit 256 #
MaxClients 256 #最大客户端连接数,超过则排队
MaxRequestsPerChild 4000 #每个子进程在生存期内允许最大请求量
< /IfModule >
# worker MPM
<IfModule worker.c> #检查是否使用worker模块,如果使用prefork模块,则此配置生效
StartServers 4 #系统启动时建立的了进程数
MaxClients 300 #最大客户端连接数,超过则排队
MinSpareThreads 25 #最小空闲线程数
MaxSpareThreads 75 #最大空闲线程数
ThreadsPerChild 25 #每个子进程建立的线程数
MaxRequestsPerChild 0 #每个子进程在生存期内允许最大请求量
< /IfModule >
Listen 80 #监听的TCP端口
LoadModule rewrite_module modules /mod_rewrite .so #加载模块指令
Include conf.d/*.conf #配置包含conf.d目录下的所有文件
ExtendedStatus On #跟踪每个请求的扩展状态信息
<Location /server-status > #将封装的指令用于匹配URL
SetHandler server-status #强制所有匹配的文件被一个指定的处理器处理
Order deny,allow #控制默认的访问状态与Allow和Deny指令生效的顺序 注:Deny在Allow前,默认允许所有访问;Deny在Allow后默认拒绝所有访问
Deny from all #拒绝所有,可以是主机地址、网段
Allow from .example.com #允许这个域的所有主机访问
< /Location >
User apache #服务运行时的用户
Group apache #请求提供服务的Apache子进程运行时的用户组
### Section 2: 'Main' server configuration
ServerAdmin root@localhost #指定管理员邮箱
ServerName www.example.com:80 #指定主机名和端口
DocumentRoot
"/var/www/html" #指定默认网页访问路径
<Directory "/var/www/html" > #封装一组指令,使其对某个目录生效
Options None #配置特定目录中可以使用哪些特性
AllowOverride AuthConfig #确定允许存在于.htaccess文件中的指令类型
Order allow,deny
Allow from all #允许所有;可以是主机地址、网段
< /Directory >
DirectoryIndex index.html index.html.var #指定访问默认主页文件名
DefaultType text /plain
#在服务器无法由其他方法确定内容类型时,发送默认的MIME内容类型
ErrorLog logs /error_log
#指定错误日志路径
LogLevel warn #指定错误日志级别
LogFormat
"%h %l %u %t \"%r\" %>s %b" common #定义访问日志的记录格式
CustomLog logs /access_log
common #指定日志文件名及格式
Alias /icons/
"/var/www/icons/" #别名:映射URL到文件系统的特定位置
ScriptAlias /cgi-bin/
"/var/www/cgi-bin/" #脚本别名:映射一个URL到文件系统并视为CGI脚本
<Directory "/var/www/icons" >
Options Indexes FollowSymLinks #Indexes:如果请求的文件是一个链接文件,链接到其他目录中,是否允许访问;另一个:是否允许在此目录中使用符号连接
AllowOverride None #表示忽略.htaccess文件,不会读取该文件
Order allow,deny
Allow from all
< /Directory >
AddDefaultCharset UTF-8 #指定默认字符集
AddType application /x-gzip
.gz .tgz #指定文件扩展名与特定的内容类型建立映射
### Section 3: Virtual Hosts
NameVirtualHost *:80 #开启虚拟主机
<VirtualHost *:80> #配置虚拟主机与NameVirtualHost配合使用
ServerAdmin [email protected]
DocumentRoot /www/docs/dummy-host .example.com
ServerName www.example.com
ErrorLog logs /dummy .example.com-error_log
CustomLog logs /dummy .example.com-access_log common
< /VirtualHost >
#下面一组指令写在主服务器则全部生效,写在某个虚拟主机中,则只有那个虚拟主机生效
<Directory "/var/www/html/" >
Options Indexes #
AllowOverride AuthConfig #允许使用与认证授权相关指令
AuthName
"Only for employees." #为授权域设置名称,自定义
AuthType Basic #用户认证类型;
AuthUserFile /etc/httpd/conf/ .htpass #设定一个含有认证使用的用户名:密码列表的文本文件
AuthGroupFile /etc/httpd/conf/ .Ghtpass #设定一个含有认证使用的用户组列表的文本文件
Require valid-user #指定哪些认证用户允许访问该资源;valid-user表示所有用户都可以访问
< /Directory >
|
9、配置实例,首先我们需要把SELinux与Iptables关闭。
1
2
|
[root@localhost ~] # setenforce 0
[root@localhost ~] # service iptables stop
|
1)、安装Apache软件包,可以直接启动服务,这样就可以访问默认站点
1
2
3
4
|
[root@localhost ~] # yum -y install httpd
[root@localhost ~] # rpm -q httpd #查看已安装的软件包
httpd-2.2.15-26.el6.centos.x86_64
[root@localhost ~] # service httpd start
|
在/var/www/html目录下建立一个文件“index.html”写入内容为"default"可以直接访问,如下:
2)、新建一个基于域名虚拟主机并做访问验证,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@localhost ~] # mkdir -pv /www/host1 # 创建网站存放目录
mkdir : 已创建目录 "/www/host1"
[root@localhost ~] # echo "host1" > /www/host1/index.html #为网站创建默认主页
[root@localhost ~] # vim /etc/httpd/conf/httpd.conf #打开主配置文件
#DocumentRoot "/var/www/html" #注释此行
NameVirtualHost *:80 #去掉此行注释
<VirtualHost 172.16.14.1:80> #创建虚拟主机
DocumentRoot /www/host1
#指定网站根目录
ServerName www.host1.com #指定主机名
ErrorLog logs /host1_error .log #错误日志
CustomLog logs /host1_access .log common #访问日志
< /VirtualHost >
<Directory "/www/host1" > #为新建的虚拟主机添加权限为允许所有
Options None
AllowOverride None
Order allow,deny
Allow from all
< /Directory >
[root@localhost conf] # service httpd restart #重启服务
|
基于域名访问,由于我们没有DNS服务器做解析,需要在本地添加Hosts记录,如:
1
2
|
C:\Windows\System32\Drivers\etc\hosts #打开些文件添加如下内容
172.16.14.1 www.host1.com
|
使用域名访问,如下图:
3)、添加一个基于域名访问,但需要用户验证的网站,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[root@localhost ~] # mkdir -pv /www/host2
mkdir : 已创建目录 "/www/host2"
[root@localhost ~] # echo "host2" > /www/host2/index.html
[root@localhost ~] # vim /etc/httpd/conf/httpd.conf
NameVirtualHost 172.16.14.1:80 #设置虚拟主机IP地址,有多个虚拟主机,这里必须写IP
<VirtualHost 172.16.14.1:80>
DocumentRoot /www/host2
ServerName www.host2.com
ErrorLog logs /host2_error .log
CustomLog logs /host2_access .log common
< /VirtualHost >
<Directory "/www/host2" > #为www.host2.com主机设置认证
Options None
AllowOverride AuthConfig
AuthName "Host2"
AuthType Basic #基本认证
AuthUserFile /etc/httpd/conf/ .htpass
Require user centos #指定只能centos用户可以访问
Order allow,deny #拒绝所有
Allow from 172.16.254.37 #只允许这个IP地址访问
< /Directory >
#创建两个认证用户,用户名密码相同,-c:创建每一次创建认证文件时使用
[root@localhost ~] # htpasswd -c -m /etc/httpd/conf/.htpass centos
[root@localhost ~] # htpasswd -m /etc/httpd/conf/.htpass redhat
C:\Windows\System32\Drivers\etc\hosts #客户端添加如下行
172.16.14.1 www.host2.com
|
使用不同用户测试是否能访问,如下图:
使用不同的IP地址访问,如下图:
三、基于SSL加密网站
注:为了方便实验,WEB服务器和CA服务器在一台服务器;在密钥生成过程中,主机名要一致,而在访问过程中也要使用生成密钥文件时填写的主机名,否则使用主机名访问不成功
1、安装SSL的模块
1
|
[root@localhost ~] # yum -y install mod_ssl
|
2、为HTTP服务器自己生成一个私钥文件如下图:
注释:图中"()"代表只在当前子Shell进程中有效
openssl:生成私钥关键字
genrsa:使用rsa加密方式生成私钥
-out:指定输出文件
ftp.key:指定输出生成私钥的文件名称,文件名可以自己定义
2048:表示生成私钥加密的长度(默认为512)
3、从私钥文件中制作一个证书签署请求,如下图:
注释: req:证书申请签名管理
-new:制作证书申请
-key:指定私钥文件
4、为CA服务器生成一个私钥文件,如下图:
5、使用刚刚生成的私钥为自己生成一个自签证书,如下图:
注释:-x509:表示制作一个自签证书
-days:表示证书申请后可以使用的天数
6、创建两个文件如:
1
2
|
[root@localhost ~] # touch /etc/pki/CA/{index.txt,serial}
[root@localhost ~] # echo "01" > /etc/pki/CA/serial
|
7、为WEB服务器签署证书,如下图:
8、修改/etc/httpd/conf.d/ssl.conf配置文件如:
1
2
3
4
5
6
|
[root@localhost ~] # vim /etc/httpd/conf.d/ssl.conf
DocumentRoot
"/www/host1" #修改为需要加密的网站目录
ServerName www.host1.com:443 #改为自己的域名
SSLCertificateFile /etc/pki/CA/cahttp .crt #HTTP服务器的证书
SSLCertificateKeyFile /etc/pki/CA/http .key #HTTP服务器的私钥
[root@localhost httpd] # service httpd restart #重启HTTP服务
|
9、把CA服务器的密钥下载到本地,重命名文件名为.crt格式的文件;安装到受信任证书,如下图:
再次打开证书查看,如下图:
10、使用浏览器来访问www.host1.com域名验证是否成功,如下图:
后续会更新编译安装方式LAMP平台及详细配置,敬请关注。。。