Nginx七层反向代理和负载均衡

1.介绍

1.1 Nginx不仅是一个出色的web软件,其七层代理和负载均衡也是相当出色。Nginx做前端代理,当用户请求服务时,可以根据url进行判断,然后分配到不同的后台webserver上。

1.2 Nginx的负载均衡实现原理:首先在http模块中配置使用upstream模块定义后台的web server的池子,名为proxy-web,在池子中我们可以添加多台后台webserver,其中状态检查、调度算法都是在池子中配置;然后在serverr模块中定义虚拟主机,但是这个虚拟主机不指定自己的web目录站点,它将使用location匹配url然后转发到上面定义好的web池子中,最后根据调度策略再转发到后台web server上

2.负载均衡配置项的介绍

2.1 upstream调度算法介绍

(1)rr轮询(默认)

按照请求顺序分配到每个RS,和lvs中的rr算法一样,如果RS宕机,会自动剔除,默认情况下只检测80端口,如果RS报402、403、503、504错误,会直接返回给客户端。

(2)weight(权重)

在rr的基础上再加上权重(默认是rr+weight),权重轮询和访问成正比,值越大分配的越多,可以根据服务器的配置设置权重,可以解决服务器性能不均进行请求分配的问题

(3)ip_hash

解决动态网页session共享问题

每个访问请求按照IP地址的hash值进行分配,ip的hash值只要相同就会被分配到同一台服务器上(lvs负载均衡的-p参数,keepalived配置里的persistence_timeout50),该调度算法可以解决动态网页session共享问题,但有时会导致请求分配不均,

提示:由于国内用的都是nat模式,所以hash不适合使用

ip_hash不能和其他的算法一块使用,即不能使weight或backup

(4)fair(第三方)

按照后端服务器的响应时间来配置,响应时间短的优先分配,比上面的都更智能,此种算法可以按照页面大小和加载时间长短智能的进行负载均衡,nginx本身不支持fair,需要下载nginx的upstrea_fair模块

(5)url_hash(第三方)

主要应用于缓存服务器上

按照访问的url来分配请求,让相同的url定向到同一个服务器,后端服务器为缓存服务器的时候效果更显著,在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

缺点:如果有一台机器宕机了,那就苦了,consistent_hash可以解决这个问题

可以提高后端缓存服务器的效率,nginx本身不支持url_hash的,需要下载hash软件

(6)least_conn

最少连接数,哪个连接少就分配到哪台设备

(7)consistent_hash

一致性算法

2.2 upstream健康检查配置介绍

upstream proxy_nginx {

server 192.168.0.254 weight=1max_fails=2 fail_timeout=10s ;

server 192.168.0.253 weight=2 max_fails=2fail_timeout=10s;

server192.168.0.252 backup;

server192.168.0.251  down;

}

server 192.168.0.254 : 后台RS,可以是域名或IP,默认是80端口,也可加上:80指定

wight = 1 权重比 默认是1

max_fails=2 健康检查的最大失败次数,超过此次数表示该RS不可用,默认是1,0表示禁止失败尝试。生产环境一般设置2~3次

fail_timeout=10s  失败的超时时间,默认是10s

backup  热备配置,当前面的RS全部不可用时自动启动

down  表示该服务永远不可用

注意:max_fails设置的越低用户体验越好,但是设置低了也有个缺点,就是proxy可能会误判RS的状态,而且RS越少误判的几率越大,误判会对业务产生巨大影响,当RS的数量比较少时建议将该值设置的大点。

2.3 location指令的用法介绍

Location主要用来匹配url,如:http://www.beyond.com/nice,在这里对于location来说www.beyond.com是域名,/nice才是url。

对于url的匹配,可以使用字符串或者正则表达式,但如果是正则表达式,必须指定前缀,location指令来匹配不同的url,匹配成功后应用不同的配置

语法:location [=|~|~*|^~|@]/url {…..}

[=]精确匹配,如果找到匹配等号的内容,立即停止搜索,并立即处理请求(优先级最高)

[~]区分大小写

[^~]只匹配字符串,不匹配正则表达式

[~*]不区分大小写

[@]指定一个命名的location,一般只应用于内部重定向请求,location @name {···}

示例:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.liyunlong.com;
#No.1
        location / {
                return  502;
        }
#No.3
        location ~* \.jpg$ {
                return 403;
        }
#No.4
        location ^~ /a/ {
                return 402;
        }
#No.5
        location /a/1.jpg {
                return 401;
        }
#No.6
        location = /a/.jpg {
                return 400;
        }
}
}

小结:

    1、等号优先级最高,工作中尽量把等号匹配的放在前边

    2、~* \.jpg$优先级第二

    3、^~ /a/优先级第三

2.4 proxy模块的介绍

Nginx转发模块是ngx_http_proxy_module,默认安装,可以直接使用

Proxy_pass此指令用于转发location匹配到的url到serve池子中。

参数:

proxy_set_header    让proxy获取RS的head(虚拟主机名字)

