• linux运维、架构之路-Nginx反向代理


    一、 Nginx负载均衡和反向代理知识

    1、集群概念

            一堆服务器合作做同一件事,这些机器可能需要整个技术团队架构、设计和统一协调管理,这些机器可以分布在一个机房,也可以分布在全国各个地区的多个机房。

    2、集群作用

    ①提高网站处理用户请求能力

    ②提高网站稳定运行高可用性

    3、集群分类

    ①高可用集群HA

    ②负载均衡集群LB

    1)硬件实现负载

    F5硬件设备

    A10硬件设备

    2)软件实现负载

    Nginx(7层,1.9版本之后也支持4层负载)

    LVS(4层)

    Haproxy(4、7层)

    说明: 所谓四层就是基于IP+端口的负载均衡;七层就是基于URL等应用层信息的负载均衡

    4、负载均衡与反向代理对比

    负载均衡

    反向代理

    对用户的访问请求进行调试管理

    接收用户请求代替用户向后端访问

    对用户的访问请求进行压力分担

    5、反向代理与数据转发区别

    二、反向代理部署

    1、快速部署

    useradd -s /sbin/nologin -M www
    mkdir -p /server/tools/
    cd /server/tools/
    wget http://nginx.org/download/nginx-1.10.3.tar.gz
    tar xf nginx-1.10.3.tar.gz
    yum install pcre-devel openssl-devel -y
    cd /server/tools/nginx-1.10.3
    ./configure --prefix=/application/nginx-1.10.3 --user=www --group=www  --with-http_stub_status_module  --with-http_ssl_module
    make && make install
    ln -s /application/nginx-1.10.3/ /application/nginx
    ln -s /application/nginx/sbin/nginx  /usr/local/sbin/
    nginx
    lsof -i:80

    2、 统一编写nginx配置(web01,web02)

    worker_processes  3;
    error_log logs/error.log error;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        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;
        include extra/www.conf;
        include extra/blog.conf;
        include extra/bbs.conf;
        include extra/status.conf;
    }

    3、统一两台web服务器测试环境

    ①web01

    [root@web01 html]# cat {www,bbs}/index.html
    10.0.0.8 www
    10.0.0.8 bbs

    ②web02

    [root@web02 html]# cat {www,bbs}/index.html
    10.0.0.7 www
    10.0.0.7 bbs

    4、编辑nginx.conf配置文件实现负载功能(lb01)

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;                   
        upstream server_pools {
            server 10.0.0.7:80;
            server 10.0.0.8:80;
        } 
        server {
            listen 80;
    server_name bbs.etiantian.org;
            location / {
                proxy_pass http://server_pools;
                proxy_set_header host $host;
            }
        }
        server {
            listen 80;
    server_name www.etiantian.org;
            location / {
                proxy_pass http://server_pools;
                proxy_set_header host $host;
            }
        }
    }
    注:主要应用到nginx的
    ngx_http_upstream_module,官方例子
    upstream backend {
        server backend1.example.com       weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
    
        server backup1.example.com:8080   backup;
        server backup2.example.com:8080   backup;
    }
    
    server {
        location / {
            proxy_pass http://backend;
        }
    }

    5、浏览器测试或linux下进行web服务

    [root@lb01 conf]# curl www.etiantian.org
    10.0.0.7 www
    [root@lb01 conf]# curl www.etiantian.org
    10.0.0.8 www
    [root@lb01 conf]# curl bbs.etiantian.org
    10.0.0.7 bbs
    [root@lb01 conf]# curl bbs.etiantian.org
    10.0.0.8 bbs
    注:浏览器测试之前,重启nginx服务程序(lb01 web01 web02)

    6、upstream参数说明

    upstream模块内参数

    参数说明

    server 10.0.0.8:80

    负载均衡后面的RS配置,可以是IP或域名,默认80端口,高并发场景下,IP可换成域名,通过DNS做负载均衡

    weigth=1

    代表服务器的权重,默认值是1,权重数字越大表示接受的请求比例越大

    max_fails=5

    尝试连接后端主机失败的次数,这个值是配合proxy_net_upstream、fastcgi_next_upstream和memached_net_upstream这三个参数使用,当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503、Max_fails的默认值是1;企业场景下建议2-3次

    fail_timeout=10s

    在max_fails定义的失败次数后,距离下次检查的间隔时间,默认是10s,如果max_fails是5,就检测5次,如果5次都是502,那么会根据fail_timeout的值,等待10s再去检查,还是只检查一次,如果持续502,在不重新加载nginx配置的情况下,每隔10s都只检查一次,常规业务2~3秒比较合理

    backup

    热备配置(RS节点高可用),当前面RS都失败后会自动启用热备RS,这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求,注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup

    down

    这标志着服务器永远不可用,这个参数可配合ip_hash使用,类似注释效果

    7、调度算法

    rr

    定义轮询调度算法,默认调度算法

    wrr

    定义权重调度算法

    ip_hash

    定义静态调度算法

    least_conn

    定义最小的连接数

    三、Nginx反向代理

    1、记录用户访问真实IP地址

    cat nging.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;                                  
        upstream server_pools {
            server 10.0.0.7:80;
            server 10.0.0.8:80;
        } 
        server {
            listen 80;
           server_name bbs.etiantian.org;
            location / {
               proxy_pass http://server_pools;
               proxy_set_header Host $host;
               proxy_set_header X-Forwarded-For $remote_addr;#此模块记录用户访问真实地址
            }
           }
       server {
            listen 80;
           server_name www.etiantian.org;
            location / {
               proxy_pass http://server_pools;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
        }
     }
    }

    2、Nginx反向代理参数

    Nginx反向代理重要参数

    参数说明

    proxy_pass http://server_pools;

    通过proxy_pass功能把用户的请求转向反向代理定义的upstream服务器池

    proxy_set_header Host $host

    在代理向后端服务器发送的http请求头中加入host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机,这是节点服务器多虚拟主时的关键配置。

    proxy_set_header X-Forwarded-For $remote_addr;

    在代理向后端服务器发送的http请求头中加入X-Forward-For字段信息,用于后端服务器程序、日志等接收记录真实用户的ip,而不是代理服务器的IP,这是反向代理时,节点服务器获取用户真实IP的必要功能配置

    四、企业案例:动静分离

    1、配置多个upstream实现uri转发

    /upload

    10.0.0.8:80

    html/www/upload

    upload服务器

    /static

    10.0.0.7:80

    html/www/static

    static静态服务器

    /

    10.0.0.9:80

    html/www

    默认

     2、调用多个upstream

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';                      
        upstream upload_pools {
          server 10.0.0.8:80;
        }
    
        upstream static_pools {
          server 10.0.0.7:80;
        }
    
        upstream default_pools {
          server 10.0.0.9:80;
        }
    server { listen
    80; server_name www.etiantian.org; location /static/ { proxy_pass http://static_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /upload/ { proxy_pass http://upload_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location / { proxy_pass http://default_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log logs/access_www.log main; } }

    3、模拟环境

    ①web01

    mkdir -p /application/nginx/html/www/upload
    echo  "web01 upload" >/application/nginx/html/www/upload/nana.html

    ②web02

    mkdir -p /application/nginx/html/www/static
    echo  "web02 static" >/application/nginx/html/www/static/nana.html 

    ③web02

    mkdir /application/nginx/html/www -p
    echo  "web03 default" >/application/nginx/html/www/nana.html

    ④测试

    curl -H host:www.etiantian.org 10.0.0.9/upload/nana.html
    curl -H host:www.etiantian.org 10.0.0.8/upload/nana.html
    curl -H host:www.etiantian.org 10.0.0.7/static/nana.html

    4、Wireshark抓包分析

    ①web01

    ②web02

    ③web03

    5、根据用户不同的浏览器,客户端进行转发

    不同的客户端 访问不同的网站,手机和电脑 访问相同的网站----结果不同 
    > GET / HTTP/1.1
    > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
    > Host: www.baidu.com
    > Accept: */*
    User-Agent-------的内容-----nginx有一个变量$http_user_agent

    负载均衡配置nginx.conf

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
                                        
        upstream upload_pools {
          server 10.0.0.8:80;
        }
        upstream static_pools {
          server 10.0.0.7:80;
        }
    
        upstream default_pools {
          server 10.0.0.9:80;
        }
    
        server {
            listen 80;
            server_name www.etiantian.org;
            location / {
             if ($http_user_agent ~* "MSIE")
              {
                proxy_pass http://static_pools;
              }
             if ($http_user_agent ~* "Chrome")
              {
                proxy_pass http://upload_pools;
              }
            proxy_pass http://default_pools;
                   }
             access_log  logs/access_www.log  main;
        }
    }

    linux中测试

    [root@lb01 ~]# curl -A "iphone"  www.etiantian.org/nana.html
    www web01
    [root@lb01 ~]# curl -A "android"  www.etiantian.org/nana.html
    www web02
    [root@lb01 ~]# curl -A "asdasdasd"  www.etiantian.org/nana.html
    web03 default
    成功最有效的方法就是向有经验的人学习!
  • 相关阅读:
    Windows下PHP开启mcrypt扩展和SSL(OpenSSL)扩展支持
    MyBatis 学习笔记
    试用百度云计算平台
    TCP三次握手及四次挥手详细图解
    Java开发中的23种设计模式详解
    Extjs4.1.0_从入门到精通
    SQLite3命令操作大全
    带你了解 HBase 数据模型和 HBase 架构
    让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!
    论文阅读丨神经清洁: 神经网络中的后门攻击识别与缓解
  • 原文地址:https://www.cnblogs.com/yanxinjiang/p/7597070.html
Copyright © 2020-2023  润新知