Nginx 初步认识

序言

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。php

Nginx功能丰富,可做为HTTP服务器,也可做为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。而且支持不少第三方的模块扩展。html

Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。nginx

牛逼吹的差很少啦,若是你还不过瘾,你能够百度百科或者一些书上找到这样的夸耀,比比皆是。web

Nginx经常使用功能

一、Http代理,反向代理:做为web服务器最经常使用的功能之一,尤为是反向代理。算法

这里我给来2张图,对正向代理与反响代理作个诠释,具体细节,你们能够翻阅下资料。后端

Nginx在作反向代理时,提供性能稳定,而且可以提供配置灵活的转发功能。Nginx能够根据不一样的正则匹配,采起不一样的转发策略,好比图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就能够为所欲为的玩。而且Nginx对返回结果进行错误页跳转,异常判断等。若是被分发的服务器存在异常,他能够将请求从新转发给另一台服务器,而后自动去除异常服务器。浏览器

Nginx的产生

没有听过Nginx?那么必定听过它的"同行"Apache吧!Nginx同Apache同样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL做为沟通依据,经过HTTP协议提供各类网络服务。缓存

然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特色等局限而且各自的定位和发展都不尽相同。这也使得各个WEB服务器有着各自鲜明的特色。安全

Apache的发展时期很长,并且是毫无争议的世界第一大服务器。它有着不少优势:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上如今。因此它被设计为一个重量级的。它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会致使服务器消耗大量内存。操做系统对其进行进程或线程间的切换也消耗了大量的CPU资源,致使HTTP请求的平均响应速度下降。服务器

这些都决定了Apache不可能成为高性能WEB服务器,轻量级高并发服务器Nginx就应运而生了。

俄罗斯的工程师Igor Sysoev,他在为Rambler Media工做期间,使用C语言开发了Nginx。Nginx做为WEB服务器一直为Rambler Media提供出色而又稳定的服务。

而后呢,Igor Sysoev将Nginx代码开源,而且赋予自由软件许可证。

因为:

  • Nginx使用基于事件驱动架构,使得其能够支持数以百万级别的TCP链接
  • 高度的模块化和自由软件许可证是的第三方模块层出不穷(这是个开源的时代啊~)
  • Nginx是一个跨平台服务器,能够运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操做系统上
  • 这些优秀的设计带来的极大的稳定性

因此,Nginx火了!

Nginx的用武之地

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP三、SMTP代理服务器;Nginx能够做为一个HTTP服务器进行网站的发布处理,另外Nginx能够做为反向代理进行负载均衡的实现。

关于代理

说到代理,首先咱们要明确一个概念,所谓代理就是一个表明、一个渠道;

此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色经过这个代理访问目标角色完成一些任务的过程称为代理操做过程;如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。

正向代理

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

在现在的网络环境下,咱们若是因为技术须要要去访问国外的某些网站,此时你会发现位于国外的某网站咱们经过浏览器是没有办法访问的,此时你们可能都会用一个操做FQ进行访问,FQ的方式主要是找到一个能够访问国外网站的代理服务器,咱们将请求发送给代理服务器,代理服务器去访问国外的网站,而后将访问到的数据传递给咱们!

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

客户端必须设置正向代理服务器,固然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。如

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

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

反向代理

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

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

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道本身访问的是一个代理。由于客户端不须要任何配置就能够访问。

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

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

项目场景

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

两者区别

截了一张图来讲明正向代理和反向代理两者之间的区别,如图。

图解:

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;

在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

实际上,Proxy在两种代理中作的事情都是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,因此把后出现的那种代理方式称为反向代理了。

负载均衡

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

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

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

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

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

