day-37
1、基础端口
873 rsync
22 ssh
25 smtp 邮件发送服务
110 pop3 邮件接收服务
80 web 网页服务
23 telnet
111 rpcbind
21 ftp
3389 windows远程桌面
2、SSH批量管理
2.1ssh服务端软件
yum install openssl openssh -y
rpm -qa openssh openssl
openssh-7.4p1-16.el7.x86_64 #<==ssh服务。
openssl-1.0.2k-16.el7.x86_64 #<==加密用的ssl。
2.2ssh服务配置优化:
####Start by oldboy#2018-04-26###
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
#ListenAddress 172.16.1.7:22
####End by oldboy#2018-04-26###
2.3基础了解
2.3.1认证方式
密码认证
ssh 172.16.1.31 需要输入key和密码pass
秘钥认证
ssh-keygen交互式 连续回车 出来私发和公钥
非交换式ssh-keygen -f ~/.ssh/id_rsa -P '' -q
参数讲解:
ssh-keygen:密钥对创建工具
[-P old_passphrase] 密码
[-f output_keyfile] 输出的秘钥文件
[-q] 不输出信息
[-t dsa ] 指定秘钥类型
ssh-copy-id #专业拷贝密钥中的公钥文件的。
-f: force mode 强制
[-i [identity_file]] 指定秘钥文件
[[-o <ssh -o options>] ...] 指定ssh参数选项。
2.3.2配置文件
/etc/ssh/ssh_config
2.4 sshpass工具:指定密码非人工交互分发秘钥
yum install -y sshpass
非分交互式分发密钥sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.7
2.5批量分发公钥脚本
#!/bin/bash
yum install sshpass -y &&\
#在管理机上输入
ssh-keygen -t rsa -f ~/.ssh/id_rsa -q -P '' &&\
#如果创建过公钥 可以忽略或者 y
for i in 5 6 7 8 31 41 51;do sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub 172.16.1.$i "-o StrictHostKeyChecking=no";done
===================================================================================================================
day-38
1.ansible介绍
ssh秘钥认证+脚本批量管理,特点:简单、实用,
但是看起来比较LOW,需要人工写脚本,类似实时复制的inotify工具。
2013以前这种方式很普遍。
MySQL高可用 MHA集群,要求所有机器互相秘钥认证。
大数据集群也需要。
2.ansible能做什么?
ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nfs服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中我们都可以使用到ansible。
3.ansible软件特点:
ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nfs服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,你都要为新服务器部署某个服务,也就是说你需要经常重复的完成相同的工作。
这些场景中我们都可以使用到ansible。
4.安装ansible
[root@m01 ~]# yum install ansible -y.配置ansible[root@m01 ~]# vim /etc/ansible/hosts[oldboy]172.16.1.31
172.16.1.41
验证ansible
ansible是通过ssh端口探测通信
[root@m01 ~]# ansible oldboy -m ping
172.16.1.7 | SUCCESS =>{"changed": false,"ping":"pong"}172.16.1.31 | SUCCESS =>{"changed": false,"ping":"pong"}172.16.1.41 | SUCCESS =>{"changed": false,"ping":"pong"}
ansible命令参数介绍
Ansible中的临时命令的执行是通过Ad-Hoc来完成,能够快速执行,而且不需要保存执行的命令,例如:ansible -i ~/hosts all -mcommand-a ‘who’ -u root主要参数如下:-u username 指定ssh连接的用户名,即执行后面命令的用户-i inventory_file 指定所使用的inventory文件的位置,默认为/etc/ansible/hosts-m module 指定使用的模块,默认为command-f 10 指定并发数,并发量大的时候,提高该值--sudo [-k] 当需要root权限执行的化,-k参数用来输入root密码
ansible模块查看和帮助
ansible模块查看和帮助*****查找模块ansible-doc -l#模块就Linux命令了。查看某个模块的具体参数帮助ansible-doc -scommand#Linux命令参数12.1command模块 *****1)功能说明:commandExecutes acommandon a remote node 功能说明:执行一个命令在远程节点上操作实践:ansible oldboy -mcommand-a"free -m"ansible oldboy -mcommand-a"df -h"ansible oldboy -mcommand-a"ls /root"ansible oldboy -mcommand-a"cat redhat-release"ansible oldboy -mcommand-a"cat /etc/redhat-release"最通用的功能。[root@m01 ~]# ansible oldboy -m command -a "cat /etc/redhat-release"172.16.1.7 | CHANGED | rc=0 >>CentOS Linux release 7.6.1810 (Core) 172.16.1.31 | CHANGED | rc=0 >>CentOS Linux release 7.6.1810 (Core) 172.16.1.41 | CHANGED | rc=0 >>CentOS Linux release 7.6.1810 (Core)
目标:ansible是不是需要免秘钥认证(ssh免秘钥认证)? yes
[root@m01 ~]# cat /etc/ansible/hosts[oldboy]172.16.1.31172.16.1.7还原ansible.cfg配置,重启服务器[root@m01 ~]# ansible oldboy -m command -a "free -m"The authenticity of host'172.16.1.7 (172.16.1.7)'can't be established.
ECDSA key fingerprint is SHA256:qZSBkrmOv7xO/63qOU1uLXkPyNVHdkqvrNAcAmXqNEk.
ECDSA key fingerprint is MD5:23:d0:cb:a9:f4:7c:0b:eb:2d:07:00:e1:a3:12:d8:33.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '172.16.1.31(172.16.1.31)' can't be established.ECDSA key fingerprint isSHA256:qZSBkrmOv7xO/63qOU1uLXkPyNVHdkqvrNAcAmXqNEk.ECDSA key fingerprint isMD5:23:d0:cb:a9:f4:7c:0b:eb:2d:07:00:e1:a3:12:d8:33.Are you sure you want to continue connecting (yes/no)?
解决yes/no不需要输入问题:
修改ansible.cfg374行:ssh_args = -o ControlMaster=auto-o ControlPersist=60s -o StrictHostKeyChecking=no
在执行报错:
[root@m01 ~]# ansible oldboy -m command -a "free -m"172.16.1.7| UNREACHABLE! => {"changed":false,"msg":"Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.7' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password).","unreachable":true}172.16.1.31| UNREACHABLE! => {"changed":false,"msg":"Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).","unreachable":true}
解决公钥问题:
ssh-keygen -f ~/.ssh/id_rsa -P''-qforipin7dosshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub"-o StrictHostKeyChecking=no"172.16.1.$ipdone#testssh172.16.1.7"ifconfig eth0"
执行ansible命令:
[root@m01 ~]# ansible oldboy -m command -a "free -m"172.16.1.31 | UNREACHABLE! =>{"changed": false,"msg":"Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).","unreachable": true}172.16.1.7 | CHANGED | rc=0 >> total used free shared buff/cache availableMem:97269807795771Swap:7670767foripin31dosshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub"-o StrictHostKeyChecking=no"172.16.1.$ipdone#testssh172.16.1.31"ifconfig eth0"[root@m01 ~]# ansible oldboy -m command -a "free -m"172.16.1.7 | CHANGED | rc=0 >> total used free shared buff/cache availableMem:97269807795771Swap:7670767172.16.1.31 | CHANGED | rc=0 >> total used free shared buff/cache availableMem:97271804796768Swap:7670767
验证:删除公钥,是不是不可以了?
重启后,不行,重启前可以[root@m01 ~]# ansible oldboy -m command -a "free -m"172.16.1.7| UNREACHABLE! => {"changed":false,"msg":"Failed to connect to the host via ssh: Warning: Permanently added '172.16.1.7' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password).","unreachable":true}172.16.1.31| UNREACHABLE! => {"changed":false,"msg":"Failed to connect to the host via ssh: Could not create directory '/root/.ssh'.\r\nWarning: Permanently added '172.16.1.31' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).","unreachable":true}
修改Host增加用户和密码:
[root@m01 ~]# cat /etc/ansible/hosts#[oldboy]#172.16.1.31#172.16.1.7[oldboy_pass]172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456
结果:
[root@m01 ~]# ansible oldboy_pass -m command -a "free -m"
172.16.1.31 | CHANGED | rc=0 >> total used free shared buff/cache availableMem:972797917101758Swap:7670767172.16.1.7 | CHANGED | rc=0 >> total used free shared buff/cache availableMem:97269806795771Swap:7670767
结论:使用SSH连接:
密码认证 host里主机后面加密码
秘钥认证:提前发公钥,才能用ansible. SSHPASS工具
==============================================================================================================
day-39
模块 作用
command 执行命令
shell 执行命令(支持管道符)
yum 安装软件模块
copy 配置模块
service 启动服务模块
user 用户管理
file 创建目录,创建文件,往文件写内容
cron 定时任务
mount 挂载
command命令模块
默认模块, 执行命令[root@m01 ~]# ansible oldboy -a "hostname"如果需要一些管道操作,则使用shell[root@m01 ~]# ansible oldboy -m shell -a "ifconfig|grep eth0" -f 50-f =forks /etc/ansible/ansible.cfg#结果返回的数量
yum安装模块
推送脚本文件至远程,远程执行脚本文件[root@m01 ~]# ansible oldboy -m yum -a "name=httpd state=installed"name ---指定要安装的软件包名称state ---指定使用yum的方法installed,present ---安装软件包removed,absent ---移除软件包latest ---安装最新软件包
copy模块
推送文件模块[root@m01 ~]# ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/test.txt owner=www group=www mode=0600"在推送覆盖远程端文件前,对远端已有文件进行备份,按照时间信息备份[root@m01 ~]# ansible oldboy -m copy -a "src=/etc/hosts dest=/tmp/test.txt backup=yes"直接向远端文件内写入数据信息,并且会覆盖远端文件内原有数据信息[root@m01 ~]# ansible oldboy -m copy -a "content='bgx' dest=/tmp/oldboy"copy模块主要参数src — 推送数据的源文件信息dest — 推送数据的目标路径backup — 对推送传输过去的文件,进行备份content — 直接批量在被管理端文件中添加内容group — 将本地文件推送到远端,指定文件属组信息owner — 将本地文件推送到远端,指定文件属主信息mode — 将本地文件推送到远端,指定文件权限信息force — 分为force=no或yes,如果目标主机包含该文件,但内容不同,设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
service服务模块
[root@m01 ~]# ansible oldboy -m service -a "name=crond state=stopped enabled=yes"主要参数name — 定义要启动服务的名称state — 指定服务状态是停止或是运行started — 启动stopped — 停止restarted — 重启reloaded — 重载enabled — 是否让服务开启自启动1.安装 [root@m01 ~]# ansible web -m yum -a "name=httpd state=installed"2.配置 [root@m01 ~]# ansible web -m copy -a "content='This is Ansible' dest=/var/www/html/index.html" 3.启动 [root@m01 ~]# ansible web -m service -a "name=httpd state=started"script模块编写脚本[root@m01 ~]# mkdir -p /server/scripts[root@m01 ~]# cat /server/scripts/yum.sh#!/usr/bin/bashyum install -y iftop在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行[root@m01 ~]# ansible oldboy -m script -a “/server/scripts/yum.sh”
file配置模块
创建目录[root@m01 ~]# ansible oldboy -m file -a “path=/tmp/oldboy state=diretory”创建文件[root@m01 ~]# ansible oldboy -m file -a “path=/tmp/tt state=touch mode=555 owner=root group=root”[root@m01 ~]# ansible oldboy -m file -a “src=/tmp/tt path=/tmp/tt_link state=link”path — 指定远程主机目录或文件信息recurse — 递归授权state —directory — 在远端创建目录touch — 在远端创建文件link — link或hard表示创建链接文件absent — 表示删除文件或目录mode — 设置文件或目录权限owner — 设置文件或目录属主信息group — 设置文件或目录属组信息
group模块
name — 指定创建的组名gid — 指定组的gidstateabsent — 移除远端主机的组present — 创建远端主机的组(默认)创建组,指定gid[root@m01 ~]# ansible oldboy -m group -a “name=oldgirl gid=888”
user模块
uid — 指定用户的uidgroup — 指定用户组名称groups — 指定附加组名称password — 给用户添加密码shell — 指定用户登录shellcreate_home — 是否创建家目录创建oldgirl,设定uid为888,并加入gid为888[root@m01 ~]# ansible oldboy -m user -a “name=oldgirl uid=888 group=888 shell=/sbin/nologin create_home=no”随机生成加密字符串(-1使用MD5进行加密 -stdin 非交互式 -salt 加密参数)[root@m01 ~]# echo “bgx” | openssl passwd -1 -stdin固定加密字符串[root@m01 ~]# echo “123”| openssl passwd -1 -stdin -salt ‘salt创建普通用户,并配置对应的用户密码[root@m01 ~]# echo “bgx” | openssl passwd -1 -stdin$1$1KmeCnsK$HGnBE86F/XkXufL.n6sEb.[root@m01 ~]# ansible oldboy -m user -a ‘name=xlw password=”$1$765yDGau$diDKPRoCIPMU6KEVEaPTZ0″‘
crond模块
正常使用crond服务[root@m01 ~]# crontab -l* * * * */bin/sh/server/scripts/yum.sh使用ansible添加一条定时任务[root@m01 ~]# ansible oldboy -m cron -a “minute=* hour=* day=* month=* weekday=* job=’/bin/sh /server/scripts/test.sh'”[root@m01 ~]# ansible oldboy -m cron -a “job=’/bin/sh /server/scripts/test.sh'”设置定时任务注释信息,防止重复,name设定[root@m01 ~]# ansible oldboy -m cron -a “name=’cron01′ job=’/bin/sh /server/scripts/test.sh'”删除相应定时任务[root@m01 ~]# ansible oldboy -m cron -a “name=’ansible cron02′ minute=0 hour=0 job=’/bin/sh /server/scripts/test.sh’ state=absent”注释相应定时任务,使定时任务失效[root@m01 scripts]# ansible oldboy -m cron -a “name=’ansible cron01′ minute=0 hour=0 job=’/bin/sh /server/scripts/test.sh’ disabled=yes”
mount模块
present —开机挂载,仅将挂载配置写入/etc/fstabmounted —挂载设备,并将配置写入/etc/fstabunmounted —卸载设备,不会清除/etc/fstab写入的配置absent —卸载设备,会清理/etc/fstab写入的配置仅将挂载的配置写入/etc/fstab,并不会执行挂载操作[root@m01 ~]# ansible oldboy -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"临时挂载设备,并将挂载信息写入/etc/fstab[root@m01 ~]# ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"临时卸载,不会清理/etc/fstab[root@m01 ~]# ansible web -m mount -a “src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted”卸载,不仅临时卸载,同时会清理/etc/fstab[root@m01 ~]# ansible web -m mount -a “src=172.16.1.31:/data path=/data fstype=nfs opt
===============================================================================================================
day-40
什么是playbook?
把所有操作按照ansible编程语法,放在文件里执行就是playbook。
ansible剧本编写格式说明
ansible剧本遵循PYyaml语法规则进行编写,yaml文件基本编写规则如下说明:
规则一:缩进
yaml使用一个固定的缩进风格表示数据层结构关系,需要每个缩进级别由两个空格组成。切记一定不能使用tab键进行缩进。
规则二:冒号
每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格)
规则三:短横线
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分
1.YAML介绍
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy dt Net与Oren Ben-Kiki也是这语言的共同设计者。
YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。其特性:
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
更多的内容及规范参见http://www.yaml.org。
12.8.3 playbook替代方案1
[root@m01 ~]# cat ansible.sh #判断 循环,可以脚本实现。ansible oldboy -m file -a"dest=/tmp/oldboy_file state=touch"ansible oldboy -m file -a"dest=/tmp/oldboy_file state=touch owner=oldboy group=oldboy mode=ugo=rwx"ansible oldboy -m yum -a"name=nginx state=installed"ansible oldboy -m service -a"name=crond state=started enabled=yes"ansible oldboy -m cron -a"name='sync time' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"
playbook替代方案2:通用
[root@m01 ~]# cat ~/set.sh touch /tmp/oldboy_filechown oldboy.oldboy /tmp/oldboy_fileyum install nginx -y/etc/init.d/crond startchkconfig cornd onecho'#sync time oldboy'>>/var/spool/cron/rootecho'00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'>>/var/spool/cron/root执行:ansible oldboy -m script -a"~/set.sh"
12.8.4实践
ansible oldboy -m shell -a "echo oldboy linux. >/tmp/oldboy.log"
把这行命令写成剧本:
准备:
mkdir -p /etc/ansible/yaml
cd /etc/ansible/yaml
vim p1.yml
开始编写:
[root@m01 /etc/ansible/yaml]# cat /etc/ansible/yaml/p1.yml-hosts:oldboytasks:-name:Create a log fileshell:echo oldboy linux. >/tmp/oldboy.log [root@m01 /etc/ansible/yaml]# cat p2.yml -hosts:oldboytasks:-shell:echo oldboy linux. >/tmp/oldboy.log
测试:
[root@m01 /etc/ansible/yaml]# ansible-playbook -C /etc/ansible/yaml/p1.yml 说明:利用ansibl-playbook命令执行剧本,-C参数表示测试剧本任务执行,类似话剧的彩排一样。PLAY [oldboy] ***********************************************************************************************************TASK [Gathering Facts] **************************************************************************************************ok: [172.16.1.41]ok: [172.16.1.31]TASK [Create alogfile] ************************************************************************************************skipping: [172.16.1.41]skipping: [172.16.1.31]PLAY RECAP **************************************************************************************************************172.16.1.31 : ok=1 changed=0 unreachable=0 failed=0 172.16.1.41 : ok=1 changed=0 unreachable=0 failed=0
执行:
[root@m01 /etc/ansible/yaml]# ansible-playbook /etc/ansible/yaml/p1.yml PLAY [oldboy] ***********************************************************************************************************TASK [Gathering Facts] **************************************************************************************************ok: [172.16.1.31]ok: [172.16.1.41]TASK [Create alogfile] ************************************************************************************************changed: [172.16.1.31]changed: [172.16.1.41]PLAY RECAP **************************************************************************************************************172.16.1.31 : ok=2 changed=1 unreachable=0 failed=0 172.16.1.41 : ok=2 changed=1 unreachable=0 failed=0
ansible oldboy -m file -a"dest=/tmp/oldboy1 state=touch"编写剧本:[root@m01 /etc/ansible/yaml]# cat p3.yml -hosts:oldboyremote_user:roottasks:-name:Create New Filefile:name=/tmp/oldboy1 state=touch
定时任务:
ansible oldboy -m cron -a"name='sync time' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"#crond-id-001:time sync by oldboy*/5 * * * * /usr/sbin/ntpdate ntp3.aliyun.com >/dev/null 2>&1编写剧本:[root@m01 /etc/ansible/yaml]# cat p4.yml - hosts: oldboy tasks: - name: Cron time sync cron: name='sync time'minute=*/10 job='/usr/sbin/ntpdate ntp3.aliyun.com >/dev/null 2>&1'练习题:每周一1-5 上午8:30 /server/scripts/class.sh编写剧本:[root@m01 /etc/ansible/yaml]# cat p5.yml - hosts: oldboy tasks: - name: Cron 每周1-5,8:30 老男孩脱产上课 cron: name='oldboy class'minute=30 hour=08 weekday=1-5 job='/bin/sh /server/scripts/class.sh>/dev/null 2>&1'结果:[root@nfs01 ~]# crontab -l|tail -2#Ansible: oldboy class30 08 * * 1-5 /bin/sh /server/scripts/class.sh>/dev/null 2>&1ansible oldboy -m copy -a"src=/etc/rsyncd.conf dest=/etc/rsyncd.conf backup=yes"ansible oldboy -m copy -a"content='rsync_backup:oldboy' dest=/etc/rsync.password backup=yes mode=0600"编写剧本: [root@m01 /etc/ansible/yaml]# cat p6.yml - hosts: backup tasks: - name: copy rsyncd.conf copy: src=/data/rsyncd.conf.template dest=/etc/rsyncd.conf mode=0600 backup=yes - name: create rsync.password copy: content='rsync_backup:oldboy'dest=/etc/rsync.password mode=0600
=====================================================================================================================================
day-41
DNS解析流程
解析顺序
1) 浏览器缓存
当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在);
2) 系统缓存
当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP;
3) 路由器缓存
当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存;
4) ISP(互联网服务提供商)DNS缓存
当在用户客服端查找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找;
5) 根域名服务器
当以上均未完成,则进入根服务器进行查询。全球仅有13台根域名服务器,1个主根域名服务器,其余12为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器;
6) 顶级域名服务器
顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器;
7) 主域名服务器
主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录;
8)保存结果至缓存
本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接。
http(超文本传输协议)
1.由html文件->包含各种各样的元素(URL链接)->web页面
2.URL结构
http://www.qq.com:80/news/index.html
协议 —- 域名:—- 端口– 具体的文件名下面的某个页面
3.http的工作原理
1.发起dns请求
2.获取到域名对应的IP地址
3.浏览器发起tcp的连接
4.基于tcp的连接,传输http的请求(一次tcp的连接,可以建立多次的http请求)
5.浏览器请求/index.html
6.服务器响应/index.html至浏览器
7.浏览器翻译index.html中的内容为人类可读
8.断开TCP的四次挥手
http的短连接:建立一次tcp的连接,发起一次http的请求,结束,tcp断开。
http的长连接:建立一次tcp的连接,发起多次http的请求,结束,tcp端口。
4.http的请求方法
get 请求(获取)一个网站的页面
post 上传什么内容至服务器
5.http的响应状态码(以3位数字组成)
200 成功
301 永久重定向(redirect)
302 临时重定向(redirect)
304 浏览器缓存
403 请求不到首页,权限被拒绝
404 资源找不到
500 服务器内部错误,程序代码错误
502 找不到后端的资源
504 请求超时
6.用户访问网站携带的参数,以及服务端返回的参数
1.概况
RequestURL:http://10.0.0.7/index.html# 请求的URL地址RequestMethod:GET# 请求的方法(获取)StatusCode:304Not Modified# 返回的状态RemoteAddress:10.0.0.7:80# 请求的地址
2.客户端请求的头部信息
Accept: text/html,# 请求的类型Accept-Encoding: gzip, deflate# 是否进行压缩Accept-Language: zh-CN,zh;q=0.9# 请求的语言Cache-Control: max-age=0# 缓存Connection: keep-alive# TCP长连接Host: www.oldboyedu.com# 请求的域名If-Modified-Since: Fri,04May201808:13:44GMT# 修改的时间If-None-Match:"a49-56b5ce607fe00"# 标记Upgrade-Insecure-Requests:1# 在http和https之间起的一个过渡作用User-Agent: Mozilla/5.0# 用户的浏览器===========请求一个空行=========================
3.服务端响应的头部信息
HTTP/1.1 304 Not Modified# 返回服务器的http协议,状态码Date: Fri, 14 Sep 2018 09:14:28 GMT# 返回服务器的时间Server: Apache/2.4.6 (CentOS) PHP/5.4.16# 返回服务器使用的软件(Apache php)Connection: Keep-Alive# TCP长连接Keep-Alive: timeout=5, max=100# 长连接的超时时间ETag:"a49-56b5ce607fe00"# 验证客户端标记===========返回一个空行====================================返回内容页面=========================
HTTP媒体类型
image.png