访问网站的基本流程**

我们每天都会使用web客户端上网浏览网页,最常见的web客户端就是web浏览器,如通用的微软IE,以及技术人员偏爱的火狐浏览器、谷歌浏览器等。当我们在web浏览器输入网站地址时(例如www.baidu.com ),很快就会看到网站的内容。这一切似乎看起来很神奇,那么在其背后到底时怎样的实现流程呢?也许普通的上网者无需关注,但作为一个IT技术人员,特别时合格的Linux运维人员,就需要清晰的掌握了。

客户端用户在浏览器输入 www.baidu.com 网址地址,回车时,系统会显示 www.baidu.com 的界面:

  1. 客户端输入地址并回车
  2. 客户端,完成DNS域名解析过程(可参考https://www.yuque.com/u427629/ge071f/qb01mv
    1. 浏览器缓存
    2. 系统缓存
    3. 路由器缓存——以上三步为DNS客户端缓存
  3. ISP缓存(运营商)
  4. 根域名服务器
  5. 顶级域名服务器
  6. 主机名服务器
  7. 保存结果至缓存(DNS过程结束)
  8. 客户端,直接访问响应网址服务器,建立tcp三次握手过程
  9. 客户端,访问网址服务器,发送HTTP请求报文(多次)
  10. 服务端,响应客户端请求,回复HTTP响应报文(多次)
  11. 客户端,浏览器查看网址页面,浏览器完成html解析
  12. 客户端,结束网站访问

    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协议请求和响应过程

Y%DWG2I65SJ$W)WSTW_$1IX.png

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后面,如果页面可以缓存或者其他人访问电脑,就可以从历史记录里获得该用户的账号和密码。
    • 请求信息:index.html(首页文件)
    • 请求协议
      • HTTP0.9:仅支持GET方法,仅能访问html格式资源
      • HTTP1.0:增加POST和HEAD方法,开始支持cache,支持tcp短连接
      • HTTP1.1:支持持久连接(长连接),一个TCP允许多个请求,新增PUT、PATCH、DELETE等方法。
      • HTTP2.0:性能大幅度提升,新的二进制格式,多路复用,header压缩,服务端推送
  • 请求头:客户端有关信息介绍说明
  • 空行:和请求主体隔开
  • 请求主体

    • 使用GET方法没有请求主体
    • 使用POST方法时有请求主体信息

      2. 响应报文

  • 起始行

    • 协议版本
    • 状态码
      • 1xx:指示信息——表示请求已接收,继续处理
      • 2xx:成功——表示请求已经被成功接收、处理
      • 3xx:重定向——要完成请求必须进行更进一步的操作
      • 4xx:客户端错误——请求语法有错误或者请求无法实现
      • 5xx:服务端错误——服务器未能实现合法的请求
      • 301:请求永久重定向
      • 302:请求临时重定向
      • 304:请求被重定向到客户端本地缓存
      • 400:客户端请求存在语法错误
      • 401:客户端请求没有授权
      • 403:客户端请求被服务器拒绝,一般为客户端没有访问权限
      • 404:客户端请求的URL在服务端不存在
      • 500:服务端永久错误
      • 503:服务端临时错误
  • 响应头部
  • 空行
  • 响应主体

