美文网首页
Nginx代理服务,负载均衡,缓存服务

Nginx代理服务,负载均衡,缓存服务

作者: candy252324 | 来源:发表于2018-08-28 16:19 被阅读0次

    一、正向代理和反向代理

    正向代理.png
    正向代理的对象是客户端,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端。常见情景如:翻墙。 反向代理.png

    反向代理的对象是服务端,客户端是无感知代理的存在的,运行方式是:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

    (1) proxy_pass模块配置语法

    Syntax:proxy_pass URL;
    Default:--;
    Context:location, if in location,limit_except;

    (2)反向代理配置示例
    server {
      listen  80;
      server_name candy.com;
      location / test_proxy.html$ {
        proxy_pass http://127.0.0.1:8080;
      }
      ...
    }
    

    假设域名candy.com8080端口不对外开放,那么直接访问http://www.candy.com:8080/test_proxy.html将访问不到。通过以上配置,当访问http://www.candy.com/test_proxy.html时(不写端口则默认80端口),服务器将会去请求http://127.0.0.1:8080,可成功访问。

    二、负载均衡

    nginx是7层负载均衡的SLB(Server Load Balance)

    (1) 配置语法

    Syntax: upstream name { ... }
    Default: --
    Context:http

    (2)最简单的轮询演示示例
    • 步骤一,创建html文件

    vi /opt/app/code1/index.html并写入以下内容,同理创建code2, code3。

    <!--  code1/index.html -->
    <html>
      <body> server 1</body>
    </html>
    
    • 步骤二,创建配置文件
      vi /etc/nginx/conf.d/server1.conf 创建server1.conf 配置文件,并写入以下内容,同理创建server2.conf,server3.conf
    // server1.conf
    server {
       listen 8001;
       access_log  /var/log/nginx/log/server1.access.log  main;
       location / {
          root /opt/app/code1;
          index index.html index.htm;
       }
    
    }
    
    • 步骤三, 创建负载均衡配置文件
      vi /etc/nginx/conf.d/upstream_test.conf 创建 upstream_test.conf配置文件,并写入以下内容:
    upstream_test.conf配置文件.png

    配置释义:
    upstream 后接该组虚拟服务的名字(自定义的),里面的每一个server可以是ip、域名或是socket。location 中的proxy_pass 后接希望分配给的虚拟服务名称。
    所有访问server_name(此处设为 localhost)的请求都将以轮询的方式分配给upstream的三个server。

    此时的/etc/nginx/conf.d/目录中有四个配置文件:

    四个配置文件.png
    • 步骤四,查看负载均衡的轮询效果
      多次刷新,发现请求是以轮询的方式分配到upstream的三个server中。


      轮询效果.png
    (3) 负载均衡调度算法
    调度算法.png
    • 加权轮询配置示例
    upstream candy {
       server 192.168.122.1:8081 weight=5;
       server 192.168.122.1:8082 ;
       server 192.168.122.1:8083;
    }
    ...
    

    如上配置server8081的权重为5,则当有7次请求时,会有5次分配给server8081;

    • ip_hash配置示例
    upstream candy {
       ip_hash;
       server 192.168.122.1:8081;
       server 192.168.122.1:8082 ;
       server 192.168.122.1:8083;
    }
    ...
    

    由于ip_hash是基于remote_addr(客户端ip)进行分配,故而来自同一个ip的请求将固定分配给某一服务器。
    ip_hash缺陷:由于ip_hash是基于remote_addr进行分配,而remote_addr不一定是真实的客户端ip(如存在代理的情况下),故而有了基于url_hash的配置方法。

    • url_hash 配置语法

    Syntax:hash key [consistent];
    Default:--
    Context:upstream
    注:This directive appeared in version 1.7.2

    url_hash 配置示例:

    upstream candy {
       hash $request_uri;
       server 192.168.122.1:8081;
       server 192.168.122.1:8082 ;
       server 192.168.122.1:8083;
    }
    ...
    

    通常,$request_uri中会有很多内容,如果想针对uri中的某一个值来做配置,只要加一行判断语句,把对应值用正则表达式提取出来,再将自定义变量进行hash即可。

    (4) 其它配置参数
    参数配置.png

    配置示例:

    upstream candy {
       server 192.168.122.1:8081 down;
       server 192.168.122.1:8082 backup;
       server 192.168.122.1:8083 max_fails=1 fail_timeout=12s;
    }
    server {
      location / {
        proxy_pass http://candy;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      }
    }
    ...
    

    按照以上配置,server8081不提供服务,server8082是备用服务器,只有server8083能访问,且server8083设置了max_fails=1fail_timeout=10s,意思是说,server8083允许的最大连接失败次数是1,超过这个次数,则服务暂停,暂停时间为12s(默认为10s)。
    如果server8003的服务挂掉了,那么备用服务器server8082将自动启用,可以通过设置iptable规则来模拟这个过程: 执行iptables -I INPUT -p tcp --dport 8083 -j DROP 把所有访问8083的请求都drop掉(即不对外提供8083端口的服务),此时server8082将自动启用。
    proxy_next_upstream :如果服务器发生错误,如发生500,502等,则跳过该服务器,去访问其它服务器。

    三、Nginx作为缓存服务

    缓存类型:服务端缓存(缓存在服务器),代理缓存(缓存在Nginx),客户端缓存(缓存在浏览器)

    (1)配置语法

    proxy_cache配置语法

    Syntax:proxy_cache zone | off;
    Default:proxy_cache off;
    Context:http,server,location;

    缓存过期周期配置语法:

    Syntax:proxy_cache_valid [code...] time;
    Default:--;
    Context:http,server,location;

    缓存维度配置语法:

    Syntax:proxy_cache_key string;
    Default:proxy_cache_key $scheme$proxy_host$request_uri;
    Context:http,server,location;

    (2) 实例演示

    将负载均衡中的最简单的轮询实例中的代码稍作修改做演示:

    • 步骤一:
      将文件/etc/nginx/conf.d/upstream_test.conf 更名为 cache_test.conf;
      并做如下配置:
      JPY94LI_I2~IZ~5OM{L(U6W.png

    配置释意:
    proxy_cache_path:缓存目录;
    levels:缓存目录按照两层目录的方式进行分级
    keys_zone=candy_cache:10m:开辟名为candy_cache的缓存空间,大小为10m(一般1m可以存放8000个key);
    max_size=10g: 控制缓存目录最大为10G, 若存满了,则nginx会触发自己的淘汰规则,把不常访问的淘汰掉;
    inactive=60m:清除60分钟之内未被访问到的缓存文件;
    use_temp_path:建议关闭,用于存放临时文件,打开的话需要另外建立一个目录来存储,对性能有影响;
    proxy_cache_valid:对于头信息为200和300的缓存过期时间为12小时,除了200和304外的,10分钟过期;
    proxy_cache_key: 需要缓存的key;
    add_header : 增名称为Nginx-Cache加的头信息;
    proxy_next_upstream :如果服务器发生错误,如发生500,502等,则跳过该服务器,去访问另其它服务器。

    • 步骤二
      打开浏览器,发现刷新后页面不再轮询变化,Nginx-Cache 头信息也被成功写入。


      缓存效果.png
    (3)如何让部分页面不缓存

    vi /etc/nginx/conf.d/cache_test.conf 修改配置文件:

    不缓存配置.png

    释意:uri中凡是以 login,register,password开头,或包含reset的,创建自定义变量 $cookie_nocache,值为1,而在proxy_no_cache $cookie_nocache $arg_nocache $arg_comment 此链式中,只要有一个,$cookie_nocache$arg_nocache$arg_comment只要有一个变量的值为1,则该uri不会被缓存。

    相关文章

      网友评论

          本文标题:Nginx代理服务,负载均衡,缓存服务

          本文链接:https://www.haomeiwen.com/subject/yccziftx.html