访问网站的基本流程**
我们每天都会使用web客户端上网浏览网页,最常见的web客户端就是web浏览器,如通用的微软IE,以及技术人员偏爱的火狐浏览器、谷歌浏览器等。当我们在web浏览器输入网站地址时(例如www.baidu.com ),很快就会看到网站的内容。这一切似乎看起来很神奇,那么在其背后到底时怎样的实现流程呢?也许普通的上网者无需关注,但作为一个IT技术人员,特别时合格的Linux运维人员,就需要清晰的掌握了。
客户端用户在浏览器输入 www.baidu.com 网址地址,回车时,系统会显示 www.baidu.com 的界面:
- 客户端输入地址并回车
- 客户端,完成DNS域名解析过程(可参考https://www.yuque.com/u427629/ge071f/qb01mv)
- 浏览器缓存
- 系统缓存
- 路由器缓存——以上三步为DNS客户端缓存
- ISP缓存(运营商)
- 根域名服务器
- 顶级域名服务器
- 主机名服务器
- 保存结果至缓存(DNS过程结束)
- 客户端,直接访问响应网址服务器,建立tcp三次握手过程
- 客户端,访问网址服务器,发送HTTP请求报文(多次)
- 服务端,响应客户端请求,回复HTTP响应报文(多次)
- 客户端,浏览器查看网址页面,浏览器完成html解析
- 客户端,结束网站访问
HTTP协议
简介
- HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,是互联网中最常用的一种网络协议。HTTP重要应用之一是www服务。涉及HTTP协议最初的目的就是提供一种发布和接受HTML页面的方法。HTTP协议是互联网上最常用的通信协议之一,它有很多的应用,但最流行的就是用于web浏览器和web服务器之间的通信,即www应用或称web应用
- HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件, 查询结果等)的应用层协议
- 工作原理:HTTP协议工作于C/S或B/S架构。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 Web服务器根据接收到的请求后,向客户端发送响应信息。
URI和URL
- 统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。
- URL是一种特殊类型的URI,全称是UniformResourceLocator(统一资源定位符),是互联网上用来标识某一处资源的地址。
- 比如,http://www.runoob.com/http/http‐tutorial.html
HTTP协议请求和响应过程
1. http请求报文
- 请求行
- 请求方法
- GET:请求指定的页面信息
- HEAD:类似于GET,但只返回头部信息。一个使用场景是下载一个大文件之前先获得文件的大小,再决定要不要下载,节省了带宽。
- POST:向指定资源提交数据,进行处理请求(例如提交表单或上传文件)
- PUT:从客户端向服务端传送数据替代指定的文档内容
- DELETE:请求服务器删除指定的页面
- CONNECT:预留给能够将连接改为管道的代理服务器
- OPTIONS:允许客户端查看查看服务器性能
- TRACE:回显服务器收到的请求,主要用于测试和诊断
- GET方法和POST方法的区别
- GET方法提交的数据加在URL的后面,以“?”分割URL和传输的数据,以“&”分割参数,如
EditPosts.aspx? name=test1&id=123456。POST方法提交的数据是放在HTTP包的body中。 - GET方法提交的数据有大小限制(浏览器限制URL长度),POST方法提交的数据没有没有限制。
- GET方法使用的是
request.QueryString来取得变量的值,POST方法使用后的是request.Form来取得变量的值。 - GET方法使用有安全隐患,输入用户名密码会显示在URL后面,如果页面可以缓存或者其他人访问电脑,就可以从历史记录里获得该用户的账号和密码。
- GET方法提交的数据加在URL的后面,以“?”分割URL和传输的数据,以“&”分割参数,如
- 请求信息:index.html(首页文件)
- 请求协议
- HTTP0.9:仅支持GET方法,仅能访问html格式资源
- HTTP1.0:增加POST和HEAD方法,开始支持cache,支持tcp短连接
- HTTP1.1:支持持久连接(长连接),一个TCP允许多个请求,新增PUT、PATCH、DELETE等方法。
- HTTP2.0:性能大幅度提升,新的二进制格式,多路复用,header压缩,服务端推送
- 请求方法
- 请求头:客户端有关信息介绍说明
- 空行:和请求主体隔开
请求主体
起始行
- 协议版本
- 状态码
- 1xx:指示信息——表示请求已接收,继续处理
- 2xx:成功——表示请求已经被成功接收、处理
- 3xx:重定向——要完成请求必须进行更进一步的操作
- 4xx:客户端错误——请求语法有错误或者请求无法实现
- 5xx:服务端错误——服务器未能实现合法的请求
- 301:请求永久重定向
- 302:请求临时重定向
- 304:请求被重定向到客户端本地缓存
- 400:客户端请求存在语法错误
- 401:客户端请求没有授权
- 403:客户端请求被服务器拒绝,一般为客户端没有访问权限
- 404:客户端请求的URL在服务端不存在
- 500:服务端永久错误
- 503:服务端临时错误
- 响应头部
- 空行
- 响应主体
网站测评指标
- IP:根据用户访问的源IP信息进行统计
- PV:根据用户页面访问量进行统计,即点击量
- UV:根据用户访问的cookie信息,统计用户访问量
- 网站并发:单位时间内同时处理的请求数
对网站进行压力测试:
yum install -y httpd-toolsab -n 100 -c 10 https://ip/ 其中-n表示请求数,-c表示并发数常用的网站服务软件
https://w3techs.com/technologies/overview/web_server
Apache服务
介绍
什么是Apache
- Apache HTTP Server简称Apache,是Apache软件基金会的一个高性能、功能强大、可靠、灵活的开源web服务软件,可以运行在广泛的计算机平台如Linux、Windows。因其平台适应性和很好的安全性而被广泛使用,是互联网最流行的web服务软件之一。
- 特点
- 功能强大
- 速度快
- 稳定可靠
- 高度模块化,支持第三方模块
- 采用MPM多路处理模块
- 双向认证
- 应用场合
- 使用Apache加载静态HTML网页、图片
- 使用Apache结合PHP、Linux、MySQL可以组成LAMP经典架构
- 使用apache作代理、负载均衡等
- MPM工作模式
安装httpd并启动服务,准备首页文件
[root@localhost ~]#yum install -y httpd[root@localhost ~]#echo '<h1>It works!</h1>' > /var/www/html/index.html[root@localhost ~]#systemctl start httpd
关闭防火墙和selinux
[root@localhost ~]#systemctl stop firewalld[root@localhost ~]#systemctl status firewalld[root@localhost ~]#setenforce 0[root@localhost ~]#getenforce
查看端口
[root@localhost ~]# ss -tanl | grep 80
查看进程
[root@localhost ~]# ps -ef |grep http

