nginx反向代理+keepalived

编译时要注意要安装upstream模块,但是默认是安装的,,所以编译可以用web服务的编译来编译。

反向代理

upstream backend {
	#ip_hash;保持会话,这个功能不是很好,这个可以查看本地图片
        server 192.168.222.140:80 max_fails=3 fail_timeout=30s;
	server 192.168.222.141:80 max_fails=3 fail_timeout=30s;
}

server {
    listen       80;
    server_name  www.etiantian.org;

    location / {
        proxy_pass http://backend;
    }
}

此时如果要域名解析,应该使用负载均衡服务器的ip ,域名是www.eitiantian.org,bbs.etiantian.org,blog.etiantian.org。

用户web服务器是多站点,多虚拟主机的情况下:

upstream backend {

    server 192.168.222.140:80 max_fails=3 fail_timeout=30s;
	server 192.168.222.141:80 max_fails=3 fail_timeout=30s;
}

server {
    listen       80;
    server_name  www.etiantian.org;

	location / {
	proxy_pass http://backend;
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	}
}
server {
    listen       80;
    server_name  bbs.etiantian.org;

	location / {
	proxy_pass http://backend;
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	}
}

一致性哈希算法对数据的存储是不均匀的,但可以最大限度的减少缓存的失效量。在大规模部署Memcached时,容灾和扩容一定要用一致性哈希算法,以确保在出现故障或容量问题时减小对数据库的影响。

当遇到缓存服务器时,,缓存不会存在一个服务器上,所以各个之间是不相互联系的,所以要固定每次访问的缓存服务器,而不是每次访问的服务器都不一样,,,所以ip_hash就体现了效果,所有的缓存服务器加载一起才是个整体。

二、Keepalived+nginx

前提需要关闭防火墙,,因为是内网,关闭没啥大碍,,,不关闭,,keepalived就无法检测对方是否存在

master配置-keepalived:

! Configuration File for keepalived

global_defs {
   notification_email {
   。。。。。。@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.0.0.1
   smtp_connect_timeout 30
   router_id LVS_7
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.222.143/24
    }
}

slave-keepalived配置:

! Configuration File for keepalived

global_defs {
   notification_email {
   。。。。。@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.0.0.1
   smtp_connect_timeout 30
   router_id LVS_2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.222.143/24
    }
}

MASTER 与slave的-nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    error_log logs/error.log error;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    include extra/upstream.conf;
}

master--extra/upstream

upstream backend {
        server 192.168.222.132:80 max_fails=3 fail_timeout=30s;
	server 106.14.124.164:80 max_fails=3 fail_timeout=30s;
}

server {
    listen       80;
    server_name  www.etiantian.org;

    location / {
        proxy_pass http://backend;
    }
}

================================================================================================================

用VIP来访问
master 192.168.222.130
slaver 192.168.222.131
realserver 1 192.168.222.132
realserver 2 192.168.222.133


模拟调试,关闭任意keepalived


PV低于2000万,可以选用NGINX做反向代理

LVS属于转发,,,NGINX是代理


大并发,简单转发,,LVS
大并发,功能要求复杂,根据URI转发,,LVS+NGINX
并发不大,NGINX/haproxy

=================================================================================================================

upstream模块
它支持的代理方式有 proxy_pass,fastcgi_pass,memecached_pass
proxy_pass:反向代理
fastcgi_pass:用于动态程序的交互
memecached_pass:与memcached交互

语法:

