zoukankan      html  css  js  c++  java
  • Nginx负载均衡

    负载均衡(做分发服器)
    1、基于浏览器的分发
    基于浏览器的分发,按照在不同平台的浏览器请求进行分发,比如手机浏览器讲究资源小速度快节省流量,所以将自手机浏览器的请求分发到专供处理移动平台的web服务器上,而在PC上浏览网页注重体验,所以将来自IE浏览器的请求分发到专供处理PC平台的服务器上,这样可以使在不同平台的用户都能得到适合自己的体验!
    添加多个upstream
    vim /usr/local/nginx/conf/nginx.conf

    upstream web {
        ip_hash;
        server 192.168.1.10
    }
    upstream apache {
        ip_hash;
        server 192.168.1.11
    }
    
    // 在定义server的时进行location规则判断
    
    server {
        listen 80;
        server_name 192.168.1.100; // (分发主机)
        location / {
            if ($http_user_agent~ * Elinks) {
                proxy_pass http : //web; 来自Elinks浏览器的请求,交给web来处理
            }
            if ($http_user_agent~ * Mozilla) {
                proxy_pass http : //apache;  来自Mozilla类型的浏览器的请求,交给apache处理,IE和火狐都属于Mozilla
            }
        }
    }

    2、基于开发语言的分发
    这里开发语言环境的部署,祥看我这篇文章“http://cuimk.blog.51cto.com/6649029/1335770”
    常见开发语言的后缀aspaspx php jsp html,为了将不同语言开发的程序交给特定的语言环境来执行,同样可以实现Nginx的location规则来实现
    同样定义server时进行location规则判断

    location~ *   .php$ {
        proxy_pass http : //192.168.1.250; #访问php结尾的,分发到250
    }
    location~ *   .jsp$ {
        proxy_pass http : //192.168.1.251;  #访问jsp结尾的,分发到251
    }
    location / {
        root html
        index index.html; // 访问其他的,请求本机
    }

    3、基于源地址的分发
    像联通移动的网站,进去之后可以看到,你所进入的页面是你所在城市的页面,里面的信息很多是你当地退出的一些活动,这就是他们根绝你的IP地址来得知你当前所在位置,然后将请求分发到对应的服务器所实现的。
    首先Nginx需要geoip模块,故编译添加
    1 ./configure–with-http_geoip_module

    首先定义多个upstream

    upstream bj.server {
        ip_hash;
        server 192.168.1.251 //定义bj的IP访问的服务器
    }
    upstream sh.server {
        ip_hash;
        server192.168.1.251 //定义sh的IP访问的服务器
    }
    upstream default.server {
        ip_hash;
        server 192.168.1.100 //定义其他地区访问的服务器
    }
    
    //定义一个IP库
    
    geo$geo {
    defaultdefault;
        192.168.18.0 / 24bj;
        192.168.17.0 / 24sh; //定义bj和sh的IP段
    }
    
    //在server里添加loscation规则
    
    123 location / {
        proxy_pass http : //$geo.server$request_uri
    }

    这样会对不同的IP匹配IP库,看其属于哪个地区,然后在有针对性的将请求分发

    4、基本IP轮询分发
    配置十分简单,以两台RS做实验
    将RS定义在一个upstream内

    vim /usr/local/nginx/conf/nginx.conf

    upstream web {
        ip_hash;
        server 192.168.18.250;
        server 192.168.18.251; //两台RS
    }
    
    //在定义server的时候来指定其访问的模块,有多台机器的会默认轮询访问,当然可以自定义访问权重。
    
    server {
        listen 80; //监听80端口
        server_name localhost; //域名
        location / {
            proxy_pass http : //web;      //协议,模块名
        }
    }

    我在定义upstream的时候都添加了一句“ip_hash;”这里是算法,使用ip哈希的算法,让来自同一台的清楚只交给后端同一台RS来处理.
    配置限速
    限速也是通过location规则实现的

    首先需要在http里指定最大带宽(比如说是10M)

    limit_zoneone $binary_remote_addr    10M;

    然后在server添加location规则

    location / {
        root html;
        index index.html index.htm;
        limit_rate 10k; //限速多少
        limit_rate_after 100k; //下载多少的时候开始限速
        limit_connone 2; //同一IP同时只能下载两个
    }

    防盗链配置

    防盗链原理也是通过location规则实现的
    1、指定文件的防盗链

    location~ * .(gif | jpg | png | swf | flv)$ { //针对哪些文件格式进行防盗链
        root / usr / local / nginx / html;
        valid_referersnone blocked baidu.com; //只允许baidu连接
        if ($invalid_referer) {
            rewrite^ / http : //www.linuxidc.com/retrun.html; //盗链访问重定向到的地址
            return 403;
        }
    }

    第一行:gif|jpg|png|swf|flv 
    表示对gif、jpg、png、swf、flv后缀的文件实行防盗链 
    第二行: 表示对www.88181.com这2个来路进行判断 
    if{}里面内容的意思是,如果来路不是指定来路就跳转到http://www.linuxidc.com/retrun.html页面,当然直接返回403也是可以的。 
     

    2、针对目录防止盗链

    12345 location / images / {
        alias / data / images / ;
        valid_referers none blocked server_names * .xok.la xok.la;
        if ($invalid_referer) {
            return403;
        }
    }

     

    3. 通过ngx_http_accesskey_module模块实现防盗链,比较少用
    实现方法如下:
    1. 下载NginxHttpAccessKeyModule模块文件:Nginx-accesskey-2.0.3.tar.gz;
    2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的”$HTTP_ACCESSKEY_MODULE”为”ngx_http_accesskey_module”;
    3. 用一下参数重新编译nginx:
    ./configure --add-module=path/to/nginx-accesskey
    4. 修改nginx的conf文件,添加以下几行:

    location / download {
        accesskey on;
        accesskey_hashmethod md5;
        accesskey_arg "key";
        accesskey_signature "mypass$remote_addr";
    }


    其中:
    accesskey为模块开关;
    accesskey_hashmethod为加密方式MD5或者SHA-1;
    accesskey_arg为url中的关键字参数;
    accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。


    访问测试脚本download.php:
    <?
    $ipkey= md5("mypass".$_SERVER['REMOTE_ADDR']);
    $output_add_key="<a href=http://www.linuxidc.com/download/G3200507120520LM.rar?key=".$ipkey.">download_add_key</a><br />";
    $output_org_url="<a href=http://www.linuxidc.com/download/G3200507120520LM.rar>download_org_path</a><br />";
    echo $output_add_key;
    echo $output_org_url;
    ?>
    访问第一个download_add_key链接可以正常下载,第二个链接download_org_path会返回403 Forbidden错误。


    他的运行方式是:如我的download 目录下有一个 file.zip 的文件。对应的URI 是http://www.linuxidc.com/download/file.zip
    使用ngx_http_accesskey_module 模块后http://www.linuxidc.com/download/file.zip?key=09093abeac094. 只有给定的key值正确了,才能够下载download目录下的file.zip。而且 key 值是根据用户的IP有关的,这样就可以避免被盗链了。

    example:

    upstream nodejs{
        server 192.168.189.131:3000;
        server 192.168.189.133:80;
    }
    
    server {
        listen       80;
        server_name  localhost;
    
    
        location / {
            proxy_pass  http://nodejs;
     
            #Proxy Settings
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
            #root   /usr/share/nginx/html;
            #index  index.html index.htm;
        }
    ....
    ....
    }
  • 相关阅读:
    error in ./src/views/demo/ueditor.vue Module build failed: Error: Cannot find module 'node-sass' Require stack:
    Spring Cloud Stream 定时任务消息延迟队列
    项目结构介绍
    Java面试题
    SpringBoot中用SpringSecurity实现用户登录并返回其拥有哪些角色
    MySQL索引优化
    MySQL中的执行计划explain
    SpringBoot之单体应用
    SpringBoot之SSM多模块应用
    Spring-aop面向切面编程笔记
  • 原文地址:https://www.cnblogs.com/mahatmasmile/p/5526179.html
Copyright © 2011-2022 走看看