初识nginx


Nginx介绍

  Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx应用场景

1、正向代理

什么是代理服务器(Proxy Serve)?

    提供代理服务的电脑系统或其它类型的网络终端,代替网络用户去取得网络信息。

为什么使用代理服务器?

1.提高访问速度 

    由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门网站能明显提高访问速度。

2.防火墙作用 

    由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以在代理服务器上设限,过滤掉某些不安全信息。同时正向代理中上网者可以隐藏自己的IP,免受攻击。

3.突破访问限制 

    互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,可以直接访问外网。

什么是正向代理?

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。

                初识nginx

用户访问网站,向正向代理服务器发出请求并指定了服务器,正向代理服务器直接去找指定的服务器将内容返回给用户。

之前看过一个人讲解的一个生动的例子:一个人(用户)去饭店(网站)吃饭,他想吃要吃鱼香肉丝(需求),但是后厨重地、闲人是免进的,所以这个人找了服务员(代理服务器),告诉服务员想吃鱼香肉丝,服务员是可以到后厨的,告诉厨师(服务器)有个人点了鱼香肉丝,厨师做好后由服务员送到了这个人的餐桌上。这样一个流程,这个人吃到了鱼香肉丝。

还有一个更好让大家理解的例子:A向C借钱,由于之前跟C借的钱还没还,于是A想了一个办法,他让B去向C借钱,这样B就代替A向C借钱,A就得到了C的钱,C还并不知道这钱借给了A,B就充当了A的代理人的角色。 

正向代理的简单代码实例

    server {
resolver x.x.x.x;
        resolver_timeout 5s;
        listen 81;
        location / {
            proxy_pass http://$host$request_uri;
        }
    }
resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。
注意项:
1. 不能有hostname
2. 必须有resolver, 即dns,即上面的x.x.x.x,换成你们的DNS服务器ip即可
3 . $http_host和$request_uri是nginx系统变量,不要想着替换他们,保持原样就OK。
查看dns方法 cat /etc/resolv.conf 代理使用
在需要访问外网的机器上执行以下操作之一即可:
1. export http_proxy=http://yourproxyaddress:proxyport
2. gedit ~/.bashrc export http_proxy=http://yourproxyaddress:proxyport
yourproxyaddress即Nginx服务器的ip了,proxyport就是上面配置中的81,可以根据自己的需要修改。


2、反向代理

什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是反向代理方式实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。这样说,其实nginx完成的就是这样的工作。我们让nginx监听一个端口,譬如80端口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完成后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回,这里,我们会以为是nginx进行了处理,但实际上进行处理的是tomcat。


             初识nginx

用户访问一个网站,这个网站绑定的就是反向代理服务器,反向代理会根据用户需要的需求来选择服务器为用户提供服务。

之前看过一个人讲解的一个生动的例子:一个人(用户)去饭店(网站)吃饭,找服务员(反向代理服务器)点餐,要吃鱼香肉丝(需求),可是这个饭店的厨师(服务器1)不会做,但是这个钱还是要赚的,正好这个服务员知道隔壁饭店的厨师(服务器2)会做,于是这个服务员去隔壁饭店要的这个鱼香肉丝,厨师做好后,这个服务员将做好的鱼香肉丝送到了这个人的餐桌上,最后这个人满意的吃到了好吃的鱼香肉丝。 对于这个人来讲他只是知道在这个饭店吃到了鱼香肉丝,但是不知道其实这个鱼香肉丝是隔壁饭店做出来的,这就是反向代理的含义。

反向代理的简单代码实例

        server {  
        listen       80;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;
        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host:$server_port;
        }
    }

以上代码实现了,当我们访问localhost的时候,就相当于访问localhost:8080了。


正向代理和反向代理的区别

1.位置不同 

正向代理,架设在客户机和目标主机之间; 
反向代理,架设在服务器端;

2.代理对象不同 

正向代理,代理客户端,服务端不知道实际发起请求的客户端; 
反向代理,代理服务端,客户端不知道实际提供服务的服务端; 

3.用途不同 

正向代理,为在防火墙内的局域网客户端提供访问Internet的途径; 
反向代理,将防火墙后面的服务器提供给Internet访问;

4.安全性不同 

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务; 
反向代理都对外都是透明的,访问者并不知道自己访问的是哪一个代理。

正向代理和反向代理的选择

    正向代理是从客户端的角度出发,服务于特定用户(比如说一个局域网内的客户)以访问非特定的服务;反向代理正好与此相反,从服务端的角度出发,服务于非特定用户(通常是所有用户),已访问特定的服务。 

3、负载均衡

什么是负载均衡?

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

复杂均衡的简单代码实例

http {
: upstream myproject {
: server 127.0.0.1:8000 weight=3;
: server 127.0.0.1:8001 down ;
: server 127.0.0.1:8002 ;
: server 127.0.0.1:8003 weight=1;
: }
: server {
: listen 80;
: server_name www.test.com;
: location / {
: proxy_pass http://myproject;
: }
: }
}

把www.test.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。

   在需要使用负载的Server节点下添加
   proxy_pass http://myServer;
   upstream 每个设备的状态:
       down 表示单前的server暂时不参与负载 
       weight  默认为1.weight越大,负载的权重就越大。 
       max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
       fail_timeout:max_fails 次失败后,暂停的时间。 
       backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

1.RR (默认)

按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。

代码实例

    upstream test {
        server localhost:8080;
        server localhost:8081;
    }
    server {
        listen       81;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;
        location / {
            proxy_pass http://test;
            proxy_set_header Host $host:$server_port;
        }
    }

2.权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

代码实例

upstream test{
     server localhost:8080 weight=9;
     server localhost:8081 weight=1;

}

数字越大,表明请求到的机会越大,此时访问8080的访问比率是90%,访问8081的访问比率是10%。

3.ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
代码实例

upstream test{
   ip_hash;
   server localhost:8080 weight=9;
   server localhost:8081 weight=1;

}

4.fari(第三方) 
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
代码实例
upstream backend { 
    fair; 
    server localhost:8080;
    server localhost:8081;
}

5.url_hash(第三方) 
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
代码实例
upstream backend { 
    hash $request_uri; 
    hash_method crc32; 
    server localhost:8080;
    server localhost:8081;

以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。


4、HTTP服务器(包含动静分离)

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离。

1.静态资源服务器

代码实例

    server {
        listen       80;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;
        location / {
               root   e:wwwroot;
               index  index.html;
           }
    }

这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

2.动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。


5.虚拟主机

可以实现在一台服务器虚拟出多个网站。

虚拟主机的概念

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录。

nginx虚拟主机的配置

nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可。