Nginx常用功能详解,练习一下吧

码农程序 / 2019-03-18 19:32:16

本公众号只做学习分享,本公众号会不定期的给大家分享视频教学教程,项目源码,文章最新动态等,感谢大家的支持!


抖音号startphp

用短视频和大家分享PHP学习方法,学习技巧与经验分享,

欢迎关注抖音号:startphp


教程力荐

要提升自己的学习能力的同学,自己还是要拥有一本属于自己的书的,因为你在忘记的时候可以经常拿出来翻阅一下,巩固一下。


文章内容

1. 正向代理

正向代理:内网服务器主动去请求外网的服务的一种行为

说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理。

在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。来看个示意图(我把客户端和正向代理框在一块,同属于一个环境,后面我有介绍):

正向代理的配置:

 1server {
2    #指定DNS服务器IP地址  
3    resolver 114.114.114.114;   
4    #指定代理端口    
5    listen 8080;  
6    location / {
7        #设定代理服务器的协议和地址(固定不变)    
8        proxy_pass http://$http_host$request_uri
9    }  
10

这样就可以做到内网中端口为8080的服务器主动请求到1.2.13.4的主机上,如在Linux下可以:

1curl --proxy proxy_server:8080 http://www.taobao.com/


正向代理的关键配置:

  1. resolver:DNS服务器IP地址

  2. listen:主动发起请求的内网服务器端口

  3. proxy_pass:代理服务器的协议和地址

总结来说:正向代理,"它代理的是客户端"是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的用途:
(1)访问原来无法访问的资源,如Google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

2. 反向代理

反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过nginx返回给客户端。

明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用Nginx进行反向代理实现的,并且通过封装Nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看具体的信息:http://tengine.taobao.org/。那么反向代理具体是通过什么样的方式实现的分布式的集群操作呢,我们先看一个示意图(我把服务器和反向代理框在一块,同属于一个环境,后面我有介绍):

通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

反向代理的作用:
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载

项目场景

通常情况下,我们在实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。具体的拓扑图如下:


反向代理配置:

 1server {
2    #监听端口
3    listen 80;
4    #服务器名称,也就是客户端访问的域名地址
5    server_name  a.xxx.com;
6    #nginx日志输出文件
7    access_log  logs/nginx.access.log  main;
8    #nginx错误日志输出文件
9    error_log  logs/nginx.error.log;
10    root   html;
11    index  index.html index.htm index.php;
12    location / {
13        #被代理服务器的地址
14        proxy_pass  http://localhost:8081;
15        #对发送给客户端的URL进行修改的操作
16        proxy_redirect     off;
17        proxy_set_header   Host             $host;
18        proxy_set_header   X-Real-IP        $remote_addr;
19        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
20        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
21        proxy_max_temp_file_size 0;
22   }
23}

这样就可以通过a.xxx.com来访问a项目对应的网站了,而不需要带上难看的端口号。
反向代理的配置关键点是:

  1. server_name:代表客户端向服务器发起请求时输入的域名

  2. proxy_pass:代表源服务器的访问地址,也就是真正处理请求的服务器(localhost+端口号)。

3. 透明代理

透明代理:也叫做简单代理,意思客户端向服务端发起请求时,请求会先到达透明代理服务器,代理服务器再把请求转交给真实的源服务器处理,也就是是客户端根本不知道有代理服务器的存在。

举个栗子:它的用法有点类似于拦截器,如某些制度严格的公司里的办公电脑,无论我们用电脑做了什么事情,安全部门都能拦截我们对外发送的任何东西,这是因为电脑在对外发送时,实际上先经过网络上的一个透明的服务器,经过它的处理之后,才接着往外网走,而我们在网上冲浪时,根本没有感知到有拦截器拦截我们的数据和信息。

有人说透明代理和反向代理有点像,都是由代理服务器先接受请求,再转发到源服务器。其实本质上是有区别的,透明代理是客户端感知不到代理服务器的存在,而反向代理是客户端感知只有一个代理服务器的存在,因此他们一个是隐藏了自己,一个是隐藏了源服务器。事实上,透明代理和正向代理才是相像的,都是由客户端主动发起请求,代理服务器处理;他们差异点在于:正向代理是代理服务器代替客户端请求,而透明代理是客户端在发起请求时,会先经过透明代理服务器,再达到服务端,在这过程中,客户端是感知不到这个代理服务器的。

4. 负载均衡

我们已经明确了所谓代理服务器的概念,那么接下来,Nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

这里提到的客户端发送的、Nginx反向代理服务器接收到的请求数量,就是我们说的负载量。

请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。

所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。

负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。


nginx实现负载均衡有几种模式:

  1. 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,也是nginx的默认模式。轮询模式的配置很简单,只需要把服务器列表加入到upstream模块中即可。

下面的配置是指:负载中有三台服务器,当请求到达时,nginx按照时间顺序把请求分配给三台服务器处理。

1upstream serverList {
2    server 1.2.3.4;
3    server 1.2.3.5;
4    server 1.2.3.6;
5}
  1. ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

下面的配置是指:负载中有三台服务器,当请求到达时,nginx优先按照ip_hash的结果进行分配,也就是同一个IP的请求固定在某一台服务器上,其它则按时间顺序把请求分配给三台服务器处理。

1upstream serverList {
2    ip_hash
3    server 1.2.3.4;
4    server 1.2.3.5;
5    server 1.2.3.6;
6}
  1. url_hash:按访问url的hash结果来分配请求,相同的url固定转发到同一个后端服务器处理。

1upstream serverList {
2    server 1.2.3.4;
3    server 1.2.3.5;
4    server 1.2.3.6;
5    hash $request_uri; 
6    hash_method crc32; 
7}
  1. fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

1upstream serverList {
2    server 1.2.3.4;
3    server 1.2.3.5;
4    server 1.2.3.6;
5    fair;
6}

而在每一种模式中,每一台服务器后面的可以携带的参数有:

  1. down: 当前服务器暂不参与负载

  2. weight: 权重,值越大,服务器的负载量越大。

  3. max_fails:允许请求失败的次数,默认为1。

  4. fail_timeout:max_fails次失败后暂停的时间。

  5. backup:备份机, 只有其它所有的非backup机器down或者忙时才会请求backup机器。

如下面的配置是指:负载中有三台服务器,当请求到达时,nginx按时间顺序和权重把请求分配给三台服务器处理,例如有100个请求,有30%是服务器4处理,有50%的请求是服务器5处理,有20%的请求是服务器6处理。

1upstream serverList {
2    server 1.2.3.4 weight=30;
3    server 1.2.3.5 weight=50;
4    server 1.2.3.6 weight=20;
5}

如下面的配置是指:负载中有三台服务器,服务器4的失败超时时间为60s,服务器5暂不参与负载,服务器6只用作备份机。

1upstream serverList {
2    server 1.2.3.4 fail_timeout=60s;
3    server 1.2.3.5 down;
4    server 1.2.3.6 backup;
5}

下面是一个配置负载均衡的示例(只写了关键配置):
其中:

  1. upstream:是负载的配置模块,serverList是名称,随便起

  2. server_name:是客户端请求的域名地址

  3. proxy_pass:是指向负载的列表的模块,如serverList

 1upstream serverList {
2    server 1.2.3.4 weight=30;
3    server 1.2.3.5 down;
4    server 1.2.3.6 backup;
5}   
6
7server {
8    listen 80;
9    server_name  www.xxx.com;
10    root   html;
11    index  index.html index.htm index.php;
12    location / {
13        proxy_pass  http://serverList;
14        proxy_redirect     off;
15        proxy_set_header   Host             $host;
16   }
17}

5. 静态服务器

现在很多项目流行前后分离,也就是前端服务器和后端服务器分离,分别部署,这样的方式能让前后端人员能各司其职,不需要互相依赖,而前后分离中,前端项目的运行是不需要用Tomcat、Apache等服务器环境的,因此可以直接用nginx来作为静态服务器。

静态服务器的配置如下,其中关键配置为:

  1. root:直接静态项目的绝对路径的根目录。

  2. server_name : 静态网站访问的域名地址。

1server {
2        listen       80;                                                         
3        server_name  www.xxx.com;                                               
4        client_max_body_size 1024M;
5        location / {
6               root   /var/www/xxx_static;
7               index  index.html;
8           }
9    }

6. nginx的安装

学了这么多nginx的配置用法之后,我们需要对每一个知识点做一下测试,才能印象深刻,在此之前,我们需要知道nginx是怎么安装,下面以Linux环境为例,简述yum方式安装nginx的步骤:

  1. 安装依赖:

1//一键安装上面四个依赖
2yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 安装nginx:

1yum install nginx
  1. 检查是否安装成功:

1nginx -v
  1. 启动/挺尸nginx:

1/etc/init.d/nginx start
2/etc/init.d/nginx stop
  1. 编辑配置文件:

1/etc/nginx/nginx.conf 

这些步骤都完成之后,我们就可以进入nginx的配置文件nginx.conf对上面的各个知识点,进行配置和测试了。


以上是文章的全部内容,有需要交流与学习的,可以加小妹为好友,一起学习与交流,有技术上的问题也可以咨询,只要我懂!我们一起加油