网站测评指标

  • IP:根据用户访问的源IP信息进行统计
  • PV:根据用户页面访问量进行统计,即点击量
  • UV:根据用户访问的cookie信息,统计用户访问量
  • 网站并发:单位时间内同时处理的请求数
  • 对网站进行压力测试:

  • 什么是Apache

    • Apache HTTP Server简称Apache,是Apache软件基金会的一个高性能、功能强大、可靠、灵活的开源web服务软件,可以运行在广泛的计算机平台如Linux、Windows。因其平台适应性和很好的安全性而被广泛使用,是互联网最流行的web服务软件之一。
  • 特点
    • 功能强大
    • 速度快
    • 稳定可靠
    • 高度模块化,支持第三方模块
    • 采用MPM多路处理模块
    • 双向认证
  • 应用场合
    • 使用Apache加载静态HTML网页、图片
    • 使用Apache结合PHP、Linux、MySQL可以组成LAMP经典架构
    • 使用apache作代理、负载均衡等
  • MPM工作模式
    • prefork:多进程I/O模型,一个主进程,管理多个子进程,每个子进程处理一个请求
    • worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程管理多个线程,每个线程处理一个请求
    • event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求

      安装并设置第一个站点

  1. 安装httpd并启动服务,准备首页文件

    1. [root@localhost ~]#yum install -y httpd
    2. [root@localhost ~]#echo '<h1>It works!</h1>' > /var/www/html/index.html
    3. [root@localhost ~]#systemctl start httpd
  2. 关闭防火墙和selinux

    1. [root@localhost ~]#systemctl stop firewalld
    2. [root@localhost ~]#systemctl status firewalld
    3. [root@localhost ~]#setenforce 0
    4. [root@localhost ~]#getenforce
  3. 查看端口

    1. [root@localhost ~]# ss -tanl | grep 80
  4. 查看进程

    1. [root@localhost ~]# ps -ef |grep http

    VAXU0A@JS42$AGP`GIGE8PH.png

  5. 在本地服务器进行测试

    1. [root@localhost ~]#wget <http://IP地址>
    2. [root@localhost ~]#curl <IP地址>

    ARUU1VOG00EV8MVXVYJ_HJ0.png

  • 文件说明

/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/:站点目录

  • 主配置文件
    1. # grep里面 ^字符:锚定字符开头的行
    2. # [^字符]:匹配一个不在指定范围内的字符
    3. [root@localhost ~]# grep '^[^ #]' /etc/httpd/conf/httpd.conf
    4. ServerRoot "/etc/httpd" # 服务器的根
    5. Listen 80 # 监听的端口
    6. Include conf.modules.d/*.conf # 包含模块
    7. User apache # 用户
    8. Group apache # 属组
    9. ServerAdmin root@localhost # 服务器管理员
    10. DocumentRoot "/var/www/html" # 站点文件根目录
    11. ErrorLog "logs/error_log" # 错误日志
    12. LogLevel warn # 日志等级
    13. EnableSendfile on # 开启发送文件服务
    14. IncludeOptional conf.d/*.conf # 虚拟服务器配置文件
    15. 说明:<></>此类称之为容器,针对某个容器做配置

    持久连接的配置

    1. [root@localhost ~]# cat /etc/httpd/conf.d/keeplive.conf
    2. KeepAlive on # 持久连接默认开启,时间是5秒
    3. KeepAliveTimeout 30 # 连接超时
    4. MaxKeepAliveRequests 100 # 最大保持连接数量
    5. [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

  1. 若要使用workerevent工作模型,只需要在/etc/httpd/conf.modules.d/00-mpm.conf中取消对应注释即可
  2. <a name="HkKmN"></a>
  3. ## 访问控制机制(更改站点根目录案例)
  4. 1. 修改配置文件,重新定义根目录
  5. ```bash
  6. [root@localhost ~]# cd /etc/httpd/conf
  7. [root@localhost conf]# vim httpd.conf
  8. ...
  9. DocumentRoot "/data/www/html"
  10. ...
  11. [root@localhost conf]# mkdir -pv /data/www/html
  12. # 准备页面
  13. [root@localhost conf]# echo 'path is /data/www/html' > /data/www/html/index.html
  14. # 重启服务
  15. [root@localhost conf]# systemctl restart httpd
  1. 测试访问,发现状态码为403,没有访问权限

    1. [root@localhost conf]# curl 192.168.80.132 -I
    2. HTTP/1.1 403 Forbidden
    3. Date: Sat, 06 Mar 2021 07:29:34 GMT
    4. Server: Apache/2.4.6 (CentOS)
    5. Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
    6. ETag: "1321-5058a1e728280"
    7. Accept-Ranges: bytes
    8. Content-Length: 4897
    9. Content-Type: text/html; charset=UTF-8
  2. 访问控制机制中开放响应目录权限

    1. [root@localhost conf]# vim httpd.conf
    2. <Directory "/data/www/html">
    3. Require all granted
    4. </Directory>
    5. [root@localhost conf]# systemctl restart httpd
  3. 再次测试发现成功访问 ```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

  1. - 详细的范围跟配置参数
  2. ```basic
  3. Require常见配置参数:
  4. Require all granted # 全部放行
  5. Require all denied # 全部拒绝
  6. Require ip IPAdd # 放行某ip地址
  7. Require no ip IPAdd # 拒绝某ip地址
  8. Require user user1 # 放行某用户
  9. Require group group1 # 放行某组
  10. PS:34参数需要在…中才可以。
  11. <RequireAll>
  12. Require all granted
  13. Require not ip 10.252.46.165
  14. </RequireAll>