client_body_buffer_size客户端请求缓存大小,可以理解为先保存本地在传给用户

proxy_connect_timeout   与RS链接超时的时间

proxy_send_timeout  RS回传数据的时间,必须在这个时间段内传完,否则断开连接

proxy_read_timeout  等待RS响应的时间,标明连接已经成功,正在排队

proxy_buffer_size   缓存区大小,默认等于指令proxy_buffers设置的大小

proxy_buffers   缓冲区的数量和大小,从RS获取的响应信息会放置到缓冲区

proxy_busy_buffers_size系统很忙时可以使用的proxy_buffers大小,官方推荐的大小是proxy_buffers的两倍

proxy_temp_file_write_size  缓存临时文件的大小

proxy_set_headerhost $host当RS有多个虚拟主机的时候需要逐个指定

proxy_set_headerX-Forwarded-For $remote_addr   开启负载均衡器转发真实客户的IP地址给RS.

注意:

“proxy_set_header”当我们的RS有多个虚拟主机(相同的ip,相同的端口)的时候如www、bbs、blog,代理服务器怎么知道将请求发到哪呢,这个时候nginx代理就会查找proxy_set_header参数,将请求发送到相应域名的虚拟主机上。

3.nginx负载均衡配置案例

1.有三个域名:www.beyond.com bbs.beyond.com film.beyond.com,四台webserver负责提供服务

2.有一个mailserver和cloud server在一台服务器上

规划:

web1  192.168.254.251    BBS、film

web2  192.168.254.252     BBS、film

web3  192.168.254.253       BBS、film

web4  192.168.254.254     www,负载均衡器

web5  192.168.254.250      mail   cloud

说明:web4是负载均衡器,同时也负责解析www站点。web1、web2、web3负责解析bbs和film站点。Mail和cloud在同一台设备上,也是web站点

Nginx的安装略了

现在列出web4的nginx的配置文件供参考

nginx.conf:

