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