一、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的配置文件介绍
/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的管理命令
[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、主配置文件指令介绍
### 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关闭。
[root@localhost ~]# setenforce 0 [root@localhost ~]# service iptables stop
1)、安装Apache软件包,可以直接启动服务,这样就可以访问默认站点
[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)、新建一个基于域名虚拟主机并做访问验证,如下:
[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记录,如:
C:\Windows\System32\Drivers\etc\hosts #打开些文件添加如下内容 172.16.14.1 www.host1.com
使用域名访问,如下图:
3)、添加一个基于域名访问,但需要用户验证的网站,如:
[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的模块
[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、创建两个文件如:
[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配置文件如:
[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平台及详细配置,敬请关注。。。