http {
    include       mime.types;
    default_type application/octet-stream;
     server_tokens off;
     sendfile        on;
     tcp_nopush        on;
     keepalive_timeout  65;
     fastcgi_connect_timeout 300;
     fastcgi_send_timeout    300;
     fastcgi_read_timeout    300;
     client_header_buffer_size     32k;
     large_client_header_buffers 4 128k;
      client_max_body_size 10m;
     gzip  on;
     gzip_min_length  1k;
     gzip_buffers     4 8k;
     gzip_http_version 1.1;
     gzip_comp_level 6;
     gzip_vary on;
     gzip_types       text/javascripttext/plain application/x-javascript text/css application/xml;
   log_format  main  ‘ $http_host $http_x_forwarded_for${request_time}s [$time_local] "$request" $status $body_bytes_sent$http_referer $http_user_agent $remote_addr‘;
 
       includevhosts/*.conf;                 #每个虚拟主机一个配置文件
       includeupstream.conf;                       #存放web的后台server
        fastcgi_intercept_errors on;
}

Vhosts/{bbs,film,www,cloud,mail}.conf:

 server {
       listen       80;
       server_name  bbs.beyond.com;
       index index.php;
       location  / {
       proxy_pass  http://web;
       proxy_set_header host $host;
       proxy_set_header X-Forwarded-For $remote_addr;
       client_body_buffer_size   4K;
       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;
 
}
    }
 
 server {
       listen       80;
       server_name  cloud.beyond.com;
       index index.php;
       location  / {
       proxy_pass http://192.168.254.250:8000;
       proxy_set_header host $host;
       proxy_set_header X-Forwarded-For $remote_addr;
       client_body_buffer_size   4K;
       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;
 
}
    }
 
 server {
       listen       80;
       server_name  film.beyond.com;
       index index.php;
       location  / {
       proxy_pass  http://web;
       proxy_set_header host $host;
       proxy_set_header X-Forwarded-For $remote_addr;
       client_body_buffer_size   4K;
       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;
 
}
    }
 
 server {
       listen       80;
       server_name  mail.beyond.com;
       index index.php;
       location  / {
       proxy_pass  http://192.168.254.250:80;
       proxy_set_header host $host;
       proxy_set_header X-Forwarded-For $remote_addr;
       client_body_buffer_size   4K;
       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;
 
}
    }
 
 server {
       listen       80;
       server_name  monitor.beyond.com;
       index index.php;
       location  / {
       proxy_pass http://192.168.254.220;
       proxy_set_header host $host;
       proxy_set_header X-Forwarded-For $remote_addr;
       client_body_buffer_size   4K;
       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;
 
}
    }
 
 server {
       listen       80;
       server_name  www.beyond.com;
       root /usr/local/nginx/html/www;
       index index.html;
       access_log logs/current/www.beyond.com-access.log main;
       error_log logs/current/www.beyond.com-error.log;
        error_page   500 501 502 503504  /error/5-error.html;   
       error_page 400 403 404 405 408 410 411 412 413 414 415/error/4-error.html;
 
       location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
                expires 30d;
       }
 
       location ~.*\.(js|css|javascript|fluash)$ {
                expires 24h;
       }
       location /error {
       root /usr/local/nginx/logs/error;
       }
 
    }
注意每个server是一个.conf的文件
upstream.conf文件:
upstream web {
server 192.168.254.253 weight=1 max_fails=2fail_timeout=10s ;
server 192.168.254.252 weight=1 max_fails=2fail_timeout=10s ;
server 192.168.254.251 weight=1 max_fails=2fail_timeout=10s ;
}
时间: 2024-08-24 23:58:46

Nginx七层反向代理和负载均衡的相关文章

nginx+tomcat实现反向代理的负载均衡

nginx+tomcat实现反向代理的负载均衡 安装java环境 server12: [[email protected] ~]# sh jdk-6u32-linux-x64.bin [[email protected] ~]# mv jdk1.6.0_32/ /usr/local/ [[email protected] ~]# cd /usr/local/ [[email protected] local]# mv jdk1.6.0_32/ java [[email protected] lo

LVS四层 VS Nginx七层反代(负载均衡)

1.场景: 最近不少朋友聊天谈到面试总是问到LVS四层反代和Nginx七层反代,有点不知所措. 负载均衡可以将用户的请求分发到 web集群的某台机器,反向代理也是实现了这个功能.如果后端是一台服务器就叫反向代理,如果有多台就是负载均衡.反向代理才能实现负载均衡 负载均衡是做反向代理的目的之一. 2.博主则探讨一下四层反代和的七层反代的区别(三层负载均衡不探讨),如有不足,请指出. 3.问到LVS四层.七层反代(负载均衡),则可以通过上面几个方式谈: 3.1)技术原理 3.2)优缺点 3.3)安全

nginx详解反向代理、负载均衡、LNMP架构上线动态网站

nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了.Igor Sysoev在建立的项目时,使用基于BSD许可. nginx和apache区别 Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更

Nginx服务器 之反向代理与负载均衡

一.反向代理 正向代理: 客户端要获取的资源就在服务器上,客户端请求的资源路径就是最终响应资源的服务器路径,这就是正向代理.正向代理的特点:就是我们明确知道要访问哪个网站地址. 反向代理: 客户端想获取服务器集群中(服务1,服务2,服务3 他们的资源相同)中的资源,但是客户端无法与该服务器集群建立连接,但我们可以与另一台服务器(代理服务器)建立连接且该服务器能获取服务器集群中的资源.这个时候客户端就可以通过请求代理服务器,获取想要的资源,但客户端并不知道给他资源的是哪个服务器.这种方式就是反向代

nginx和httpd反向代理和负载均衡tomcat集群

实验准备: 1.虚拟机172.18.250.77 安装nginx和httpd 实现负载均衡和反向代理 2.虚拟机172.18.250.78 安装tomcat 3.虚拟机172.18.250.79 安装tomcat 架构图: 一.nginx反向代理和负载均衡 1.安装nginx和tomcat ]# rpm -ivh nginx-1.8.0-1.el6.ngx.x86_64.rpm  ]# ls apache-tomcat-7.0.55.tar.gz  jdk-7u79-linux-x64.rpm 

nginx简单实现反向代理和负载均衡

一.环境 一台nginx做反向代理:192.168.88.142 两台tomcat机器做web:192.168.88.143  192.168.88.144 安装过程略,下一篇详细说明 二.nginx配置文件 nginx:192.168.88.142 user  www www;                     ##用户和组 worker_processes  1;               ##和cpu核数有关 events { use epoll;                

Nginx(七层)动静分离的负载均衡群集

环境:(全部为公网IP,可以直接和客户端通信) 分发器:192.168.200.101 静态文件服务器:192.168.200.102 192.168.200.103 动态文件服务器:192.168.200.104 192.168.200.105 图片服务器:       192.168.200.106 192.168.200.107 nginx常用的三种模式: 轮询   默认模式,后端服务器挂了自动踢出 weight   指定权重 ip_hash   每个请求按访问IP的hash结果分配,每个

Nginx反向代理以及负载均衡配置

前提:最近在研究nginx的用法,在windows上小试了一下,由于windows下不支持nginx缓存配置,所以本文主要是讲nginx,以及反向代理与负载均衡. [一.为什么要使用nginx] 要回答为什么要使用nginx,那就先说说nginx能做些什么. 首先,nginx能做反向代理,那么什么是反向代理呢,举个栗子,我想在本地使用 www.mickey.com 的域名去访问 www.taobao.com.那么这个时候我们就可以通过nginx去实现. 再者,nginx能实现负载均衡,什么是负载

nginx实现反向代理、负载均衡-技术流ken

1.简介 本篇博文是<nginx实现动态/静态文件缓存-技术流ken>的二部曲.将详细介绍nginx如何实现反向代理以及负载均衡技术,并辅以实战案例. 反向代理--"反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器." 负载均衡--"网络专用术语,负载均衡建立在现有网络结构之