Nginx支持的负载均衡调度算法方式以下:

  1. weight轮询(默认):接收到的请求按照顺序逐一分配到不一样的后端服务器,即便在使用过程当中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理状况不会受到任何影响。 这种方式下,能够给不一样的后端服务器设置一个权重值(weight),用于调整不一样的服务器上请求的分配率;权重数据越大,被分配到请求的概率越大;该权重值,主要是针对实际工做环境中不一样的后端服务器硬件配置进行调整的。
  2. ip_hash:每一个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在必定程度上解决了集群部署环境下session共享的问题。
  3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的几率高,响应时间长处理效率低的服务器分配到的请求少;结合了前二者的优势的一种调度算法。可是须要注意的是Nginx默认不支持fair算法,若是要使用这种调度算法,请安装upstream_fair模块。
  4. url_hash:按照访问的url的hash结果分配请求,每一个请求的url会指向后端固定的某个服务器,能够在Nginx做为静态服务器的状况下提升缓存效率。一样要注意Nginx默认不支持这种调度算法,要使用的话须要安装Nginx的hash软件包。

 几种经常使用web服务器对比

 

对比项\服务器 Apache Nginx Lighttpd
Proxy代理 很是好 很是好 通常
Rewriter 很是好 通常
Fcgi 很差 很是好
热部署 不支持 支持 不支持
系统压力 很大 很小 比较小
稳定性 很是好 很差
安全性 通常 通常
静态文件处理 通常 很是好
反向代理 通常 很是好 通常

二、负载均衡

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他作不到的啦,你能够参照全部的负载均衡算法,给他一一找出来作下实现。

上3个图,理解这三种负载均衡算法的实现

Ip hash算法,对客户端请求的ip进行hash操做,而后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,能够解决session不共享的问题。 

三、web缓存

Nginx能够对不一样的文件作不一样的缓存处理,配置灵活,而且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容能够的进行增删管理。

四、Nginx相关地址

源码:https://trac.nginx.org/nginx/browser

官网:http://www.nginx.org/

Nginx配置文件结构

若是你下载好啦,你的安装文件,不妨打开conf文件夹的nginx.conf文件,Nginx服务器的基础配置,默认的配置也存放在此。

在nginx.conf的注释符号位#

nginx文件的结构,这个对刚入门的同窗,能够多看两眼。

默认的config 

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
View Code

nginx文件结构

复制代码
...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
复制代码

一、全局块:配置影响nginx全局的指令。通常有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,容许生成worker process数等。

二、events块:配置影响nginx服务器或与用户的网络链接。有每一个进程的最大链接数,选取哪一种事件驱动模型处理链接请求,是否容许同时接受多个网路链接,开启多个网络链接序列化等。

三、http块:能够嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,链接超时时间,单链接请求数等。

四、server块:配置虚拟主机的相关参数,一个http中能够有多个server。

五、location块:配置请求的路由,以及各类页面的处理状况。

下面给你们上一个配置文件,做为理解,同时也配入我搭建的一台测试机中,给你们示例。 

复制代码
########### 每一个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #容许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置能够放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路链接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络链接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大链接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #容许sendfile方式传输文件,默认为off,能够在http块,server块,location块。
    sendfile_max_chunk 100k;  #每一个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #链接超时时间,默认为75s,能够在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单链接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #容许的ip           
        } 
    }
} 
复制代码

上面是nginx的基本配置,须要注意的有如下几点:

一、1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; 2.$remote_user :用来记录客户端用户名称; 3.$time_local : 用来记录访问时间与时区;4.$request : 用来记录请求的url与http协议;

  5.$status : 用来记录请求状态;成功是200, 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;7.$http_referer :用来记录从那个页面连接访问过来的; 8.$http_user_agent :记录客户端浏览器的相关信息;

二、惊群现象:一个网路链接到来,多个睡眠的进程被同事叫醒,但只有一个进程能得到连接,这样会影响系统性能。

三、每一个指令必须有分号结束。

 

本文转自:https://www.cnblogs.com/wcwnina/p/8728391.html

                  https://www.cnblogs.com/knowledgesea/p/5175711.html