在本地服务器进行测试
[root@localhost ~]#wget <http://IP地址>[root@localhost ~]#curl <IP地址>

- 文件说明
/etc/httpd/:主配置文件目录
/etc/httpd/conf/httpd.conf:服务配置文件
/etc/httpd/conf.d/:服务配置目录(模块化)
/etc/httpd/conf.modules.d/:模块配置目录
/etc/sysconfig/httpd:守护进程配置文件
/usr/lib64/httpd/modules/:可用模块
/usr/sbin/:相关命令目录
/var/log/httpd/:日志目录
/var/www/:站点目录
- 主配置文件
# grep里面 ^字符:锚定字符开头的行# [^字符]:匹配一个不在指定范围内的字符[root@localhost ~]# grep '^[^ #]' /etc/httpd/conf/httpd.confServerRoot "/etc/httpd" # 服务器的根Listen 80 # 监听的端口Include conf.modules.d/*.conf # 包含模块User apache # 用户Group apache # 属组ServerAdmin root@localhost # 服务器管理员DocumentRoot "/var/www/html" # 站点文件根目录ErrorLog "logs/error_log" # 错误日志LogLevel warn # 日志等级EnableSendfile on # 开启发送文件服务IncludeOptional conf.d/*.conf # 虚拟服务器配置文件说明:<></>此类称之为容器,针对某个容器做配置
持久连接的配置
[root@localhost ~]# cat /etc/httpd/conf.d/keeplive.confKeepAlive on # 持久连接默认开启,时间是5秒KeepAliveTimeout 30 # 连接超时MaxKeepAliveRequests 100 # 最大保持连接数量[root@localhost ~]# systemctl restart httpd
修改多路处理模块
```bash [root@localhost ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 默认参数: StartServers 5 # 服务启动时的进程数 MaxSpareServers 10 # 最大空闲服务进程数 MinSpareServers 5 # 最小空闲进程数 MaxRequestWorkers 256 # 单个进程最多接受的请求数
[root@localhost ~]# ps aux | grep http root 28298 0.0 0.2 224068 5052 ? Ss 15:01 0:00 /usr/sbin/httpd -DFOREGROUND apache 28299 0.0 0.1 224068 2964 ? S 15:01 0:00 /usr/sbin/httpd -DFOREGROUND apache 28300 0.0 0.1 224068 2964 ? S 15:01 0:00 /usr/sbin/httpd -DFOREGROUND apache 28301 0.0 0.1 224068 2964 ? S 15:01 0:00 /usr/sbin/httpd -DFOREGROUND apache 28302 0.0 0.1 224068 2964 ? S 15:01 0:00 /usr/sbin/httpd -DFOREGROUND apache 28303 0.0 0.1 224068 2964 ? S 15:01 0:00 /usr/sbin/httpd -DFOREGROUND root 29251 0.0 0.0 112724 988 pts/0 S+ 15:20 0:00 grep —color=auto http
若要使用worker和event工作模型,只需要在/etc/httpd/conf.modules.d/00-mpm.conf中取消对应注释即可<a name="HkKmN"></a>## 访问控制机制(更改站点根目录案例)1. 修改配置文件,重新定义根目录```bash[root@localhost ~]# cd /etc/httpd/conf[root@localhost conf]# vim httpd.conf...DocumentRoot "/data/www/html"...[root@localhost conf]# mkdir -pv /data/www/html# 准备页面[root@localhost conf]# echo 'path is /data/www/html' > /data/www/html/index.html# 重启服务[root@localhost conf]# systemctl restart httpd
测试访问,发现状态码为403,没有访问权限
[root@localhost conf]# curl 192.168.80.132 -IHTTP/1.1 403 ForbiddenDate: Sat, 06 Mar 2021 07:29:34 GMTServer: Apache/2.4.6 (CentOS)Last-Modified: Thu, 16 Oct 2014 13:20:58 GMTETag: "1321-5058a1e728280"Accept-Ranges: bytesContent-Length: 4897Content-Type: text/html; charset=UTF-8
访问控制机制中开放响应目录权限
[root@localhost conf]# vim httpd.conf<Directory "/data/www/html">Require all granted</Directory>[root@localhost conf]# systemctl restart httpd
再次测试发现成功访问 ```bash [root@localhost conf]# curl 192.168.80.132 -I HTTP/1.1 200 OK Date: Sat, 06 Mar 2021 07:40:14 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sat, 06 Mar 2021 07:28:41 GMT ETag: “17-5bcd926687b5d” Accept-Ranges: bytes Content-Length: 23 Content-Type: text/html; charset=UTF-8
[root@localhost conf]# curl 192.168.80.132 path is /data/www/html
- 详细的范围跟配置参数```basicRequire常见配置参数:Require all granted # 全部放行Require all denied # 全部拒绝Require ip IPAdd # 放行某ip地址Require no ip IPAdd # 拒绝某ip地址Require user user1 # 放行某用户Require group group1 # 放行某组PS:34参数需要在…中才可以。<RequireAll>Require all grantedRequire not ip 10.252.46.165</RequireAll>
用户访问控制
ps:
htpasswd
-c:创建passwdfile。 如果passwdfile已经存在,则将其重写并截断。
-m:使用md5加密
-b:从命令行获取密码
创建用户认证文件
[root@localhost conf]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisiNew password:Re-type new password:Adding password for user lisi[root@localhost conf]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan zhangsanAdding password for user zhangsan
修改配置文件,启用用户认证(只允许用户lisi访问)
[root@localhost conf]# vim /etc/httpd/conf/httpd.conf<Directory "/data/www/html">AuthType BasicAuthName "Restricted Resource"AuthBasicProvider fileAuthUserFile /etc/httpd/conf.d/.htpasswordRequire user lisi</Directory>[root@localhost conf]# systemctl restart httpd
测试发现lisi可以成功访问,张三不可以成功访问
![HF5LF)WLOR6{@VUPK21]O92.png](/uploads/projects/u427629@ge071f/5390728db0e9a7abb5142626090607b3.png)
![D[[L)ROYK7F1MXJ}F`40$N.png
- 扩展,认证组文件
通过认证组文件:<Directory "/data/www/html">AuthType BasicAuthName "Restricted Resource"AuthBasicProvider fileAuthUserFile /etc/httpd/conf.d/.htpasswordAuthGroupFile /etc/httpd/conf.d/.htgroupRequire group group1</Directory>使用浏览器访问测试即可!
虚拟主机
基于IP地址
实现一台服务器分配不同的IP地址,访问不同地址可以访问不同页面
配置网络地址
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet"PROXY_METHOD="none"BROWSER_ONLY="no"BOOTPROTO="static" # dhcp改为staticDEFROUTE="yes"IPV4_FAILURE_FATAL="no"IPV6INIT="yes"IPV6_AUTOCONF="yes"IPV6_DEFROUTE="yes"IPV6_FAILURE_FATAL="no"IPV6_ADDR_GEN_MODE="stable-privacy"NAME="ens33"UUID="36f7dae6-96b5-46e2-8d5a-1371ecd63587"DEVICE="ens33"ONBOOT="yes"IPADDR0=192.168.80.100 #配置两个地址,子网掩码和网关NETMASK=255.255.255.0GATEWAY=192.168.80.1IPADDR1=192.168.80.200NETMASK=255.255.255.0GATEWAY=192.168.80.1DNS1=114.114.114.114[root@localhost ~]# systemctl restart network
![28J4HRQ7$IZO8DWDUJ_$5L.png
登陆上新的IP地址,修改网站配置文件
[root@localhost ~]# vim /etc/httpd/conf.d/ip_site.conf<Directory "/data/">Require all granted</Directory><VirtualHost 192.168.80.100:80># Servername www.site1.comDocumentRoot "/data/site1/"</VirtualHost><VirtualHost 192.168.80.200:80># Servername www.site2.comDocumentRoot "/data/site2/"</VirtualHost>[root@localhost ~]# systemctl restart httpd
准备网站内容
[root@localhost ~]# mkdir -pv /data/{site1,site2}[root@localhost ~]# vim /data/site1/index.htmlthis is site1[root@localhost ~]# vim /data/site2/index.htmlthis is site2
访问测试
基于端口
访问不同端口浏览不同页面
- 创建网站配置文件 ```bash [root@localhost ~]# vim /etc/httpd/conf.d/port_site.conf listen 8080 listen 9090
Servername www.site1.com
DocumentRoot “/data/site3/“
Servername www.site2.com
DocumentRoot “/data/site4/“
2. 准备网站内容,重启服务```bash[root@localhost ~]# mkdir -pv /data/{site3,site4}[root@localhost ~]# vim /data/site3/index.html<h1>this is site3</h1>[root@localhost ~]# vim /data/site4/index.html<h1>this is site4</h1>[root@localhost ~]# systemctl restart httpd
- 测试访问
基于FQDN
访问不同URL浏览不同页面
- 网站配置文件 ```bash [root@localhost ~]# vim /etc/httpd/conf.d/fqdn_site.conf listen 10101
Servername www.site5.com
DocumentRoot “/data/site5/“
Servername www.site6.com
DocumentRoot “/data/site6/“
2. 准备网站内容,将DNS解析写入/etc/hosts文件,重启httpd服务```bash[root@localhost ~]# mkdir -pv /data/{site5,site6}[root@localhost ~]# vim /data/site5/index.html<h1>this is site5</h1>[root@localhost ~]# vim /data/site6/index.html<h1>this is site6</h1>[root@localhost ~]# vim /etc/hosts192.168.0.142 www.site5.com192.168.0.142 www.site6.com[root@localhost ~]# systemctl restart httpd
- 测试访问
![)Z]GYC_`5G(580KOW@I%_Z5.png](/uploads/projects/u427629@ge071f/17843b603f7dd076439a6b74bb105748.png)
SSL配置(https,SSL安全通道)
解析
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
工作过程
服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。
用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。
配置过程
安装mod_ssl和openssl工具
[root@localhost ~]# yum install mod_ssl openssl -y
生成2048位的服务器加密私钥server.key
[root@localhost ~]# openssl genrsa -out server.key 2048
生成证书签名请求server.csr
[root@localhost ~]# openssl req -new -key server.key -out server.csr
生成类型为X509的自签名证书,有效期为十年,即3650天的server.crt
[root@localhost ~]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
复制文件到相应位置
[root@localhost ~]# cp server.crt /etc/pki/tls/certs/[root@localhost ~]# cp server.key /etc/pki/tls/private/[root@localhost ~]# cp server.csr /etc/pki/tls/private/
修改配置文件/etc/httpd/conf/httpd.conf
Servername 192.168.0.140:443SSLCertificateFile /etc/pki/tls/certs/server.crtSSLCertificateKeyFile /etc/pki/tls/private/server.key
重启服务,防火墙放行
[root@localhost ~]# systemctl restart httpd[root@localhost ~]# firewall-cmd --add-port=443/tcp --per
测试访问时提示警告即成功

