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

2023-10-27

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: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

  • 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:服务器端错误–服务器未能实现合法的请求
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 命名 Docker 卷以共享构建而不更新

    我工作的公司的开发人员要求我用 Docker 做一些不同的事情 然后我也被使用了 目标是拥有 2 个具有以下职责的容器 容器A 节点容器将构建前端 React 应用程序并将捆绑包放入名为的目录中app dist 完成后 容器将停止运行 容器
  • 使用 client_body_in_file_only 进行 nginx 文件上传

    晚上好 我需要将静态内容上传到 nginx 服务器 1 9 因此上传模块不适用于此版本 我读过这篇文章 Nginx 直接文件上传 无需通过后端传递 https coderwall com p swgfvw nginx direct file
  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • Node + Express + Nginx 未设置 Cookie

    我有一个使用 Express 的 Node 应用程序 我尝试为我的客户端设置 cookie 它在本地环境 http 上运行良好 但是一旦我投入生产 https 我就很好地收到了cookie 我可以在响应中看到它 但它没有设置 任何想法 Ng
  • 当请求太大时,Nginx(我认为)会以错误的权限保存文件

    所以 我对托管和 Linux 等都是完全陌生的 所以如果我说错了 请原谅我 我还在学习 我正在使用 Django 创建一个小型个人网站 我想把它放到网上看看是否一切正常 我从 linode 买了一台便宜的服务器 并使用 Digital Oc
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • nginx 匹配位置中的特定单词

    我在匹配 nginx request body 变量中的特定单词时遇到问题 如果正文请求中有特殊单词 我想代理传递 所以我的方法是这样的 location php if request body proxy pass http test p
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • 将代码从 htaccess 重写为 nginx 配置?

    我在将 htaccess 文件中的重写代码实现到 nginx 配置中时遇到问题 我已经尝试过生成器 http winnginx com htaccess http winginx com htaccess用于生成我的重写 代码 我的ngin
  • 使用nginx容器作为反向代理时的原始url

    我有一个 Web 应用程序部署为码头集装箱 我也有一个nginx容器 使用dnsmasq解析器 设置为充当 Web 应用程序前面的反向代理 它的 80 端口映射到主机 我的应用程序使用 SSO 身份验证 当我使用身份提供商登录时 回调 ur
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • Nginx - Heroku Docker - 是否可以在 Heroku 上运行 Nginx 作为反向代理

    我试图弄清楚如何使用 Nginx 在 Heroku 应用程序上构建反向代理 问题是 Heroku 似乎每个应用程序只接受一个容器 但我的应用程序系统至少会使用三个容器 一个用于 Nginx 一个用于我的应用程序前端 一个用于我的业务逻辑服务
  • 使用 Nginx 在 Docker 容器内部署带有路由器的 Angular2

    我正在尝试部署一个使用框架的路由器功能的 Angular 2 但在 docker 容器内使用 nginx 为其提供服务时遇到一些问题 由 angular cli 构建的 Angular 应用程序具有如下文件结构 dist 08c42df75
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • Nginx docker容器代理传递到另一个端口

    我想在 docker 容器中运行 Nginx 它监听端口 80 并且当 url 以 word 开头时 我希望它 proxy pass 到端口 8080api 我有一些网络应用程序侦听端口 8080 这在没有 docker 的情况下对我来说一
  • 使用 DigitalOcean 在 Kubernetes 集群上为我的 Nginx-Ingress 生成通配符证书

    我遵循了这个 DigitalOcean 指南https www digitalocean com community tutorials how to set up an nginx ingress with cert manager on
  • Nginx url 限制 502 网关

    我有一个问题 但我接受绕过此功能的其他建议 基本上 我在 get 请求中向我的服务器发送大约 3000 个字符的大行文本 然后服务器将其作为 url 中的参数发送到谷歌翻译 问题 当 url gt 1900 个字符时 Nginx 会抛出 5
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi

