1.HTTP协议简介
1.1客户端与服务器建立连接
客户端与服务器建立链接就是SOCKET连接。因此要指定极其名称、资源名称和端口号,可以通过URL来提供这些信息。
1.2客户向服务器提出请求
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行、请求头部、空行和请求数据四个部分组成,下图给出了请求报文的一般格式
1.请求行
请求行分为三个部分:请求方法、请求地址和协议版本
(1)请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法;HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
常用的HTTP请求方法如下表
HTTP方法 |
描述 |
OPTIONS |
返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。 |
GET |
从服务器向客户端发送命名资源 |
PUT |
将来自客户端的数据存储到一个命名的服务器资源中去 |
DELETE |
从服务器中删除命名资源 |
POST |
将客户端数据发送到一个服务器网关应用程序 |
TRACE |
回显服务器收到的请求,主要用于测试或诊断 |
CONNECT |
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器 |
HEAD |
仅发送命名资源响应中的HTTP头部 |
(2)请求地址
URL(统一资源定位符),对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址
基本URL结构:<协议>://<主机>/<路径>:<端口>
(3)协议版本
格式位:HTTP/主版本号.次版本号,常用的由HTTP/1.0和HTTP/1.
2.请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分割。
注:请求头部最后会有一个空行,表示请求头部结束,接下俩为请求数据,这一行非常重要,必不可少
常见请求头部如下:
请求头部 |
说明 |
Host |
接受请求的服务器地址,可以是IP:端口号,也可以是域名 |
User-Agent |
有关发出请求的应用程序名称 |
Connection |
指定与连接想关的属性,如Connection,Keep-Alive |
Accept-Charset |
通知服务端可以发送的编码格式 |
Accept-Encoding |
通知服务端可以发送的数据压缩格式 |
Accept-Language |
通知服务端可以发送的语言 |
3.请求数据
可选部分,比如GET请求就没有请求数据
1.3服务器对请求做出应答
HTTP响应也由四个部分组成,分别是:状态行、响应头部、空行以及相应数据组成
1.状态行
状态行由三部分组成,分别为协议版本、状态码、状态码描述
(1)状态码
状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用,总共由以下五种类型
1** |
服务器收到请求,需要请求者继续执行操作 |
2** |
成功,操作被成功接收并处理 |
3** |
重定向,西药进一步的操作以完成请求 |
4** |
客户端错误,请求包含语法错误或无法完成请求 |
5** |
服务器错误,服务器在处理请求的过程中发生了错误 |
2.响应头部
与请求头部类似,位响应报文添加了一些附加信息。常见的响应头部如下:
响应头部 |
说明 |
Server |
服务器应用程序软件的名称和版本 |
Content-Type |
响应正文的类型(是图片还是二进制字符串) |
Content-Length |
响应正文的长度 |
Content-Charset |
响应正文使用的编码 |
Content-Encoding |
响应正文使用的数据压缩格式 |
Content-Language |
响应正文使用的语言 |
Allow |
服务器支持哪些请求方法 |
3.响应数据
用于存放需要返回给客户端的数据信息
代理服务器:S和C之间的访问实体
缓存服务器:特殊的代理服务器
网关服务器:一个HTTP/FTP网关服务器
4.关闭客户与服务器之间的连接
此步主要关闭客户端与服务器的连接,详细过程请参考TCP/IP协议的关闭过程
1.4网站架构
LAMP(Linux+Apache+Mysql+Python/PHP/Perl)
LNMP(Linux+Nginx+Mysql+ Python/PHP/Perl)
2.apache的安装、配置和启动
2.1源码安装
[root@RedHat~]#wget http://mirrors.hust.edu.cn/apache//apr/apr-1.6.5.tar.bz2
[root@RedHat~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.bz2
[root@RedHat~]#wget http://mirrors.hust.edu.cn/apache//apr/apr-1.6.5.tar.bz2
[root@RedHat ~]# cd apr-1.6.5/
[root@RedHat apr-1.6.5]# ./configure --prefix=/usr/local/apr #配置编译选项
[root@RedHat apr-1.6.5]# make -j 4 4核编译
[root@RedHat apr-1.6.5]# make install #安装
[root@RedHat ~]# cd apr-util-1.6.1/
[root@RedHat apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-utils
[root@RedHat apr-util-1.6.1]# make -j 4
[root@RedHat apr-util-1.6.1]# make install
[root@RedHat ~]# cd httpd-2.4.37/
[root@RedHat httpd-2.4.37]# ./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite --enable-ssl --with-ssl=/usr/local/ssl --with-mpm=prefork
[root@RedHat httpd-2.4.37]# make -j 4
[root@RedHat httpd-2.4.37]# make install
2.2网页默认放置的路径
cgi-bin是一种特殊的目录,在进行交互式的www访问(如填写在线表格)时,需要对服务器上有响应程序对访问输入的信息进行处理,这里的程序就是cgi程序,而这些文件只能存放在/var/www/cgi-bin这个目录
2.3Apache的主配置文件
Apache主配置文件位于conf目录中,名为httpd.conf
httpd.conf配置文件主要由三个部分组成:全局环境、主服务器配置、虚拟主机。每部分都有相应的配置语句,该文件所有配置语句的语法为“配置参数名称 参数值”的形式。
httpd.conf的配置语句除了选项的参数值以外,所有选项指令均不区分大小写,可以在每一行前用“#”号或“;”号表示注释
主配置目录:/etc/httpd/conf
子配置目录:/etc/httpd/conf.d
下面为主配置文件httpd.conf中主要的一些参数说明
ServerRoot "/etc/httpd" |
设置配置文件的默认目录 |
Listen 12.34.56.78:80 |
指定用户侦听请求的端口和可能的IP地址 |
Listen 80 |
|
Include conf.modules.d/*.conf |
添加其他配置文件的内容 |
User apache |
指定Apache在本地系统上运行的用户名 |
Group apache |
指定Apache在本地系统上运行的组名 |
ServerAdmin root@localhost |
设置管理电子邮件地址 |
ServerName www.example.com:80 |
设置服务器用于辨识自己的主机名和端口号 |
AllowOverride none |
支持从.htaccess文件中重写前面的指令 |
Require all denied |
给所有用户或特定的用户/组授予或拒绝绝对目录的访问 |
DocumentRoot "/var/www/html" |
指定网站的根目录 |
Options Indexes FollowSymLinks |
指定与web目录相关的特性,例如ExecCGI、FollowSymLinks、Includes、Indexes、MultiViews和SysLinksIFOwnerMatch |
DirectoryIndex index.html |
指定导航到目录时查找的文件,默认设置为 index.html |
ErrorLog "logs/error_log" |
定位错误日志文件 |
LogLevel warn |
指定日志的级别 |
LogFormat "%h %l %u %t \"%r\" %>s %b" common |
设置日志文件里包含的信息 |
CustomLog "logs/access_log" combined |
采用现有日志格式创建自定义日志文件 |
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" |
将web路径映射到DocumentRoot之外的系统位置 |
TypesConfig /etc/mime.types |
定位mime.type,指定与扩展名相关的文件类型 |
AddType application/x-compress .Z |
将文件名扩展名映射到指定内容类型 |
AddOutputFilter INCLUDES .shtml |
将文件名扩展名映射到指定过滤器 |
AddDefaultCharset UTF-8 |
设置默认字符集 |
MIMEMagicFile conf/magic |
确定文件的MIME类型 |
EnableSendfile on |
使用sendfile系统调用,把静态文件发送给客户端,以获得更好的性能 |
IncludeOptional conf.d/*.conf |
加载/etc/httpd/conf.d子配置文件 |
2.3Apahce的启动以及关闭
systemctl start|stop|status|enable|disable|restart|reload
或apachectl configtest|fullstatus|graceful|help|restart|start|status|stop
3.Apache服务器的搭建
3.1基于IP的虚拟主机配置
Apache配置虚拟主机支持3种方式:基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置。
如果同一台服务器有多个IP,可以使用基于IP的虚拟主机配置,将不同的服务绑定在不同的IP上。
建立虚拟主机存放网页的根目录,并创建首页文件index.html
[root@RedHat hello]# mkdir /hello
[root@RedHat ~]# echo "hello"> /hello/index.html
修改配置文件vhost.conf
<Directory /hello>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.206.163:80>
ServerAdmin [email protected]
DocumentRoot /hello
ServerName 192.168.206.163
ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
</VirtualHost>
重启服务[root@RedHat ~]# systemctl restart httpd
测试
3.2基于端口的虚拟主机配置
建立虚拟主机存放网页的根目录,并创建首页文件index.html
[root@RedHat hello]# mkdir 8888
[root@RedHat hello]# echo this is html > 8888/index.html
修改配置文件vhost.conf
<Directory /hello>
AllowOverride none
Require all granted
</Directory>
Listen 8888
Listen 8999
<VirtualHost 192.168.206.163:8999>
ServerAdmin [email protected]
DocumentRoot /hello
ServerName 192.168.206.163
ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.206.163:8888>
ServerAdmin [email protected]
DocumentRoot /hello/8888
ServerName 192.168.206.163
ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
</VirtualHost>
重启服务[root@RedHat ~]# systemctl restart httpd
测试
3.3基于域名的虚拟主机配置
修改配置文件vhost.conf
<Directory /hello>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.206.163:80>
ServerAdmin [email protected]
DocumentRoot /hello
ServerName www.hello.com
ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.206.163:80>
ServerAdmin [email protected]
DocumentRoot /hello/8888
ServerName www.8888.com
ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
</VirtualHost>
修改/etc/hosts,添加IP到域名的映射
重启http服务
测试
4.Apache安全认证与控制
4.1 虚拟目录
在一台计算机上创建多个web站点,并为每个web站点设置不同的主目录和虚拟子目录,每个web站点作为各自独立的网站分别分配给不同的公司或部门。
多个公司或部门的网站就可以共用同一台计算机,而用户感觉每个公司和部门都由各自独立的网站。多个没有实力在Internet上假设自己专用服务器的中小公司可以联合租用一台web服务器,对外提供各自的web服务而互不影响
web服务器上的每个web站点必须设置由不同的标识信息,web浏览器发出的连接和请求信息中包含web站点的标识信息,web站点的标识信息:IP地址、端口号、主机名
4.2 SSL认证(HTTPS)
HTTP和TCP之间插入了(TSL(安全传输层协议)/SSL(安全套接层))
超文本传输协议HTTP协议被用在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,姐可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密
4.3 HTTPS和HTTP的区别
HTTPS |
HTTP |
需要用到CA申请证书 |
不需要 |
明文传输 |
具有安全性的SSL加密传输协议 |
端口号:443 |
端口号:80 |
由SSL+HTTP协议构建的可进行加密传输、认证的网络协议 |
连接很简单,是无状态的 |
4.4 SSL建立过程
三次握手---协商算法---服务器发送证书给客户端---客户端生成对称密钥---客户端发送HTTP请求---服务器通过对称密钥加密后吧网页送到客户端
4.5 SSL配置
[root@RedHat ~]# yum -y install mod__ssl
Enter pass phrase: #密码
Verifying - Enter pass phrase: #确认密码
Enter pass phrase for haha.key: #输入刚才的密码
Country Name (2 letter code) [XX]: #国家
State or Province Name (full name) []: #省份
Locality Name (eg, city) [Default City]: #城市
Organization Name (eg, company) [Default Company Ltd]: #公司名称
Organizational Unit Name (eg, section) []: #部门
Common Name (eg, your name or your server's hostname) []: #真实域名
Email Address []: #邮箱
<Directory /www>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.206.163:443>
SSLEngine on #引擎打开
SSLProtocol all -SSLv2 #支持除了SSLv2外的所有协议
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA #密码套件 客户端和服务端协商
SSLCertificateFile /etc/pki/tls/certs/haha.crt #指定证书路径
SSLCertificateKeyFile /etc/pki/tls/certs/haha.key #指定密钥 文件路径
DocumentRoot /www/haha
Alias /haha /www/haha
ServerName 192.168.206.163
</VirtualHost>
<Directory /www/xixi>
AuthType Basic
AuthName "Please Login"
AuthUserFile /etc/httpd/userfile
Require user wangxin
</Directory>
<VirtualHost 192.168.206.163:80>
ServerName 192.168.206.163
DocumentRoot /www/xixi
Alias /xixi /www/xixi
</VirtualHost>
4.6 Apache安全控制
要进行Apache的访问控制首先要了解Apache的虚拟目录。虚拟目录可以用指定的指令设置,设置虚拟目录的好处在于便于访问之外,还可以增强安全性,类似软链接的概念,客户端并不知道文件的实际路径。虚拟目录的格式如下
<Diretory 目录的路径>
目录相关的配置参数和指令
</Diretory>
每个Diretory段以<Diretory>开始,以</Diretory>结束,段作用于<Diretory>中指定的目录及其里面的所有文件和子目录。在段中可以设置与目录相关的参数和指令,包括访问控制和认证
4.7 Apache认证
除了可以使用以上介绍的指令控制特定的目录访问之外,如服务器中有敏感信息需要授权的用户才能访问,所以Apache提供了认证与授权机制,当用户访问使用此机制控制的目录时,会提示用户输入用户名密码,只有输入正确用户名和密码的主机才可以正常访问该资源。
Apache的认证类型分为两种:基本(Basic)认证和摘要(Digest)认证两种。摘要认证比基本认证更加安全,但是并非所有的浏览器都支持摘要认证,所以本节只针对基本认证进行介绍。基本认证方式其实相当简单,当Web浏览器请求经此认证模式保护的URL时,将会出现一个对话框,要求用户输入用户名和口令。用户输入后,传给Web服务器,Web服务器验证它的正确性。如果正确,则返回页面;否则将返回401错误。
要使用用户认证,首先要创建保存用户名和口令的认证口令文件。在Apache中提供了htpasswd命令用于创建和修改认证口令文件,该命令在<Apache安装目录>/bin目录下。关于该命令完整的选项和参数说明可以通过直接运行htpasswd获取。
[root@RedHat ~]# htpasswd -c /etc/httpd/userfile wangxin #创建口令文件并添加用户
[root@RedHat ~]# htpasswd /etc/httpd/userfile wang #添加用户
参数 |
说明 |
AuthName |
设置了使用认证的域 |
AuthType |
主要用于选择一个目录的用户认证类型,目前只有两种认证方式可以选择,Basic和Digest分别代表基本认证和摘要认证 |
AuthUserFile |
用于设定一个纯文本文件的名称,其中包含用于认证的用户名和密码的列表 |
Require |
用于设置哪些认证用户允许访问指定的资源 |
5.动态网站搭建
[root@RedHat ~]# yum -y install mod_wsgi
Listen 8888
<Directory /var/www/alt>
AllowOverride none
Require all granted
</Directory>
<VirtualHost 192.168.206.168:8888>
WSGIScriptAlias / /var/www/alt/webinfo.wsgi
</VirtualHost>
vim /var/www/alt/webinfo.wsgi