前端的Nginx知识梳理「干货分享」

Nginx是一个高性能、轻量级的Web和反向代理服务器, 其特色是占有内存及资源少、抗并发能力强。javascript

Nginx安装简单、配置简洁、启动快速便捷、支持热部署、支持 SSL、拥有高度模块化的设计。css

Nginx的主要功能有:html

  • Web服务器
  • 反向代理
  • 负载均衡
  1. 什么是Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。java

Nginx以事件驱动的方式编写,因此有很是好的性能,同时也是一个很是高效的反向代理、负载平衡服务器。在性能上,Nginx占用不多的系统资源,能支持更多的并发链接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。nginx

Nginx支持热部署,启动速度特别快,还能够在不间断服务的状况下对软件版本或配置进行升级,即便运行数月也无需从新启动。web

在微服务的体系之下,Nginx正在被愈来愈多的项目采用做为网关来使用,配合Lua作限流、熔断等控制。数据库

这里提到了反向代理,什么是反向代理?windows

Nginx根据接收到的请求的端口,域名,url,将请求转发给不一样的机器,不一样的端口(或直接返回结果),而后将返回的数据返回给客户端,在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。后端

当咱们有一个服务器集群,而且服务器集群中的每台服务器的内容同样的时候,一样咱们要直接从我的电脑访问到服务器集群服务器的时候没法访问,必须经过第三方服务器才能访问集群
这个时候,咱们经过第三方服务器访问服务器集群的内容,可是咱们并不知道是哪一台服务器提供的内容,这种代理方式称为反向代理设计模式

反向代理:客户端 一>代理 <一> 服务端

反向代理用一个租房的例子:

A(客户端)想租一个房子,B(代理)就把这个房子租给了他。
这时候实际上C(服务端)才是房东。
B(代理)是中介把这个房子租给了A(客户端)。

这个过程当中A(客户端)并不知道这个房子到底谁才是房东
他都有可能认为这个房子就是B(代理)的

反向代理特色

  • Nginx没有本身的地址,它的地址就是服务器的地址,如www.baidu.com,对外部来说,它就是数据的生产者。
  • Ngxin明确的知道应该去哪一个服务器获取数据(在未接收到请求以前,已经肯定应该链接哪台服务器)

有反向就应该有正向。

所谓正向代理就是顺着请求的方向进行的代理,即代理服务器他是由你配置为你服务,去请求目标服务器地址。正向代理最大的特色是客户端很是明确要访问的服务器地址;服务器只清楚请求来自哪一个代理服务器,而不清楚来自哪一个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息

正向代理:客户端 <一> 代理 一>服务端

正向代理也简单地打个租房的比方:

A(客户端)想租C(服务端)的房子,可是A(客户端)并不认识C(服务端)租不到。
B(代理)认识C(服务端)能租这个房子因此你找了B(代理)帮忙租到了这个房子。

这个过程当中C(服务端)不认识A(客户端)只认识B(代理)
C(服务端)并不知道A(客户端)租了房子,只知道房子租给了B(代理)。

2.  Nginx应用场景


一、 http服务器。Nginx是一个http服务能够独立提供http服务。能够作网页静态服务器。

二、 虚拟主机。能够实如今一台服务器虚拟出多个网站。例如我的网站使用的虚拟主机。

  • 基于端口的,不一样的端口
  • 基于域名的,不一样域名

三、 反向代理,负载均衡。当网站的访问量达到必定程度后,单台服务器不能知足用户的请求时,须要用多台服务器集群可使用nginx作反向代理。而且多台服务器能够平均分担负载,不会由于某台服务器负载高宕机而某台服务器闲置的状况。

  1. 安装Nginx

  1. 命令

-

nginx -s reopen #重启Nginx
nginx -s reload #从新加载Nginx配置文件,而后以优雅的方式重启Nginx
nginx -s stop #强制中止Nginx服务
nginx -s quit #优雅地中止Nginx服务(即处理完全部请求后再中止服务)
nginx -?,-h #打开帮助信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,而后退出
nginx -t #检测配置文件是否有语法错误,而后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死全部nginx进程
复制代码

