访问网站的基本流程

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

第一步:客户端用户在浏览器输入 www.baidu.com 网址地址,回车时,系统会显示 www.baidu.com 的 界面
1. 客户端,浏览器输入网址信息点击回车
2. 客户端,完成域名解析过程DNS
3. 浏览器缓存
4. 系统缓存
5. 路由器缓存————————以上均为DNS客户端的缓存!!
6. ISP DNS缓存
7. 根域名服务器
8. 顶级域名服务器
9. 主机名服务器
10. 保存结果至缓存
11. 客户端,直接访问响应网址服务器,建立tcp三次握手过程
12. 客户端,访问网址服务器,发送HTTP请求报文(多次)
13. 服务端,响应客户端请求,回复HTTP响应报文(多次)
14. 客户端,浏览器查看到网址页面,浏览器完成html解析
15. 客户端,结束网站访问

HTTP协议

简介

  1. HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议,是互联网中最常用的 一种网络协议。HTTP重要应用之一是www服务。涉及HTTP协议最初的目的就是提供一种发布和接 HTML页面的方法。HTTP协议是互联网上最常用的通信协议之一,它有很多的应用,但最流行的 就是用于web浏览器和web服务器之间的通信,即www应用或称web应用 <br /> HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件, 查询结果等)的应用层协议 <br /> HTTP协议工作于C/SB/S架构。浏览器作为HTTP客户端通过URLHTTP服务端即WEB服务器发 送所有请求。 Web服务器根据接收到的请求后,向客户端发送响应信息。

