目录
- 1. 基本概念
- 1.1 Nginx初步认识
- 1.2 正向/反向代理
- 1.3 域名和IP
- 2. Nginx安装和配置
- 2.1 安装Nginx
- 2.2 配置
- 3. Nginx的使用
- 3.1 部署静态网页
- 3.2 反向代理和负载均衡
- 1. 反向代理设置
- 2. 负载均衡设置
- 4.补充知识
- 1. URL和URI
- 2. DNS解析过程
- 5.复习
- 1.Nginx web服务器 处理静态请求
- 2.Nginx 反向代理
- 6.Nginx作为web服务器处理请求
- 1. 静态请求
- 2. 动态请求
- 7.HTTP协议复习
1. 基本概念
1.1 Nginx初步认识
什么是Nginx
Nginx是一款轻量级的Web 服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。
由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx优势
- 更快
正常情况下单次请求得到更快的响应,高峰期(数以万计的并发时)Nginx可
以比其它web服务器更快的响应请求。 - 高扩展性
低耦合设计的模块组成,丰富的第三方模块支持。 - 高可靠性
经过大批网站检验,每个worker进程相对独立,master进程在一个worker 进程出错时,可以快速开启新的worker进程提供服务。 - 低内存消耗
一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗 2.5M内存,这是Nginx支持高并发的基础。 - 单机支持10万以上的并发连接
取决于内存,10万远未封顶。 - 热部署
master和worker的分离设计,可实现7x24小时不间断服务的前提下,升级Nginx可执行文件,当然也支持更新配置项和日志文件。 - 最自由的BSD许可协议
BSD许可协议允许用户免费使用Nginx、修改Nginx源码,然后再发布。这吸引了无数的开发者继续为 Nginx贡献智慧。
1.2 正向/反向代理
- 正向代理
正向代理是位于客户端和原始服务器之间的服务器;为了能够从原始服务器获取请求的内容,客户端需要将请求发送给代理服务器,然后再由代理服务器将请求转发给原始服务器,原始服务器接受到代理服务器的请求并处理,然后将处理好的数据转发给代理服务器,之后再由代理服务器转发发给客户端,完成整个请求过程。
正向代理的典型用途就是为在防火墙内的局域网客户端提供访问Internet的途径, 比如:
- 学校的局域网
- 单位局域网访问外部资源
有一台服务器, 它帮助客户端,连接到客户端访问不到的网络服务器, 这台服务器提供的这个服务就是一个正向代理;
正向代理是为客户端服务的, 而不是为服务器服务.
- 反向代理
反向代理方式是指代理原始服务器来接受来自Internet的链接请求,然后将请求转发给内部网络上的原 始服务器,并将从原始服务器上得到的结果转发给Internet上请求数据的客户端。那么顾名思义,反向 代理就是位于Internet和原始服务器之间的服务器,对于客户端来说就表现为一台服务器,客户端所发 送的请求都是直接发送给反向代理服务器,然后由反向代理服务器统一调配。
反向代理服务器是为后台服务器服务的, 实现资源的平均分配 -> 负载均衡
- 接收客户端的请求(反向代理服务器不处理请求),将客户端请求转发给后台web服务器
- web服务器收到请求之后, 对请求做处理, 得到结果, 发送给反向代理服务器
- 反向代理服务器将处理结果发送给客户端
1.3 域名和IP
- 什么是域名?
- www.baidu.com
- 什么是IP地址?
- 点分十进制字符串
- 192.168.1.10
- 22.11.44.66 3.
- 域名和IP地址的关系?
- 域名绑定IP地址, IP地址被域名绑定
- 一个域名绑定几个IP地址: 1个
- 一个IP地址可以被多少个域名绑定?: 多个
2. Nginx安装和配置
2.1 安装Nginx
- 下载
- Nginx官方地址: http://nginx.org/
- Nginx相关依赖: 先安装这些依赖
- 1、OpenSSL:加密 https
- 2、ZLib:压缩数据
- 3、PCRE:解析正则表达式
- 1、OpenSSL:加密、https
# 下载
http://www.openssl.org/
https://www.openssl.org/source/old/1.1.1/
# 安装
tar -zxvf openssl-1.1.1f.tar.gz
cd openssl-1.1.1f/
./config
make
make install
# 查看openssl版本
openssl version -a
### 遇到动态库找不到的问题:解决如下
find / -name
vim /etc/ld.so.conf
ldconfig
# 再次查看版本:成功
openssl version -a
openssl version
OpenSSL 1.1.1f 31 Mar 2020
# 清理数据:删除压缩包和解压后的文件夹
cd ..
rm -rf openssl-1.1.1f openssl-1.1.1f.tar.gz
- 2、ZLib:压缩数据
# 下载
http://www.zlib.net/
#安装
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure
make
make install
#查版本号
find / -name zlib.pc
/usr/lib64/pkgconfig/zlib.pc
/usr/local/lib/pkgconfig/zlib.pc
cat /usr/local/lib/pkgconfig/zlib.pc # 这个是正确的版本号
- 3、PCRE:解析正则表达式
# 下载:
http://www.pcre.org/
# 安装
tar -jxvf pcre-8.40.tar.bz2
cd pcre-8.40/
ls
./configure
make
make install
#查看pcre版本
[root@lwh Nginx]# pcre-config --version
8.40
- nginx的安装
# 正规安装, 需要添加以上三个库的依赖
# 需要将openssl , zlib, pcre依次安装
# 检测安装环境,并在当前环境下生成一个Makefile
# 源码路径: 绝对/相对都可以
# ./configure --with-openssl=openssl源码目录 --with-pcre=pcre的源码目录 --with-zlib=zlib 的源码目录
./configure --with-openssl=/home/lwh/Desktop/packages/Nginx/openssl-1.1.1f --with-pcre=/home/lwh/Desktop/packages/Nginx/pcre-8.40 --with-zlib=/home/lwh/Desktop/packages/Nginx/zlib-1.2.11
# 有以下这些输出,说明都找到了,安装环境没问题
Configuration summary
+ using PCRE library: /home/lwh/Desktop/packages/Nginx/pcre-8.40
+ using OpenSSL library: /home/lwh/Desktop/packages/Nginx/openssl-1.1.1f
+ md5: using system crypto library
+ sha1: using system crypto library
+ using zlib library: /home/lwh/Desktop/packages/Nginx/zlib-1.2.11
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
# 安装
make
make install
# 查看nginx版本号
-v 显示 nginx 的版本。
-V 显示 nginx 的版本,编译器版本和配置参数。
[root@lwh sbin]# cd /usr/local/nginx/sbin
[root@lwh sbin]# ls
nginx
[root@lwh sbin]# ./nginx -v
nginx version: nginx/1.10.3
[root@lwh sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments: --with-openssl=/home/lwh/Desktop/packages/Nginx/openssl-1.1.1f --with-pcre=/home/lwh/Desktop/packages/Nginx/pcre-8.40 --with-zlib=/home/lwh/Desktop/packages/Nginx/zlib-1.2.11
[root@lwh sbin]#
- Nginx相关目录
Nginx的默认安装目录
/usr/local/nginx
[root@lwh testcpp]# whereis nginx
nginx: /usr/bin/nginx /usr/local/nginx
[root@lwh testcpp]# ll /usr/bin/nginx
lrwxrwxrwx. 1 root root 27 Jun 22 14:07 /usr/bin/nginx -> /usr/local/nginx/sbin/nginx
[root@lwh testcpp]# ll /usr/local/nginx/
total 4
drwx------. 2 nobody root 6 Jun 22 14:02 client_body_temp
drwxr-xr-x. 2 root root 4096 Jun 22 21:39 conf # 配置文件目录
drwx------. 2 nobody root 6 Jun 22 14:02 fastcgi_temp
drwxr-xr-x. 2 root root 40 Jun 22 11:17 html # 默认资源目录
drwxr-xr-x. 2 root root 41 Jun 22 23:43 logs # 日志目录
drwx------. 2 nobody root 6 Jun 22 14:02 proxy_temp
drwxr-xr-x. 2 root root 19 Jun 22 11:17 sbin # 可执行程序目录
drwx------. 2 nobody root 6 Jun 22 14:02 scgi_temp
drwx------. 2 nobody root 6 Jun 22 14:02 uwsgi_temp
drwxr-xr-x. 6 root root 173 Jun 22 21:33 yundisk # 自己配置的资源目录
# conf: 放配置文件的目录
# html: web服务器存放资源文件的目录
# - 网页
# - 图片
# logs: nginx写log日志的目录
# sbin: 里边是启动nginx的可执行程序
Nginx可执行程序的路径
[root@lwh sbin]# cd /usr/local/nginx/sbin/
[root@lwh sbin]# ls
nginx
# 如果linux用户是普通用户, 启动该程序需要添加管理员权限
#启动 nginx后,有
# 一个 nginx:master process
# 多个 nginx:worker process (个数,与虚拟机设置的核数有关)
[root@lwh sbin]# ./nginx
[root@lwh sbin]# ps aux|grep nginx
root 43012 0.0 0.0 22728 764 ? Ss 14:02 0:00 nginx: master process ./nginx
nobody 43013 0.0 0.1 25232 1548 ? S 14:02 0:00 nginx: worker process
root 43032 0.0 0.0 110280 892 pts/0 S+ 14:02 0:00 grep --color=auto nginx
- 启动Nginx
nginx # 启动
# 启动:法一
# 首先进入 目录: /usr/local/nginx/sbin/
# 然后: (sudo) ./nginx
# 启动:法二
# 直接启动nginx(在任何目录下)(需要设置环境变量或者创建软连接:设置方式如下)
# 这个nginx命令无法在任何目录下都能解析出来, 解决方案:
# 法一:在PATH环境变量中添加路径:
/usr/local/nginx/sbin
# 法二:创建快捷方式(软连接):
[root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
- 关闭Nginx
nginx -s stop # 立即停止
nginx -s quit # 执行完毕后再退出
/usr/local/nginx/sbin/nginx -s stop # 立即关闭
/usr/local/nginx/sbin/nginx -s quit # 先将nginx执行的动作, 执行完毕, 然后再退出
- 重新加载Nginx
nginx -s reload # 重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload # 重写读nginx的配置文件# 可以进行热部署
- 测试是否安装成功
nginx -t # 测试nginx的配置文件的语法是否正确、环境、网络...等,通过了肯定能启动
# 1、确定nginx对应的主机的iP地址
# 2、打开一个浏览器访问这个地址, 得到一个欢迎界面
2.2 配置
- Nginx配置文件的位置
/usr/local/nginx/conf/nginx.conf
配置层次 | 描述 |
main | Nginx在运行时与具体业务功能无关的参数,比如工作进程数、运行身份等 |
http | 与提供http服务相关的参数,比如keepalive、gzip等 |
server | http服务上支持若干虚拟机,每个虚拟机一个对应的server配置项,配置项里包含该虚拟机相关的配置 |
location | http服务中,某些特定的URL对应的一系列配置项 |
mail | 实现email相关的SMTP/IMAP/POP3代理时,共享的一些配置项 |
- main - 代表整个文件 nginx.conf
- http - web模块
- server模块
- 每个server模块对应一台web服务器
- web服务器需要处理多个客户端请求, 每个请求对应一个location
- mail - 邮件模块
Nginx工作流程 配置文件的生效阶段:
重点关注server配置项和location配置项
通过不同的配置可以将nginx作为不同的角色使用。
- 常用配置项介绍
user nobody;
#工作的进程属于哪个用户, 默认属于nobody用户
#nobody作为一个普通用户,操作一些文件的时候就没有权限, 导致操作失败,
#在logs目录中的日志文件中 有错误提示: nginx操作xxx文件时候失败, 原因: Permission denied #解决方法:把工作进程的所有者改为root用户
user root;
worker_processes 1;
#工作进程的个数, 最大个数 == cpu的核心数
error_log logs/error.log;
#nginx运行出错, 会在logs目录的error.log中记录错误信息
#notice和info是日志级别
pid logs/nginx.pid;
#nginx的进程ID,存储在哪个目录下和存储的文件名字
# nginx的事件处理
events
{
use epoll;
# 处理事件的时候使用的多路IO转接函数是epoll
worker_connections 1024;
# 一个工作的进程同时接受的最大连接数是1024
}
http
{
# ...
server
{
listen 80;
# web服务器默认监听的端口, 客户端需要将请求数据发送到该端口
# 可以更改,更改后使用时需要显示指定
server_name localhost;
# 客户端访问web服务器的地址, localhost必须是域名,
# 如果是域名是localhost, 客户端通过服务器的实际IP地址访问web服务器
# 举例:server_name www.baidu.com;
charset utf-8; # 字符编码
# 每个location都对应一个客户端的请求,
# location后边的字符串就是客户端请求的指令
location /
{
root html;
# 服务器存储资源的资源根目录
index index.html index.htm;
# 如果浏览器访问服务器请求的是一个目录,有时候会返回一个静态网页, \
# 需要使用index指定返回的默认网页index.html, 如果index.html \
# 没找到, 会找index.htm, 如果找到了index.html就跟index.htm没关系了
} # 请求的是目录,index要加上
# 请求的是一个网页,index注释掉就行,用不上
}
}
3. Nginx的使用
3.1 部署静态网页
- 1.静态网页存储目录
默认的存储目录:
/usr/local/nginx/html
自己创建新的资源目录
# 在 /usr/local/nginx 下创建新目录
# 新目录和html默认目录是平级的
练习
在Nginx服务器上进行网页部署, 实现如下访问:
在/usr/local/nginx/创建新的目录, yundisk用来存储静态网页
mkdir /usr/local/nginx/yundisk
- 1.访问地址: http://192.168.184.133/login.html (此处192.168.184.133是你的本地虚拟机IP)
- login.html放到什么位置? :
- 放到yundisk资源目录中
需要在在服务器端添加location
http -> server中添加location
location (指令)
{
}
# 步骤如下
如何得到处理指令: http://192.168.184.133/login.html
- 协议去掉: http
- 剩余:192.168.184.133/login.html
- 去掉域名/服务器的IP地址: 192.168.184.133/www.baidu.com - 剩余:/login.html
#############实例如下################
location /login.html # / 对应的就是root
{
root yundisk; # 此时 root 等于 /usr/local/nginx/yundisk/
# yundisk是相对路径;
# yundisk存在于本机绝对路径:/usr/local/nginx/之下
# 相当于 /usr/local/nginx/yundisk/
# index xxx.html;
# login.html 是一个网页,所以 index就被注释掉了
# 如果login.html 是一个目录,index就得加上
}
#在一个项目中服务器的资源目录中html网页会很多, 如果访问的是网页
#岂不是,每多一个网页就要多写一个location
#解决方法:为了避免重复劳动,
# 将xx.html去掉
# 剩下的指令是 /
# 会自动去模糊匹配
# 这是一个模糊匹配, 只要是资源目录yundisk下的网页,
# 通过该指令都可以匹配并解析出来
# 这样一个location就可以匹配/usr/local/nginx/yundisk/下的很多个网页
location /
{
root yundisk;
}
# 修改完配置文件后,想让其生效
# 如果当前nginx已经启动, 需要重新加载配置文件
ngixn -s reload
- 2.访问地址: http://192.168.184.133/hello/reg.html
- hello是什么?
- 目录
- reg.html放到哪儿?
- hello目录中
- 如何添加location
#指令:
#去掉协议
- 192.168.184.133/hello/reg.html
#去掉IP地址
- /hello/reg.html
#去掉xxx.html
- /hello/
location /hello/
{
root yundisk;
}
[root@lwh yundisk]# mkdir hello
[root@lwh yundisk]# cp reg.html static/ hello/ -r
[root@lwh yundisk]# vim ../conf/nginx.conf
[root@lwh yundisk]# nginx -s reload
http://192.168.184.133/hello/reg.html
- 3.访问地址: http://192.168.184.133/upload/ 浏览器显示upload.html
- 直接访问一个目录, 得到一默认网页
- upload是资源目录的子目录
- upload.html 放到哪儿?
- 放到upload目录中
- 在服务器端添加location
#去掉协议、IP地址、XXX.html
# 剩余 /upload/
location /upload/
{
root yundisk;
index upload.html;
}
[root@lwh yundisk]# mkdir upload
[root@lwh yundisk]# cp upload.html static/ zyupload/ upload/ -r
[root@lwh yundisk]# vim ../conf/nginx.conf
[root@lwh yundisk]# nginx -s reload
http://192.168.184.133/upload/
3.2 反向代理和负载均衡
- 反向代理和负载均衡是两码事儿
- 负载均衡包括了反向代理
- 实现负载均衡时,要先配置好反向代理,然后再实现负载均衡
- 准备工作:
- 反向代理服务器: windows端的Nginx
- 需要修改反向代理服务器的配置文件 - nginx.conf
- 最少两台web服务器:Linux虚拟机上的Nginx
- Linux虚拟机:centos7_lwh- 192.168.247.147
- Linux虚拟机::centos7_bu2- 192.168.247.135
- 客户端 - windows上的浏览器
- 如果反向代理功能成功实现:
- 通过客户端访问反向代理服务器:客户端发送请求
- 处理客户端请求的服务器是
- centos7_lwh
- centos7_bu2
1. 反向代理设置
- 1.首先配置:反向代理服务器(windows端的Nginx)
#nginx-1.12.0-windows.zip 解压就可以直接使用了(相当于绿色安装)
#目录结构和linux下基本一致
#shift+鼠标右键-》Powershell
.\nginx.exe #启动windows端的nginx
#修改windows下nginx的配置文件 nginx.conf
#windows端的nginx,要代理两台web服务器;
#在反向代理服务器(windows端的nginx)的配置文件中添加两个server模块
# SwitchHosts.exe 管理员权限启动可以修改本地的host文件(域名和ip的映射关系)
127.0.0.1 centos7_lwh.com
127.0.0.1 centos7_bu2.com
#反向代理设置好之后, 并不能实现负载均衡(需要进一步设置)
#反向代理设置步骤如下:
###################### 第一台web服务器centos ############################
###客户端在地址栏输入centos7_lwh.com,就可以访问到第一台web服务器centos7_lwh###
server
{
######1、客户端访问反向代理服务器的入口(设置:反向代理服务器的ip和port)#########
listen 80; # 反向代理服务器监听的端口
server_name centos7_lwh.com;# 客户端访问:反向代理服务器的地址
#####2、反向代理服务器不处理请求,而是转发请求,所以要设置代理地址(设置:转发地址)#######
# 设置请求的转发, 设置代理地址
location / # 此处location后的指令是 /
{
# 代理地址 centos7_lwh.test(通过它找到后面的:反向代理模块)
# http://前缀必须有, centos7_lwh.test名字自己编的
proxy_pass http://centos7_lwh.test;
}
}
# 添加:反向代理模块
######## 3、通过设置的名字centos7_lwh.test,找到对应的upstream模块#######
upstream centos7_lwh.test
{
# 添加代理的web服务器
server 192.168.247.147;
#######4、反向代理服务器,将location后的指令转发给web服务器######
#######web服务器端,有对应的location对这个转发过去的指令进行处理#####
#######即:192.168.247.147专门有个location处理 / #########
}
######################第2台web服务器centos7_bu2######################
###客户端在地址栏输入centos7_bu2.com,就可以访问到第一台web服务器centos7_bu2###
server
{
listen 80;
server_name centos7_bu2.com;
# 设置代理地址
location /
{
proxy_pass http://centos7_bu2.test;
}
}
upstream centos7_bu2.test
{
server 192.168.247.135;
}
反向代理示意图
2. 负载均衡设置
# 配置负载均衡(已经实现了反向代理)
server
{
listen 80; # 反向代理服务器监听的端口
server_name localhost; # 客户端访问访问反向代理服务器的地址
# 设置请求的转发, 设置代理地址
location /hello/
{
# http://前必须有, centos.test名字自己编一个
proxy_pass http://centos.test;
}
}
# 添加一反向代理模块
upstream centos.test
{
# 添加代理的web服务器
server 192.168.247.147 weight=5; # 5/6 # 权重的设置:没有最大值
server 192.168.247.135 weight=1; # 1/6 # 权重的设置:没有最大值
}
# 192.168.247.147
location /hello/
{
root xxx;
index xx.html;
}
# 192.168.247.135
location /hello/
{
root xxx;
index xx.html;
}
4.补充知识
1. URL和URI
不错的博文:
- 概念
- URL(Uniform Resource Locator): 统一资源定位符
- 表示资源位置的字符串 基本格式: “协议://IP地址/路径和文件名”
- ftp://ftp.is.co.za/rfc/rfc1808.txt
- http://www.ietf.org/rfc/rfc2396.txt
- telnet://192.0.2.16:80/
- URN(Uniform Resource Name): 统一资源名称
- P2P下载中使用的磁力链接
- URI(Uniform Resource Identifier): 统一资源标识符
- 是一个紧凑的字符串用来标示抽象或物理资源, URL是URI的一种
- 让URI能成为URL的当然就是那个“访问机制”,“网络位置”。e.g. http:// or ftp://
• ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
• http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
• ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
• mailto:John.Doe@example.com (also a URL because of the protocol)
• news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
• tel:+1-816-555-1212
• telnet://192.0.2.16:80/ (also a URL because of the protocol)
• urn:oasis:names:specification:docbook:dtd:xml:4.1.2
- 这些全都是URI, 其中有些事URL. 哪些? 就是那些提供了访问机制的.
- 总结
- “URI可以分为URL,URN或同时具备locators 和names特性的一个东西。
- URN作用就好像一个人的名字,
- URL就像一个人的地址。
- 换句话说:URN确定了东西的身份,URL提供了找到它的方式。”
- 经验式理解:
• http://localhost:8080 /myweb/hello.html
URLhttp://localhost:8080 + /myweb/hello.html
| URI | /myweb/hello.html |
2. DNS解析过程
- 1.DNS解析的过程
- 1.在浏览器中输入www.magedu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网 址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 2.如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果 有,直接返回,完成域名解析。
- Windows和Linux系统都会在本地缓存dns解析的记录,提高速度。
- 3.如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找 TCP/IP 参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 4.如果要查询的域名,不由本地DNS服务器区域解析,但该DNS服务器已缓存了此网址映射关系, 则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 5.如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(没有设置 转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到 请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责 .com域的这台服务器。这台负责 .com域的服务器收到 请求后,如果自己无法解析,它就会找一个管理 .com域的下一级DNS服务器地址(magedu.com) 给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找magedu.com域服务器,重复上面的动作进行查询,直至找到www.magedu.com主机。
- 6.如果用的是转发模式(设置转发器),此DNS服务器就会把请求转发至上一级ISP DNS服务器,由 上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循 环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器, 由此DNS服务器再返回给客户机。
- 2.域名解析服务器
- Pod DNS+:
- 首选:119.29.29.29
- 备选:182.254.116.116
- 114DNS:
- 首选:114.114.114.114
- 备选:114.114.114.115
- 阿里 AliDNS:
- 首选:223.5.5.5
- 备选:223.6.6.6
- 3.hosts文件
# 存储的是域名和IP的对应关系 -windows目录: "C:\Windows\System32\drivers\etc"
5.复习
1.Nginx web服务器 处理静态请求
# 部署静态网页
1. 找到nginx的资源目录
/usr/local/nginx/html - 默认
/usr/local/nginx/xxx - 自己创建xxx (和 /html 同级)
2. 静态资源放入资源目录(网页, 图片...)
3. 需要根据客户端的请求的url在服务器端添加的对应的location处理
location 指令
指令的获取:去掉协议, 去掉IP/域名, 去掉尾部请求的文件名(xxx.html, xx.jpg, xx.png) location /
{
root xx; # 服务器存储资源的资源目录
index xx.html; # 如果客户端访问的是服务器目录, 需要显示一个默认网页,
#index指定 的就是那个默认网页
}
4. 如果nginx已经启动, 需要重写加载
sudo nginx -s reload
2.Nginx 反向代理
# 反向代理服务器代理web服务器 - nginx.conf
http -> server
server
{
listen 80; # 反向代理服务器监听的端口
server_name 域名(www.hello.com); # 客户端访问反向代理服务器的地址
# 客户端的请求 # url: http://www.hello.com/hello/uplaod/(xx.html)
location /hello/upload/
{
# 反向代理服务器不处理请求, 转发
# 通过设置的查找同名的upstream模块
proxy_pass http://;
}
}
# 添加反向代理模块
# 反向代理服务器将 /hello/upload/指令 转发给web服务器
upstream
{
# 要代理的web服务器的地址信息
server 192.168.1.100:8080 weight=2;
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080 weight=4;
}
# web服务器添加指令的处理
# 192.168.1.100
location /hello/upload/
{
root xx;
index xx.html;
}
# 192.168.1.101
location /hello/upload/
{
root xx;
index xx.html;
}
# 192.168.1.102
location /hello/upload/
{
root xx;
index xx.html;
}
6.Nginx作为web服务器处理请求
1. 静态请求
客户端访问服务器的静态网页, 不涉及任何数据的处理, 如下面的URL:
http:://localhsot/login.html
2. 动态请求
客户端会将数据提交给服务器
# 使用get方式提交数据得到的url
http://localhost/login?user=zhang3&passwd=123456
http 协议
localhost 域名
/login
? 连接符, 后边的数据代表提交的指令携带的参数
user=zhang3&passwd=123456
user=zhang3 用户信息的用户名
& 分隔符, 分隔提交的多个数据块
passwd=123456 用户密码
7.HTTP协议复习
1.请求消息(Request) - 客户端(浏览器)发送给服务器的数据格式
- 四部分: 请求行, 请求头, 空行, 请求数据
- 请求行: 说明请求类型, 要访问的资源, 以及使用的http版本
- 请求头: 说明服务器要使用的附加信息
- 空行: 空行是必须要有的, 即使没有请求数据
- 请求数据: 也叫主体, 可以添加任意的其他数据
POST方式提交数据
POST /commit HTTP/1.1
Host: 192.168.87.47:6789
Connection: keep-alive Content-Length: 86
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-CN;q=0.9,en;q=0.8
username=tom&phone=123&email=hello%40qq.com&date=2018-01-01&sex=female&class=3&rule=on
GET方式提交数据
请求体是空的, 数据在请求行的第二部分
GET /commit?username=tom&phone=123&email=hello%40qq.com&date=2018-0101&sex=female&class=3&rule=on HTTP/1.1
Host: 192.168.87.47:6789
Connection: keep-alive Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip,l deflate
Accept-Language: zh,zh-CN;q=0.9,en;q=0.8
2.响应消息(Response) -> 服务器给客户端发送的数据
- 四部分: 状态行, 消息报头, 空行, 响应正文
- 状态行: 包括http协议版本号, 状态码, 状态信息
- 消息报头: 说明客户端要使用的一些附加信息
- 空行: 空行是必须要有的
- 响应正文: 服务器返回给客户端的文本信息
HTTP/1.1 200 Ok
Server: micro_httpd
Date: Fri, 18 Jul 2014 14:34:26 GMT
/* 告诉浏览器发送的数据是什么类型 */
Content-Type: text/plain; charset=iso-8859-1 (必选项)
/* 发送的数据的长度 */
Content-Length: 32
Location:url
Content-Language: zh-CN
Last-Modified: Fri, 18 Jul 2014 08:36:36 GMT
Connection: close
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
3.http状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
- 1xx:指示信息–表示请求已接收,继续处理
- 2xx:成功–表示请求已被成功接收、理解、接受
- 3xx:重定向–要完成请求必须进行更进一步的操作
- 4xx:客户端错误–请求有语法错误或请求无法实现
- 5xx:服务器端错误–服务器未能实现合法的请求
67.0.3396.99 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Accept-Encoding: gzip,l deflate
Accept-Language: zh,zh-CN;q=0.9,en;q=0.8
2.响应消息(Response) -> 服务器给客户端发送的数据
> - 四部分: 状态行, 消息报头, 空行, 响应正文
> - 状态行: 包括http协议版本号, 状态码, 状态信息
> - 消息报头: 说明客户端要使用的一些附加信息
> - 空行: 空行是必须要有的
> - 响应正文: 服务器返回给客户端的文本信息
```http
HTTP/1.1 200 Ok
Server: micro_httpd
Date: Fri, 18 Jul 2014 14:34:26 GMT
/* 告诉浏览器发送的数据是什么类型 */
Content-Type: text/plain; charset=iso-8859-1 (必选项)
/* 发送的数据的长度 */
Content-Length: 32
Location:url
Content-Language: zh-CN
Last-Modified: Fri, 18 Jul 2014 08:36:36 GMT
Connection: close
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
3.http状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
- 1xx:指示信息–表示请求已接收,继续处理
- 2xx:成功–表示请求已被成功接收、理解、接受
- 3xx:重定向–要完成请求必须进行更进一步的操作
- 4xx:客户端错误–请求有语法错误或请求无法实现
- 5xx:服务器端错误–服务器未能实现合法的请求