转储: 在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。若是我想获得某些时刻的数据(有多是调试程序Bug或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。不然,这些数据你永远都拿不到。

  1. Nginx配置

Nginx的主配置文件是:nginx.conf。

里面的配置主要是这样:

# 全局区   有一个工做子进程,通常设置为CPU数 * 核数
        worker_processes  1;

        events {
                # 通常是配置nginx进程与链接的特性
                # 如1个word能同时容许多少链接,一个子进程最大容许链接1024个链接
                worker_connections  1024;
        }

        # 配置HTTP服务器配置段
        http {

                # 配置虚拟主机段
                    server {

                        # 定位,把特殊的路径或文件再次定位。
                location  {

                }
            }

            server {
                       ...
            }
        }
复制代码

咱们能够很明显的将 nginx.conf 配置文件分为三部分:

全局块: 从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器总体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、容许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

好比上面第一行配置的:

worker_processes  1;
复制代码

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,能够支持的并发处理量也越多可是会受到硬件、软件等设备的制约。

events块:涉及的指令主要影响 Nginx 服务器与用户的网络链接,经常使用的设置包括是否开启对多 work process 下的网络链接进行序列化,是否容许同时接收多个网络链接,选取哪一种事件驱动模型来处理链接请求,每一个 word process 能够同时支持的最大链接数等。

http块: Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

  1. 反向代理

上面已经解释过反向代理了,咱们如今来写一个。当我在公司配置反向代理的时候,我会在http中添加一个server:

server {
        listen            80;
        server_name       dev-customer.sdyxmall.com ;
        gzip              off;
        gzip_buffers      4 16k;
        gzip_comp_level   5;
        gzip_http_version 1.0;
        gzip_min_length   1k;
        gzip_types        text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp;
        gzip_vary         on;

        location / {
           proxy_pass   http://127.0.0.1:5000;
           proxy_set_header X-real-ip $remote_addr;
           proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;
        }
    }
复制代码

而后hosts中配置:

10.3.100.13 dev-customer.sdyxmall.com
复制代码

接下来咱们梳理一下语法:

1 listen *:80 | *:8080 #监听全部80端口和8080端口
2 listen  IP_address:port   #监听指定的地址和端口号
3 listen  IP_address     #监听指定ip地址全部端口
4 listen port     #监听该端口的全部IP链接
复制代码

server_name指令主要用于配置基于名称虚拟主机

gzip的做用是是否须要开启压缩传输

location指令用于匹配 URL

proxy_pass指令用于设置被代理服务器的地址

proxy_set_header用来设定被代理服务器接收到的header信息(请求头)

基本上咱们了解server_name,location,proxy_pass就能够配置反向代理

7.Nginx管理虚拟主机

这部分我工做中没有接触过,可是查找资料的时候名字看起来很高大上,就特地研究了一下。当咱们想在一台服务器虚拟出多个网站,咱们就能够用虚拟主机来实现。

虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分红一台台“虚拟”的主机,每台虚拟主机均可以是一个独立的网站,能够具备独立的域名,具备完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是彻底独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机彻底同样。

7.1 基于域名的虚拟主机

一、在http大括号中添加以下代码段:

server {  
        #监听端口 80  
        listen 80;   
                                
        #监听域名feng.com;  
        server_name feng.com;
          
        location / {              
                # 相对路径,相对nginx根目录。也可写成绝对路径  
            root    feng;  
            
            # 默认跳转到index.html页面  
            index index.html;                 
        }  
    }
复制代码

二、切换安装目录:cd/usr/local/software/nginx

三、建立目录:mkdir feng

四、新建index.html文件:vi /usr/local/software/nginx/feng/index.html,文件内容:

<html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        </head>
        <body>
            <h2>枫</h2>
        </body>
    </html>
复制代码

五、从新读取配置文件:

/usr/local/software/nginx/sbin/nginx-s reload

kill -HUP进程号

六、配置windows本机host:

192.168.197.142 feng.com #Linux服务器IP地址

七、访问:http://feng.com:80/

7.2 基于端口的虚拟主机配置

server {
        listen  2022;
        server_name     feng.com;
        location / {
           root    /home;
           index index.html;
        }
    }
复制代码

7.3 基于IP地址虚拟主机配置

server {
      listen  80;
      server_name  192.168.197.142;
      location / {
              root    ip;
              index index.html;
      }
    }
复制代码
  1. 负载均衡

咱们使用Nginx听到的最多的就是负载均衡,那么什么是负载均衡呢?

负载均衡:因为目前现有网络的各个核心部分随着业务量的提升,访问量和数据流量的快速增加,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本没法承担。

针对此状况而衍生出来的一种廉价有效透明的方法以扩展示有网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性的技术就是负载均衡(Load Balance)。

Nginx实现负载均衡有几种方案。

8.1 轮询

轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不一样的后端服务器。

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}
复制代码

8.2 weight

基于权重的负载均衡即Weighted Load Balancing,这种方式下,咱们能够配置Nginx把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
}
复制代码

权重越高,在被访问的几率越大,如上例,分别是30%,70%。

8.3 ip_hash

前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不一样的后端服务器进行处理,所以若是涉及到会话Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}
复制代码

8.4 fair

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}
复制代码

8.5 url_hash

按访问url的hash结果来分配请求,使每一个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}
复制代码

在须要使用负载均衡的server中增长

proxy_pass http://backserver/; 
upstream backserver{ 
    ip_hash; 
    server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载) 
    server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; (其它全部的非backup机器down或者忙的时候,请求backup机器) 
} 
复制代码

max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

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

配置实例:

#user  nobody;

worker_processes  4;
events {
# 最大并发数
worker_connections  1024;
}
http{
    # 待选服务器列表
    upstream myproject{
        # ip_hash指令,将同一用户引入同一服务器。
        ip_hash;
        server 125.219.42.4 fail_timeout=60s;
        server 172.31.2.183;
    }

    server{
        # 监听端口
        listen 80;
        # 根目录下
        location / {
        # 选择哪一个服务器列表
            proxy_pass http://myproject;
        }

    }
}
复制代码

8.6 深刻实践

上面写的都是负载均衡的方案,具体实现我看到知乎大佬写的很不错,并且看起来帅的起飞。

  1. 总结

Nginx真的很强大,并且使用的愈来愈普遍,虽然我目前在公司使用的很少,可是学到了Nginx不少知识,对项目的构建,优化,内心有了更多的想法。或许不必定要了解的很深刻,知足咱们的平常须要就能够了,了解它,当咱们在作项目或者解决问题,可以做为咱们的一种解决方案,就很Nice了。

做者:黑色的枫

相关文章
相关标签/搜索