URl和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方法的区别:1.GET提交的数据会放在URL之后,以?分割URL和传输数 据,参数之间以&相连,如 EditPosts.aspx? name=test1&id=123456 . POST方法是 把提交的数据放在HTTP包的Body中。 2.GET提交的数据大小有限制(因为浏览器对URL 的长度有限制),而POST方法提交的数据没有限制。 3.GET方式需要使用 Request.QueryString 来取得变量的值,而POST方式通过 Request.Form 来获取变量 的值。 4.GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交 数据时,用户名和密码将出现在URL 上,如果页面可以被缓存或者其他人可以访问这台 机器,就可以从历史记录获得该用户的账号和密码。
    请求信息
    index.html(首页文件)
    请求协议
    HTTP0.9:仅支持GET方法,仅能访问HTML格式的资源
    HTTP1.0:增加POST和HEAD方法,MIME支持多种数据格式,开始支持Cache,支持 tcp短连接
    HTTP1.1:支持持久连接(长连接),一个TCP连接允许多个请求,新增PUT、PATCH、 DELETE等
    HTTP2.0:性能大幅提升,新的二进制格式,多路复用,header压缩,服务端推送。
    请求头
    客户端有关信息介绍说明
    空行
    和请求主体分开
    请求主体
    使用get方法时,没有请求主体
    使用post方法时,有请求主体信息
    2.响应报文
    起始行
    协议版本
    状态码
    1xx:指示信息——表示请求已经接收,继续处理
    2xx:成功——表示请求已经被成功接收、理解、接收
    3xx:重定向——要完成请求必须进行更进一步的操作
    4xx:客户端错误——请求的语法有错误或请求无法实现
    5xx:服务端错误——服务器未能实现合法的请求!
    200:OK请求已经正常处理完毕
    301:请求永久重定向
    302:请求临时重定向
    304:请求被重定向到客户端本地缓存
    400:客户端请求存在语法错误
    401:客户端请求没有经过授权
    403:客户端的请求被服务器拒绝,一般为客户端没有访问权限
    404:客户端请求的URL在服务端不存在
    500:服务端永久错误 503:服务端发生临时错误
    响应头部
    空行
    相应主体

    网站测评指标

    IP:根据用户访问的源IP信息进行统计
    统计一天内访问网站最对的前十个地址
    PV:根据用户页面访问量进行统计
    统计一个用户访问页面数量最对的前十个页面
    UV:根据用户访问的cookie信息,统计用户访问数量
    网站并发:单位时间内同时处理的请求数
    对网站进行压力测试
    1. yum install -y httpd-tools
    2. ab -n 100 -c 10 https://ip/

    常用的网站服务软件

    https://w3techs.com/technologies/overview/web_server
    PS%$XY)TFYRB%6FWARRN85H.png

    Apache服务

    Apache介绍

    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. [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
  5. 在服务器本地进行测试

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

    文件说明

    1. /etc/httpd/:主配置文件目录
    2. /etc/httpd/conf/httpd.conf:服务配置文件
    3. /etc/httpd/conf.d/:服务配置目录(模块化)
    4. /etc/httpd/conf.modules.d/:模块配置目录
    5. /etc/sysconfig/httpd:守护进程配置文件
    6. /usr/lib64/httpd/modules/:可用模块
    7. /usr/sbin/:相关命令目录
    8. /var/log/httpd/:日志目录
    9. /var/www/:站点目录

    主配置文件

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

    持久连接的配置

    1. KeepAlive默认是on,时间是5秒。
    2. KeepAliveTimeout # 连接超时
    3. MaxKeepAliveRequests # 最大保持连接请求
    4. [root@node3 conf.d]# cat /etc/httpd/conf.d/keeplive.conf
    5. KeepAlive on
    6. KeepAliveTimeout 30
    7. MaxKeepAliveRequests 100
    8. [root@node3 conf.d]# systemctl restart httpd

    修改多路处理模块

    1. [root@node1 ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf | grep -Ev "^#|^$"
    2. LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
    3. 默认参数:
    4. StartServers 5 # 服务启动时的进程数
    5. MaxSpareServers 10 # 最大空闲服务进程数
    6. MinSpareServers 5 # 最小空闲进程数
    7. MaxRequestWorkers 256 # 单个进程最多接受的进程数
    8. [root@node3 conf.d]# ps aux | grep httpd
    9. root 12886 0.4 0.2 221928 4956 ? Ss 11:03 0:00 /usr/sbin/httpd -
    10. DFOREGROUND
    11. apache 12887 0.0 0.1 221928 2992 ? S 11:03 0:00 /usr/sbin/httpd -
    12. DFOREGROUND
    13. apache 12888 0.0 0.1 221928 2992 ? S 11:03 0:00 /usr/sbin/httpd -
    14. DFOREGROUND
    15. apache 12889 0.0 0.1 221928 2992 ? S 11:03 0:00 /usr/sbin/httpd -
    16. DFOREGROUND
    17. apache 12890 0.0 0.1 221928 2992 ? S 11:03 0:00 /usr/sbin/httpd -
    18. DFOREGROUND
    19. apache 12891 0.0 0.1 221928 2992 ? S 11:03 0:00 /usr/sbin/httpd -
    20. DFOREGROUND
    21. 若要使用workerevent工作模型,只需要在/etc/httpd/conf.modules.d/00-mpm.conf中取消
    22. 对应注释即可

    访问控制机制

    更改站点根目录案例
    重新定义根目录

    1. # 定义服务器的文档的页面路径:
    2. [root@server1 conf]# vim httpd.conf
    3. ......
    4. DocumentRoot "/data/www/html"
    5. ......
    6. # 准备页面
    7. [root@server1 ~]# echo "this path /data/wwww/html" >
    8. /data/www/html/index.html
    9. # 重启服务
    10. [root@server1 ~]# systemctl restart httpd

    测试访问,发现状态码为403没有权限

    1. [root@server1 conf]# curl 192.168.80.151 -I
    2. HTTP/1.1 403 Forbidden
    3. Date: Mon, 22 Feb 2021 06:19:54 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

    访问控制机制中开放相应目录权限

    1. [root@server1 conf]# vim httpd.conf
    2. <Directory "/data/www/html">
    3. Require all granted
    4. </Directory>
    5. [root@server1 ~]# systemctl restart httpd

    再次测试访问发现可以成功访问

    1. [root@server1 conf]# curl 192.168.80.151 -I
    2. HTTP/1.1 200 OK
    3. Date: Mon, 22 Feb 2021 06:21:15 GMT
    4. Server: Apache/2.4.6 (CentOS)
    5. Last-Modified: Mon, 22 Feb 2021 06:18:57 GMT
    6. ETag: "1a-5bbe6c6eb43fa"
    7. Accept-Ranges: bytes
    8. Content-Length: 26
    9. Content-Type: text/html; charset=UTF-8
    10. [root@server1 conf]# curl 192.168.80.151
    11. this path /data/wwww/html

    更加详细的访问控制配置的参数

    1. Require常见配置参数:
    2. Require all granted # 全部放行
    3. Require all denied # 全部拒绝
    4. Require ip IPAd # 放行某ip地址
    5. Require no ip IP # 拒绝某ip地址
    6. Require user user1 # 放行某用户
    7. Require group group1 # 放行某组
    8. PS34参数需要在…中才可以。
    9. <RequireAll>
    10. Require all granted
    11. Require not ip 10.252.46.165
    12. </RequireAll>

    用户访问控制

    认证方式有basic和digest两种
    创建用户认证文件,为用户认证做准备

    1. [root@server1 ~]# 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@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan
    6. zhangsan
    7. Adding password for user zhangsan

    修改配置文件,启用用户认证

    1. [root@server1 ~]# 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@server1 ~]# systemctl restart httpd.service

    测试访问,发现lisi可以成功访问,zhangsan不能访问 BRGEXM3ZIR0AWAXCUPAO76E.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. 使用浏览器访问测试即可!

    日志设定

    1. ErrorLog "logs/error_log"
    2. LogLevel warn
    3. <IfModule log_config_module>
    4. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
    5. combined
    6. LogFormat "%h %l %u %t \"%r\" %>s %b" common
    7. <IfModule logio_module>
    8. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I
    9. %O"
    10. combinedio
    11. </IfModule>
    12. CustomLog "logs/access_log" combined
    13. </IfModule>
    14. 参数:
    15. %h Remote hostname
    16. %l Remote logname
    17. %u Remote user
    18. %t Time the request was received, in the format [18/Sep/2011:19:18:28 -0400]
    19. %r First line of request
    20. %s Status
    21. %b Size of response in bytes, excluding HTTP headers
    22. Referer 有利于分析用户是通过哪个网站转发的如通过baidu转发的,也可以监控网站盗链的发生。
    23. User-Agent 记录浏览器的类型。防止爬虫一定程度上,爬虫可以伪造浏览器类型。curl -A "evan"
    24. http://I(伪造名字叫evan的浏览器)

    基于IP地址虚拟主机

    1. [root@node3 data]# cat /etc/httpd/conf.d/site.conf
    2. <Directory "/data/">
    3. Require all granted
    4. </Directory>
    5. <VirtualHost 192.168.0.140:80>
    6. Servername www.site1.com
    7. DocumentRoot "/data/site1/"
    8. </VirtualHost>
    9. <VirtualHost 192.168.0.145:80>
    10. Servername www.site2.com
    11. DocumentRoot "/data/site2/"
    12. </VirtualHost>
    13. [root@node1 ~]# curl 192.168.0.142
    14. <h1>This is site1</h1>
    15. [root@node1 ~]# curl 192.168.0.145
    16. <h1>This is site2</h1>

    基于端口虚拟主机

    1. [root@server1 ~]# cat /etc/httpd/conf.d/site.conf
    2. Listen 8080
    3. Listen 9090
    4. <Directory "/data/">
    5. Require all granted
    6. </Directory>
    7. <VirtualHost *:8080>
    8. DocumentRoot "/data/site3/"
    9. </VirtualHost>
    10. <VirtualHost *:9090>
    11. DocumentRoot "/data/site4/"
    12. </VirtualHost>
    13. [root@server1 ~]# curl 192.168.80.100:8080
    14. <h1>This is site3</h1>
    15. [root@server1 ~]# curl 192.168.80.100:9090
    16. <h1>This is site4</h1>

    基于FQDN虚拟主机

    1. [root@server1 ~]# cat /etc/httpd/conf.d/site.conf
    2. Listen 10101
    3. <Directory "/data/">
    4. Require all granted
    5. </Directory>
    6. <VirtualHost 192.168.80.100:10101>
    7. Servername www.site5.com
    8. DocumentRoot "/data/site5/"
    9. </VirtualHost>
    10. <VirtualHost 192.168.80.100:10101>
    11. Servername www.site6.com
    12. DocumentRoot "/data/site6/"
    13. </VirtualHost>
    14. ~
    15. [root@server1 ~]# cat /etc/hosts
    16. 192.168.0.142 www.site5.com
    17. 192.168.0.142 www.site6.com
    18. [root@server1 ~]# curl www.site5.com:10101
    19. <h1>This is site5</h1>
    20. [root@server1 ~]# curl www.site6.com:10101
    21. <h1>This is site6</h1>

    三种不同方式的虚拟主机验证汇总

    1. [root@server1 ~]# curl 192.168.80.100
    2. <h1>This is site1</h1>
    3. [root@server1 ~]# curl 192.168.80.200
    4. <h1>This is site2</h1>
    5. [root@server1 ~]# curl 192.168.80.100:8080
    6. <h1>This is site3</h1>
    7. [root@server1 ~]# curl 192.168.80.100:9090
    8. <h1>This is site4</h1>
    9. [root@server1 ~]# curl www.site5.com:10101
    10. <h1>This is site5</h1>
    11. [root@server1 ~]# curl www.site6.com:10101
    12. <h1>This is site6</h1>

    SSL配置

    安装mod_ssl和openssl

    1. [root@node1 ~]# yum install mod_ssl openssl -y

    生成2048位的加密私钥server.key

    1. [root@node1 ~]# openssl genrsa -out server.key 2048

    生成证书签名请求server.csr

    1. [root@node1 ~]# openssl req -new -key server.key -out server.csr

    生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年server.crt

    1. [root@node1 ~]# openssl x509 -req -days 3650 -in server.csr -signkey
    2. server.key -out
    3. server.crt

    复制文件到相应位置

    1. [root@node1 ~]# cp server.crt /etc/pki/tls/certs/
    2. [root@node1 ~]# cp server.key /etc/pki/tls/private/
    3. [root@node1 ~]# cp server.csr /etc/pki/tls/private/

    修改配置文件

    1. Servername 192.168.0.140:443
    2. SSLCertificateFile /etc/pki/tls/certs/server.crt
    3. SSLCertificateKeyFile /etc/pki/tls/private/server.key

    防火墙放行

    1. [root@node1 ~]# firewall-cmd --add-port=443/tcp --per
    2. 最后访问测试即可!

    LAMP架构

    LAMP动态网站部署架构是由一套 Linux+Apache+MySQL+PHP 组成的动态网站系统解决方案。
    LNMP动态网站部署架构是由一套 Linux+Nginx+MySQL+PHP 组成的动态网站系统解决方案。

    1. 1.安装相关软件包
    2. [root@node1 ~]# yum install httpd php php-mysql mariadb-server -y
    3. [root@node1 ~]# cat /etc/httpd/conf.d/php.conf | grep -Ev "^#|^$"
    4. <FilesMatch \.php$>
    5. SetHandler application/x-httpd-php # 定义了以.php结尾的文件触发x-httpd-php
    6. AddType text/html .php
    7. DirectoryIndex index.php # 定义默认主页面
    8. php_value session.save_handler "files" # 定义保持handler为文件
    9. php_value session.save_path "/var/lib/php/session" # 定义会话保持路径
    10. <FilesMatch>
    11. 2.启动httpd服务
    12. [root@node1 ~]# systemctl start httpd
    13. [root@node1 ~]# firewall-cmd --add-port=80/tcp --per
    14. 3.编写测试页面
    15. [root@node1 ~]# cat /var/www/html/index.php
    16. <html>
    17. <head>
    18. <title>PHP 测试</title>
    19. </head>
    20. <body>
    21. <?php echo '<p>Hello World</p>'; ?>
    22. </body>
    23. </html>
    24. 打开浏览器访问:http://192.168.0.140/index.php
    25. 4.启动数据库,并编写测试页面
    26. [root@node1 ~]# cat /var/www/html/test.php
    27. <?php
    28. $link=mysql_connect("127.0.0.1","root","");
    29. if(!$link)
    30. echo "FAILD!连接错误,用户名密码不对";
    31. else
    32. echo "OK!可以连接";
    33. ?>
    34. 打开浏览器访问:http://192.168.0.140/test.php