用户访问控制

ps:
htpasswd
-c:创建passwdfile。 如果passwdfile已经存在,则将其重写并截断。
-m:使用md5加密
-b:从命令行获取密码

  1. 创建用户认证文件

    1. [root@localhost conf]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
    2. New password:
    3. Re-type new password:
    4. Adding password for user lisi
    5. [root@localhost conf]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan zhangsan
    6. Adding password for user zhangsan
  2. 修改配置文件,启用用户认证(只允许用户lisi访问)

    1. [root@localhost conf]# vim /etc/httpd/conf/httpd.conf
    2. <Directory "/data/www/html">
    3. AuthType Basic
    4. AuthName "Restricted Resource"
    5. AuthBasicProvider file
    6. AuthUserFile /etc/httpd/conf.d/.htpassword
    7. Require user lisi
    8. </Directory>
    9. [root@localhost conf]# systemctl restart httpd
  3. 测试发现lisi可以成功访问,张三不可以成功访问

HF5LF)WLOR6{@VUPK21]O92.png
![D[[L)ROYK7F1MXJ}F`40$N.png

  • 扩展,认证组文件
    1. 通过认证组文件:
    2. <Directory "/data/www/html">
    3. AuthType Basic
    4. AuthName "Restricted Resource"
    5. AuthBasicProvider file
    6. AuthUserFile /etc/httpd/conf.d/.htpassword
    7. AuthGroupFile /etc/httpd/conf.d/.htgroup
    8. Require group group1
    9. </Directory>
    10. 使用浏览器访问测试即可!

    虚拟主机

    基于IP地址

    实现一台服务器分配不同的IP地址,访问不同地址可以访问不同页面
  1. 配置网络地址

    1. [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
    2. TYPE="Ethernet"
    3. PROXY_METHOD="none"
    4. BROWSER_ONLY="no"
    5. BOOTPROTO="static" # dhcp改为static
    6. DEFROUTE="yes"
    7. IPV4_FAILURE_FATAL="no"
    8. IPV6INIT="yes"
    9. IPV6_AUTOCONF="yes"
    10. IPV6_DEFROUTE="yes"
    11. IPV6_FAILURE_FATAL="no"
    12. IPV6_ADDR_GEN_MODE="stable-privacy"
    13. NAME="ens33"
    14. UUID="36f7dae6-96b5-46e2-8d5a-1371ecd63587"
    15. DEVICE="ens33"
    16. ONBOOT="yes"
    17. IPADDR0=192.168.80.100 #配置两个地址,子网掩码和网关
    18. NETMASK=255.255.255.0
    19. GATEWAY=192.168.80.1
    20. IPADDR1=192.168.80.200
    21. NETMASK=255.255.255.0
    22. GATEWAY=192.168.80.1
    23. DNS1=114.114.114.114
    24. [root@localhost ~]# systemctl restart network

    ![28J4HRQ7$IZO8DWDUJ_$5L.png

  2. 登陆上新的IP地址,修改网站配置文件

    1. [root@localhost ~]# vim /etc/httpd/conf.d/ip_site.conf
    2. <Directory "/data/">
    3. Require all granted
    4. </Directory>
    5. <VirtualHost 192.168.80.100:80>
    6. # Servername www.site1.com
    7. DocumentRoot "/data/site1/"
    8. </VirtualHost>
    9. <VirtualHost 192.168.80.200:80>
    10. # Servername www.site2.com
    11. DocumentRoot "/data/site2/"
    12. </VirtualHost>
    13. [root@localhost ~]# systemctl restart httpd
  3. 准备网站内容

    1. [root@localhost ~]# mkdir -pv /data/{site1,site2}
    2. [root@localhost ~]# vim /data/site1/index.html
    3. this is site1
    4. [root@localhost ~]# vim /data/site2/index.html
    5. this is site2
  4. 访问测试

}{NSR(UCBH}LJIDN3(CF~I1.pngZC8ALHB3RYYH@@X]7ET5OJ7.png

基于端口

访问不同端口浏览不同页面

  1. 创建网站配置文件 ```bash [root@localhost ~]# vim /etc/httpd/conf.d/port_site.conf listen 8080 listen 9090
Require all granted

Servername www.site1.com

DocumentRoot “/data/site3/“

Servername www.site2.com

DocumentRoot “/data/site4/“

  1. 2. 准备网站内容,重启服务
  2. ```bash
  3. [root@localhost ~]# mkdir -pv /data/{site3,site4}
  4. [root@localhost ~]# vim /data/site3/index.html
  5. <h1>this is site3</h1>
  6. [root@localhost ~]# vim /data/site4/index.html
  7. <h1>this is site4</h1>
  8. [root@localhost ~]# systemctl restart httpd
  1. 测试访问

8ACA``02T_L~@@)`0@8OKY9.png

基于FQDN

访问不同URL浏览不同页面

  1. 网站配置文件 ```bash [root@localhost ~]# vim /etc/httpd/conf.d/fqdn_site.conf listen 10101
Require all granted

Servername www.site5.com

DocumentRoot “/data/site5/“

Servername www.site6.com

DocumentRoot “/data/site6/“

  1. 2. 准备网站内容,将DNS解析写入/etc/hosts文件,重启httpd服务
  2. ```bash
  3. [root@localhost ~]# mkdir -pv /data/{site5,site6}
  4. [root@localhost ~]# vim /data/site5/index.html
  5. <h1>this is site5</h1>
  6. [root@localhost ~]# vim /data/site6/index.html
  7. <h1>this is site6</h1>
  8. [root@localhost ~]# vim /etc/hosts
  9. 192.168.0.142 www.site5.com
  10. 192.168.0.142 www.site6.com
  11. [root@localhost ~]# systemctl restart httpd
  1. 测试访问

)Z]GYC_`5G(580KOW@I%_Z5.png

SSL配置(https,SSL安全通道)

解析

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

工作过程

服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

配置过程

  1. 安装mod_ssl和openssl工具

    1. [root@localhost ~]# yum install mod_ssl openssl -y
  2. 生成2048位的服务器加密私钥server.key

    1. [root@localhost ~]# openssl genrsa -out server.key 2048
  3. 生成证书签名请求server.csr

    1. [root@localhost ~]# openssl req -new -key server.key -out server.csr
  4. 生成类型为X509的自签名证书,有效期为十年,即3650天的server.crt

    1. [root@localhost ~]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
  5. 复制文件到相应位置

    1. [root@localhost ~]# cp server.crt /etc/pki/tls/certs/
    2. [root@localhost ~]# cp server.key /etc/pki/tls/private/
    3. [root@localhost ~]# cp server.csr /etc/pki/tls/private/
  6. 修改配置文件/etc/httpd/conf/httpd.conf

    1. Servername 192.168.0.140:443
    2. SSLCertificateFile /etc/pki/tls/certs/server.crt
    3. SSLCertificateKeyFile /etc/pki/tls/private/server.key
  7. 重启服务,防火墙放行

    1. [root@localhost ~]# systemctl restart httpd
    2. [root@localhost ~]# firewall-cmd --add-port=443/tcp --per
  8. 测试访问时提示警告即成功