Nginx 概述 如何正规安装 静态网页配置 反向代理配置 负载均衡配置

1. 基本概念

1.1 Nginx初步认识

什么是Nginx

Nginx是一款轻量级的Web 服务器、反向代理服务器、电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。

由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。

其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx优势

  1. 更快
    正常情况下单次请求得到更快的响应,高峰期(数以万计的并发时)Nginx可
    以比其它web服务器更快的响应请求。

  2. 高扩展性
    低耦合设计的模块组成,丰富的第三方模块支持。

  3. 高可靠性
    经过大批网站检验,每个worker进程相对独立,master进程在一个worker 进程出错时,可以快速开启新的worker进程提供服务。

  4. 低内存消耗
    一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗 2.5M内存,这是Nginx支持高并发的基础。

  5. 单机支持10万以上的并发连接
    取决于内存,10万远未封顶。

  6. 热部署
    master和worker的分离设计,可实现7x24小时不间断服务的前提下,升级Nginx可执行文件,当然也支持更新配置项和日志文件。

  7. 最自由的BSD许可协议
    BSD许可协议允许用户免费使用Nginx、修改Nginx源码,然后再发布。这吸引了无数的开发者继续为 Nginx贡献智慧。

1.2 正向/反向代理

  • 正向代理

正向代理是位于客户端和原始服务器之间的服务器;为了能够从原始服务器获取请求的内容,客户端需要将请求发送给代理服务器,然后再由代理服务器将请求转发给原始服务器,原始服务器接受到代理服务器的请求并处理,然后将处理好的数据转发给代理服务器,之后再由代理服务器转发发给客户端,完成整个请求过程。

正向代理的典型用途就是为在防火墙内的局域网客户端提供访问Internet的途径, 比如:

  • 学校的局域网

  • 单位局域网访问外部资源

有一台服务器, 它帮助客户端,连接到客户端访问不到的网络服务器, 这台服务器提供的这个服务就是一个正向代理;

正向代理是为客户端服务的, 而不是为服务器服务.

在这里插入图片描述

  • 反向代理

反向代理方式是指代理原始服务器来接受来自Internet的链接请求,然后将请求转发给内部网络上的原 始服务器,并将从原始服务器上得到的结果转发给Internet上请求数据的客户端。那么顾名思义,反向 代理就是位于Internet和原始服务器之间的服务器,对于客户端来说就表现为一台服务器,客户端所发 送的请求都是直接发送给反向代理服务器,然后由反向代理服务器统一调配。

反向代理服务器是为后台服务器服务的, 实现资源的平均分配 -> 负载均衡

    1. 接收客户端的请求(反向代理服务器不处理请求),将客户端请求转发给后台web服务器
    1. web服务器收到请求之后, 对请求做处理, 得到结果, 发送给反向代理服务器
    1. 反向代理服务器将处理结果发送给客户端

在这里插入图片描述

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  libssl.so
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

在这里插入图片描述

不错的博文:https://www.cnblogs.com/chengdabelief/p/6635045.html

  • 概念

    • 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:[email protected] (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

  • URL http://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/    
    {
    
            
        # 反向代理服务器不处理请求, 转发        
        # 通过设置的test.com查找同名的upstream模块        
        proxy_pass http://test.com;    
    }  
} 

# 添加反向代理模块 
# 反向代理服务器将 /hello/upload/指令  转发给web服务器 
upstream test.com 
{
    
        
	# 要代理的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:服务器端错误–服务器未能实现合法的请求

猜你喜欢

转载自blog.csdn.net/liangwenhao1108/article/details/109239275
今日推荐