随机推荐

  • 基于GPRS的无线视频监控系统

    1 引言 目前 远程视频监控系统已经广泛应用于工矿企业生产现场监控 电信机房监控 城市交通管理等领域 常见的远程视频监控系统大多是通过架设专用的有线媒介 或者租用电信运营商的通信线路传输视频信号 前者工程工期长 前期投入比较大 传输距离有限
  • 学生成绩管理系统

    一个年级 相当链表A 该年级5个班 每个班5个人 相当于链表B1 B5 做一个学生成绩管理系统 include
  • C/C++操作文件

    1 C 给字符数组内文件名排序 假设我们获得到的文件名列表是一个二维字符数组 给这样的数据排序首先要获得排序所需的关键字 如下 void getNum char dstChar int num 首先要知道字符串长啥样 用字符串中的哪几个位置
  • cartographer 处理IMU(激光,里程计等)流程

    1 cartographer ros 入口文件 node main cc 入口函数main 如下图 ros init argc argv cartographer node ros start cartographer ros Scoped
  • hduoj 2014

    青年歌手大奖赛 评委会打分 Problem Description 青年歌手大奖赛中 评委会给参赛选手打分 选手得分规则为去掉一个最高分和一个最低分 然后计算平均得分 请编程输出某选手的得分 Input 输入数据有多组 每组占一行 每行的第
  • Android8.1 Settings中恢复出厂设置中添加一个清除数据的按钮

    1 packages apps Settings res layout master clear confirm xml b res layout master clear confirm xml
  • 【Ubuntu22使用过程问题记录】

    Ubuntu22 04 使用过程问题解决方案 1 系统基本设置 1 1 输入法 增加中文输入 1 Settings gt Region Language gt Manage Installed Languages gt 选中chinese
  • jmeter压测报错Non HTTP response code: java.net.ConnectException/Non HTTP response message: Connection ti

    最近在做性能测试过程中遇到了高并发时 后台监控各项指标都很正常 但是测试结果中很多Non HTTP response code java net SocketException Non HTTP response message Permi
  • 签名服务器调用接口

    package teste import java io UnsupportedEncodingException import java net URLEncoder import cn com infosec netsign agent
  • html前端技术开发,CSS标准文档流,建议收藏

    开始 我大学读的是大专 在学校学的是机电一体化 临近毕业的时候选择了学习web前端技术 因为做机电实在又累工资又低 而我更喜欢坐办公室的工作 有空调吹 我很现实 就是想多赚一点钱 到现在做了两年前端的小程序员 月薪是13K 经历过两次跳槽
  • GitLab WorkFlow

    在团队开发中 为了更好的协作 通常会采用一些工作流来最大程度提升效率 生产一个软件工序是比较复杂的 如果通过一个好的逻辑顺序去应用到一个软件开发的生命周期过程是非常重要的 GitLab WorkFlow 从构思到上线的十步 想法 每一个新建
  • 初学react(七):if 判断

    思路 先定义一个state里的一个状态 因为如果状态改变都会重新执行render 所以在render写上判断动态的赋值 也可以使用三目运算 import React from react import App css import Pers
  • jeesite框架介绍

    1 jeesite框架介绍 http wenku baidu com view 7e543c24e45c3b3567ec8baf html 2 jeesite开发环境搭建及部署 http wenku baidu com link url L
  • python3 题解(34 棋盘放麦子)

    棋盘放麦子 问题 国际象棋的棋盘有共有64格 传说国王为奖励它的发明人 答应了他的一个 小 要求 在棋盘的第1格放1粒小麦 第2格放2粒 第3格放4粒 第4格放8粒 每一格是前一格数目的2倍 这一共是多少小麦呢 是个天文数字 请你利用计算机
  • 【Linux篇】父子进程间的数据共享

    include
  • unity期末:从AR的角度观察与实现粒子系统效果

    一 前言 本次项目为本学期unity游戏编程的最后一次制作内容 同时也是期末大作业的考查内容 本次大作业的要求如下 内容 请参考以下技术主题 但不限于这些主题 运用手机拍若干全景图 贴到天空盒或球型天空 做一个简单校园漫游功能 粒子系统效果
  • C++STL库神器:nth_element() 详解

    nth element nth element 函数头文件 algorithm h 功能介绍 arr n 默认求第m大的元素 std nth element arr arr m arr n 定义cmp可求第m小的元素 bool cmp in
  • 单台服务器docker如何搭建rabbitmq集群

    文章目录 一 创建多个RabbitMQ容器 二 将RabbitMQ节点加入到集群中 三 测试 四 在多台服务器上部署RabbitMQ集群 五 通过nginx实现负载均衡 六 如何给RabbitMQ容器添加用户 七 碰到的问题 1 本文是在同
  • Altium AD20过孔盖油,通过设计规则实现过孔盖油,简便实用不会造成遗漏出错

    如果是将PCB源文件发给加工厂 只需说明过孔盖油 板厂就会帮你完成对应的操作 但为了避免源文件泄露 会选择Gerber文件 这时候过孔盖油就要自己来做了 如果没有对规则进行设置 那么切换到Solder层 默认的视图应该是这样的 过孔的周围多
  • Nginx 概述 如何正规安装 静态网页配置 反向代理配置 负载均衡配置

    目录 1 基本概念 1 1 Nginx初步认识 1 2 正向 反向代理 1 3 域名和IP 2 Nginx安装和配置 2 1 安装Nginx 2 2 配置 3 Nginx的使用 3 1 部署静态网页 3 2 反向代理和负载均衡 1 反向代理