upstream backend {
    server backend1.example.com       weight=5;  //端口默认不加就是80,,后面是权重,跟LVS一样,越大,分配的可能性越多
    server backend2.example.com:8080;   //域名加端口
    server unix:/tmp/backend3;       //指定socket文件

    server backup1.example.com:8080   backup;    //备份服务器,等上面指定的服务器都不可以访问的时候会启用,backup的用法和haproxy中用法一样
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

参数:
1、本地图片有参数信息,upstream模块
max_fails=number
nginx尝试连接后端主机失败的次数,这个参数配合下面的三个参数:proxy_next_upstream, fastcgi_next_upstream, memcached_next_upstream
当请求失败后,不去提示用户,而是再去请求别的服务器。
当Nginx接收后端服务器返回这三个参数定义的状态码的时候,会将这个请求转发给正常工作的后端服务器,例如404,502,503
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

==================================================================================================================

upstream算法:
rr轮询(默认)
按客户端请求顺序把客户端的请求逐一分配到不同的后端的服务器,这相当于LVS中
的RR算法。

weight(权重)
在轮询算法的基础上加上权重(默认是rr+weight),权重越大,转发的请求也就越多。

ip_hash
每个请求按访问的IP 的hash结果分配,当新的请求到达时,先将其客户端ip通过哈希算法哈希出一个值,在随后请求客户端,ip的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页session共享问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡。在国内所有的公司都是NAT上网,多个PC对应一个外部ip。
提示:必须是最前端的服务器,后端也必须直接应用服务器多数情况不能和权重参数一起使用。

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}

注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup

fair
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。

url_hash
按照url的hash结果来分配请求,让每个url定向到同一个后端服务器,后端服务器为缓存服务器时效果显著。。。。提高后端缓存服务器的命中率。

upstream backend {
    
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
	hash $request_uri;
	hash_method crc32;
}

least_conn
最少连接数,哪个节气连接数少就少分发。

 

淘宝的服务器的一致性哈希算法。
http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html

================================================================================================================

location的正则表达式

=   精确匹配,如果找到匹配=号的内容,立即停止搜索,并立即处理请求(优先级最高)
~   区分大小写
~*  不区分大小写
^~  只匹配字符串,不匹配正则表达式
@   指定一个命名的location,一般只用于内部重定向请求。

Let’s illustrate the above by an example:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.

http_proxy_module

proxy_pass指令,将请求转发到另一台服务器。

location / {
error_page 404 = @fallback;
}

location @fallback {
proxy_pass http://backend;
}

  

http_proxy模块参数,,,nginx的代理功能是通过http proxy模块来实现的,默认在安装nginx时已经安装了http_proxy模块,因此可以直接使用http proxy模块
本地有图片,,http proxy 模块参数
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header

特殊的参数:
proxy_set_header 设置由后端的服务器获取用户的主机名或者真实ip地址,以及代理者的真实ip地址。


proxy_set_header Host $host 当后端WEB服务器上也配置有多个虚拟主机时,需要用该Header来区分反向代理哪个主机名。
上述的可以实现,在负载均衡器上配,,有负载均衡器向后端请求

proxy_set_header X-Forwarded-For $remote_addr 如果后端WEB服务器上的程序需要获取用户ip,从该Header头获取。
rs节点的nginx.conf配置:
log_format commonlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
要看客户的ip,不知加参数,还要将日志格式修改。

 

 

根据url中的目录地址实现代理转发

upstream static_pools {
         server 10.0.0.6:80  weight=5;
}
upstream dynamic_pools {
         server 10.0.0.8:80  weight=5;
}

server {
       listen       80;
       server_name  blog.etiantian.org;
       location / {
        proxy_pass  http://dynamic_pools;
        include extra/proxy.conf;
       }

       location /static/ { 
        proxy_pass  http://static_pools;
        include extra/proxy.conf;
       }

       location /dynamic/ { 
        proxy_pass  http://dynamic_pools;
        include extra/proxy.conf;
       }
        access_log off;
     }

根据用户请求的user_agent向后转发对应的服务器。,,手机浏览跟pc浏览

server {
       listen       80;
       server_name  blog.etiantian.org;
       location / {
        if ($http_user_agent ~* "android")
		  {
			proxy_pass  http://dynamic_pools;
		  }
        if ($http_user_agent ~* "iphone")
          {
            proxy_pass  http://static_pools;
            }
        proxy_pass  http://dynamic_pools;
        include extra/proxy.conf;
       }

        access_log off;
     }

 

 

health_ceck

补充,健康检查

 

posted @ 2017-09-29 17:21  JvvYou  阅读(446)  评论(0编辑  收藏  举报