Web服务
Internet上主机之间的通讯需要有两个重要的标志:IP和端口号,两者合称为套接字地址 socket address
客户端主机套接字地址定义了一个唯一的客户进程(端口号可随机)
服务器套接字地址定义了一个唯一的服务器进程(端口号需要固定)
端口号总范围是0-65535,但是0-1023范围内端口号是系统端口或叫特权端口,只限管理员使用
HTTP(Hyper Text Transfer Protocol)是应用于TCP/IP协议的应用层的超文本传输协议,基于TCP协议,默认端口号为80
HTTP服务通信的过程:(服务端S、客户端C)
html是超文本的编辑语言,使得文本内容更加美观,基本运用的格式如下:
<html>
<head>
<title>输入定义的网页标签名
</title>
</head>
<body>
<img src=“输入调用的图片、logo等文件路径”>
<h1>“要输入的字符内容”</h1>
<p><a href=超链接地址>需要被连接的字符</a>不需要超链接的字符</p>
</body>
</html>
这些html语言编辑的文件一般存放在默认的httpd服务的默认站点/var/www/html/目录下并以.html结尾
为了能够实现多媒体的传输,HTTP协议就利用MIME(Multipurpose Internet Mail Extensions)多用途的邮件扩展协议来支持,在CentOS系统中 /etc/mime.types 文件中可查看支持的多媒体类型
HTTP协议
目前市面上正常使用的协议为三种:http/1.0、http/1.1(主流)、http/2.0
http/1.0:
每个TCP协议连接中只能发送一个请求,发送数据完毕,连接就关闭;若还需要获取其他资源,则需要另外建立新的TCP连接
支持多种method方法指令:GET(请求数据)、POST(上传数据)、HEAD(查看http报文首部)
http/1.1:(在http/1.0协议基础上升级)
引入持久连接,即TCP连接建立之后,默认不关闭,客户端可以发送多个请求,在多数浏览器中,支持同时开启6个持久连接
新增了一些其他method指令:PUT、PATCH、OPTIONS、DELETE,但是不常用
存在的缺点是,每个TCP连接中,数据通信是按照次序进行,可能会造成请求排队堵塞
http/2.0:(在http/1.1协议基础上升级)
每个TCP连接中,客户端与浏览器可以同时发送多个请求与回应
服务器可以未经请求情况下,主动推送资源给客户端
TCP连接在这三种协议中,从开始的每次单个连接只能执行一次请求===>升级到按照顺序单个连接可处理客户端的多个请求===>再到可不按照顺序客户端和服务端同时发送多个请求或回应
http协议是属于无状态协议,服务器是无法跟踪访问者来源的,为解决此问题,一般是通过如下方法:
cookie与session的结合 (每个服务器会设置cookie的数量)
工作机制:当客户端访问某个服务器网站时,服务器端会自动的生成一个cookie信息,发送给客户端并设定唯一的一个编号,客户端会将此cookie信息存储在文件中,若是客户端在此访问相同的服务器网站,会携带此带编号的cookie信息,服务端则通过此编号,在session中将客户端此前相关访问信息与之关联,从而记录下来,实现跟踪
HTTP经常使用的状态码以及相关含义,如下:
200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 响应报文Location指明资源临时新位置 Moved Temporarily
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
503 : 服务不可用,临时服务器维护或过载,服务器无法处理请求
504 : 网关超时
HTTP工作机制
客户端发送请求 request 《=====》response 服务器响应 (其中请求报文、响应报文两者的首部信息是不一样的)
HTTP请求处理过程:(发生在在DNS解析和TCP/IP协议的三次握手完成之后)(C:客户端 S:服务器)
1.建立连接,C向S发送资源报文请求,S接受或者拒绝请求
2.S接收请求:有如下几种接受请求的类型
串行连接:S开启单进程一对一的响应每个TCP连接下C的请求
并行连接:S开启多进程同时并发响应一个TCP连接下的C的多个请求
复用结构:S开启一个进程响应N个连接请求或者一个进程生成N个线程一对一连接请求
复用多进程结构:启动M个进程,每个进程响应N个连接请求
3.S处理请求
4.S发指令给内核,让内核去磁盘中寻找C发来的请求中需要的资源
5.S拿到资源后,构建响应报文
6.S发送响应报文给C,并记录每个连接的状态
7.S在事务结束后,记录日志
最后是TCP协议的四次挥手
HTTP协议中的一些术语
URI:Uniform Resource Identifier 统一资源标识,又分为URL和URN
URN:Uniform Resource Naming 统一资源命名
URL:Uniform Resource Locator 统一资源定位符,用于描述某服务器某特定资源位置
其中URL是经常使用的,其组成如下图:
HTTP服务(CentOS 7的rpm包安装环境下)
本文介绍的是apache服务器程序软件,apache只支持静态页面的访问来提供web服务
程序包名为:httpd
httpd是基于模块化的服务:核心模块Core + 一些其他模块Modules,支持DOS(Dynamic Shared Object)动态加载或卸载模块
httpd利用MPM(Multi-Processing Modules)多路处理模块,提供了以下三种工作模型:
prefork:多进程I/O模型(系统默认使用模型)
一个主进程 ---> N个子进程 ---> 一对一处理客户端请求
(并发连接数若达到10000,称为C10k,此时Apache的响应速度会受到严重影响)
worker:复用的多进程I/O模型
一个主进程 ---> N个子进程 ---> M个线进程 ---> 一对一处理客户端请求
(线程之间会存在相互影响的情况)
event:时间驱动模型
一个主进程 ---> N个子进程 ---> 一个N对应M个请求
修改工作模型,只需在配置文件 /etc/httpd/conf.modules.d/00-mpm.conf 启用相对应的模块,重启服务即可
httpd加载使用模块的配置文件存放在 /etc/httpd/conf.modules.d/ 目录下
httpd -M 可查看httpd服务启动后,已动态加载在内存中使用的模块
httpd其他的一些功能特性:
虚拟主机:表示可在一台服务器上搭建多个网站提供不同的服务
CGI(Common Gateway Interface) 通用网关接口:可实现动态程序,但是需要额外进行开发
反向代理:可作为调度器来实现客户端请求合理分配调度给后端服务器
以及负载均衡、路径别名、用户认证等
Httpd的配置 (CentOS 7的rpm包安装环境下)
配置文件分为 主:/etc/httpd/conf/httpd.conf 从:/etc/httpd/conf.d/*.conf(一般情况下是用来管理存放自定义的虚拟主机配置文件)
注意:从配置文件内修改的内容会优先主配置文件生效,因为在主配置文件最后另外指定了从配置文件路径,在主配置文件设置完成后,会继续读取从配置文件中的内容,若有冲突,则会被覆盖
主程序:/usr/bin/httpd ,可以通过“httpd -t”选项来检测配置文件的语法
默认的网页站点路径:/var/www/html/ 默认的日志存放路径:/var/lib/httpd/
进程编号文件:/etc/httpd/run/httpd.pid (只有在httpd服务启动时,才会存在)
配置文件中一些常用的配置选项:(基于httpd 2.4的介绍)
1.可在网页上保密使用的Apache版本信息
加入 ServerTokens Prod 选项
(在命令行使用 “curl -I IP地址”可查看)
2.修改监听端口
Listen [IP:] PORT ([ ]内的内容若是省略,表示PORT监听在本机所有IP地址上)
Listen指令必须大于等于1个
3.持久连接
连接建立的情况下,每个资源获取完成后不断开连接,可继续等待其他请求,但是因为有并发访问量大的情况,所以也应设置最大连接次数
KeepAlive On 启用持久连接
KeepAliveTimeout VALUE 设置持久连接的超时时长,单位为毫秒
MaxKeepAliveRequests VALUE 发送多少次请求连接后,断开持久连接
可使用telnet命令进行测试,测试方法如下:(若是单个指令结束后,可以继续输入下一个指令,则表示开启了持久连接)
telnet WEB_SERVER_IP PORT(指定httpd服务器地址和端口,进入交互式状态)
telnet> GET /index.html HTTP/1.1 (指定请求内容以及httpd服务所用协议)
telnet> HOST: RANDOM_IP (随机指定一个IP)
4.增加httpd服务的工作进程数
StartServers NUMBER 修改各工作模型下的工作进程数
5.网页的主页面路径
默认为 /var/www/html/,若需要修改,则修改如下选项 :
DocumentRoot /DIR (此时需要注意的是,在httpd 2.4版本中,还必须另外对 / 进行授权操作,基本格式如下:)
<Directory />
Require all granted
</Directory>
6.定义网页主页面的站点
默认是 /var/www/html/ 下的 index.html 文件,若是需要修改,操作如下:
DirectoryIndex index.NAME1 index.NAME2 指定以“.NAME1”结尾的文件为默认站点页面,若找不到则会依次找后续设置
7.站点访问控制的机制,指定特定的用户访问
可针对磁盘文件 <File “”> <FileMatch “通配符”>
……… ………
</File> </FileMatch>
目录 <Directory /DIR >
………
</Directory>
URL路径 <Location URL> < LocationMatch “通配符”>
……… ………
</Location> </ LocationMatch >
其中“………”表示的是授权的内容,格式如下:(下面的“|”分隔了两种方式Any和All)
<RequireAny|All>
Require all denied|granted
Require IP| not IP(表示该IP是在上面一个条件之外)
</RequireAny|All>
8.Options选项
当不存在与网站主页面定义的资源文件时,会根据 Options选项 后接的指定参数将相关信息呈现给用户,其中有以下几种参数:
Indexes 会显示网页站点目录下的文件列表
FollowSymLinks 支持软连接指向
注意此选项若是需要生效,则需要将指定网页站点的文件(*.conf)和测试文件信息(welcome.conf)给移除
也可将options选项信息写入指定目录下的 .htaccess 文件中,并在配置文件中授权此目录为 AllowOverride all,效果和单独写入配置文件一样。
9.日至设定
默认的日志的存放路径: /var/log/httpd/ 下的 access_log(访问日志) 和 error_log(错误日志)
其中 access_log 的记录格式在配置文件中进行定义:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "logs/access_log" combined
(其中“combined”只是一个代名词,实际生成可根据情况定义不同的日志记录内容,并贴上自定义标签)
上述日志定义过程中使用到的相关标志,代表的含义如下图所示:
具体的一些其他日志格式定义的内容,可参考文档:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10.路径别名的设置
Alias URL /PATH 将访问的URL路径重新定向到指定的新的路径
需要注意的是,此时新路径的文件夹还必须要经过授权
12.身份验证
对指定文件或目录允许特定的虚拟账户访问设置,设置需要的选项如下:
AuthType Basic
AuthName "登录端口的描述信息"
AuthUserFile "账户密码的存放路径"
Require user 账户1 账户2 (特定某些账户可访问)(或者Require valid-user 表示所有设定的账户都可访问)
其中可以通过下面这个命令来创建账户密码:
htpasswd [options] 文件路径 USER_NAME
options:
-c 在文件不存在时自动创建,后续添加不需要
-D 删除指定用户
-d crypt格式加密(默认)
-p|m|s 分别表示明文密码、md5加密、sha加密
也可将创建的用户进行分组,针对某个组成员进行访问控制:
AuthGroupFile "设定的组文件存放路径" 注意在组文件中的格式为“GROUP_NAME:USER1 USER2”
Require group GROUP_NAME (指定某个组可进行访问)
13.用户家目录的共享
基于模块userdir_Module加载后才能实现(httpd –M可查看模块)
在自带的配置文件/etc/httpd/conf.d/userdir.conf中
关闭选项 UserDir disabled
开启选项 UserDir DIR_NAME 指定用户家目录下的共享文件名
需要对用户家目录设定给apache执行权限
setfacl -m u:apache:x /home/用户
切换至用户,在用户家目录下建立 DIR_NAME 文件夹,并创建*.html文件
为保证安全,可对创建文件夹进行虚拟账户登录的认证,只有指定用户可以访问,并且需要注意的是,要将原配置文件/etc/httpd/conf.d/userdir.conf中的通用目录权限设定示例注释掉。
14.状态页面的查看
<Location /status>
SetHandler server-status
Require all granted
</Location>
表示可通过此URL在页面上显示httpd服务的状态信息,基于安全,可指定特定用户可访问
15.虚拟主机的配置
配置的基本格式如下:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path"
</VirtualHost>
(注意:在自定义/path时,需要对其目录进行授权操作)
当实现基于IP分类站点标识时,保证PORT不变,IP根据需要填写对应的ip,FQDN和/path也写入对应的输入,即可实现。
(ip的添加方法:ip a a ip_address/netmask dev DEVICE_NAME)
举例如下:
<VirtualHost 192.168.31.101:80>
DocumentRoot /app/web1
ServerName www.a.com
<Directory /app/web1>
Require all granted
</Directory>
</VirtualHost>
当实现基于PORT分类站点标识时,此时需要先对不同PORT进行listen,然后IP填写为“*”,FQDN此时是没有什么作用的,/path也写入对应的输入,即可实现。
举例如下:
listen 8001
<VirtualHost *:8001>
DocumentRoot /app/web1
ServerName www.a.com
<Directory /app/web1>
Require all granted
</Directory>
</Virtualhost>
当实现基于FQDN分类站点标识时,IP填写为“*”,PORT指定为默认,此时的FQDN则需要根据不同写入不同的域名,/path也写入对应的输入,并且还需要根据DNS,即可实现。(这种方法实际生产中常用,为了便于观察每个站点不同的日志,可以进行日志分类)
举例如下:
<VirtualHost *:80>
DocumentRoot /app/web1
ServerName www.a.com
ServerAlias a.com *.a.com
<Directory /app/web1>
Require all granted
</Directory>
ErrorLog "logs/a_error_log"
CustomLog "logs/a_access_log" combined
</VirtualHost>
curl命令行工具的使用
curl -I WEB_SERVER 查看指定服务器端的响应报文首部信息
curl -A "USER_AGENT" WEB_SERVER 可假冒某个USER_AGENT浏览器来访问服务器
curl -e "Referer" WEB_SERVER 伪造跳转路径Referer
curl -L WEB_SERVER 当访问某服务器发生跳转时,会显示跳转之后的界面
https的实现(https启用的端口为443)
1.需要安装mod_ssl软件包
2.在httpd服务器上申请证书(httpd.key、httpd.csr)
3.在CA服务器上建立CA并且颁发httpd服务器证书,需要注意的是CA建立时的默认路径以及index.txt文件和序号文件serial,并且要将CA证书一并发送给httpd服务器
4.在配置文件/etc/httpd/conf.d/ssl.conf(由安装mod_ssl生成)中,编辑以下几处:
SSLCertificateFile httpd.crt的路径
SSLCertificateKeyFile httpd.key的路径
SSLCACertificateFile cacert.pem的路径
注意:SSL基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机
https站点的启用
在配置文件/etc/httpd/conf.d/ssl.conf(由安装mod_ssl生成)中,重新指定https的网站站点路径:
DocumentRoot /DIR (默认与http下的站点路径一样)
http跳转至https的实现
1.若是跳转至别的网站,可在自定义的配置文件中加入如下选项:
Redirect [status] / https://跳转网站路径/
(其中status是根据需要填写不同的状态:temp临时、permanent永久)
2.若是需要跳转至本网站的https站点,在配置文件中加入下面:
RewriteEngine on
Rewritecond %{SERVER_PORT} !^443
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]([ ]里的内容可修改为301永久或者302临时 )
httpd可支持反向代理,基本配置选项如下:
ProxyPass "URL" "WEB_SERVER" 将客户端访问的URL转发给指定的服务器
ProxyPassReverse "URL" "WEB_SERVER"