天天看点

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

简单介绍:

1、Nginx优点

Nginx 负均衡实现比较简单,可配置性很强,可以按URL做负载均衡,默认对后端有健康检查的能力。后端机器少的情况下(少于10台)负载均衡能力表现好。其优点主要有:

1)功能强大,支持高并发连接,内存消耗少:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3 万并发连接数,且在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。

2)成本低廉:Nginx 为开源软件,免费使用。

3)Nginx 工作在网络的7 层,所以它可以针对Http应用本身来做分流策略,比如针对域名、目录结构等进行分流,可以实现多种分配策略,如:可以实现轮训、IP hash 等分配策略。

2、Nginx负载均衡的实现(Nginx的upstream模块所支持负载均衡的算法)

  Nginx 的负载均衡是一个基于内容和应用的七层交换负载均衡,是以反向代理服务器方式实现负载均衡。因此使用Nginx 实现服务器负载均衡的关键在于ngx_http_upstream_hash_module 模块的使用和设置Nginx 反向代理配置。

1)轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动剔除。

2)权重轮询均衡(weight):可以指定轮询几率,权重(weight)和访问比率成正比,用于后端服务器性能不均的情况。

3)ip_hash:每个请求按访问ip 的hash 结果分配,解决session问题,这样每个访客固定访问一个后端服务器,在有些应用情况下,需要将来自同一客户端的所有请求都分配给同一台服务器去负担,例如服务器将客户端注 册、购物等服务请求信息保存的本地数据库的情况下,把客户端的子请求分配给同一台服务器来处理就显的至关重要了。

4)fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5)url_hash(第三方):按访问url 的hash 结果来分配请求,使每个url 定向到同一个后端服务器,后端服务器为缓存时比较有效。

在nginx.conf 配置文件中,用upstream 指令定义一组(以4 台服务器为例)负载均衡后端服务器池:

1

2

3

4

5

<code>upstream </code><code>test</code><code>.com {    </code><code>#test.com表示集群组名,随意命名;支持多组负载均衡</code>

<code>        </code><code>ip_hash; </code><code>#设置分配方式</code>

<code> </code><code>server 192.168.0.203:80 weight=2 max_fails=3 fail_timeout=20s;</code>

<code> </code><code>server 192.168.0.204:80 weight=2 max_fails=3 fail_timeout=20s;</code>

<code> </code><code>}</code>

设备状态说明:

max_fails=3:允许请求失败的次数,默认是1,当超过最大次数时,则返回proxy_next_upstream模块定义的错误

fail_timeout=20s:当max_fails访问失败3次时,这台服务器暂停时间20s

weight:默认是1,权重值越大,分配请求负载越大

down:不参与集群

backup:除backup这台外其他机器down或忙时,请求backup机器

3、设置Nginx的反向代理配置

   反向代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web 服务器,反向代理方式是多个客户使用它访问内部Web服务器,使用反向代理服务器可以将请求转发给内部的Web 服务器,从而提升静态网页的访问速度。因此可以使用这种技术,让代理服务器将请求均匀转发给多台内部Web 服务器之一上,从而达到负载均衡的目的。

   使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能,具备额外的安全性,外部客户不能直接访问真实的服务器。 并且实现起来可以实现较好的负载均衡策略,将负载可以非常均衡的分给内部服务器,不会出现负载集中到某个服务器的偶然现象。

在nginx.conf 配置文件中,进行反向代理配置

6

7

8

9

10

11

12

13

14

15

<code>server {</code>

<code> </code><code>listen 80;</code>

<code> </code><code>server_name www.</code><code>test</code><code>.com;</code>

<code> </code><code>location / {</code>

<code> </code><code>root html;</code>

<code> </code><code>index index.html index.htm;</code>

<code> </code><code>proxy_pass http:</code><code>//www</code><code>.</code><code>test</code><code>.com;</code>

<code> </code><code>proxy_headers_hash_max_size 51200;</code>

<code> </code><code>proxy_headers_hash_bucket_size 6400;</code>

<code> </code><code>proxy_set_header Host $host;</code>

<code> </code><code>proxy_set_header X-Real-IP $remote_addr;</code>

<code> </code><code>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</code>

<code> </code><code>include proxy.conf;</code>

拓扑图:

<a href="http://blog.51cto.com/attachment/201310/185207378.jpg" target="_blank"></a>

环境描述:

系统均为:CentOS6.3_x64

Nginx:192.168.0.202 #负载均衡

WEB1:192.168.0.203 #后端网站

WEB2:192.168.0.204

一、安装nginx

1、安装依赖包和创建用户和组

<code># yum install -y gcc gcc-c++ make kernel-headers glibc-headers zlib-devel openssl openssl-devel pcre-devel</code>

<code># groupadd nginx</code>

<code># useradd -g nginx -s /sbin/nologin nginx</code>

2、安装nginx

<code># tar zxvf nginx-1.4.2.tar.gz</code>

<code># cd nginx-1.4.2</code>

<code># ./configure --perfix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module</code>

<code># make &amp;&amp; make install</code>

二、配置主配置文件

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<code># vi /usr/local/nginx/conf/nginx.conf</code>

<code>user nginx nginx;</code>

<code>worker_processes 8;</code>

<code>error_log logs</code><code>/error</code><code>.log;</code>

<code>pid logs</code><code>/nginx</code><code>.pid;</code>

<code>events {</code>

<code> </code><code>worker_connections 1024;</code>

<code>}</code>

<code>http {</code>

<code> </code><code>include mime.types;</code>

<code> </code><code>default_type application</code><code>/octet-stream</code><code>;</code>

<code> </code><code>log_format main </code><code>'$remote_addr - $remote_user [$time_local] "$request" '</code>

<code> </code><code>'$status $body_bytes_sent "$http_referer" '</code>

<code> </code><code>'"$http_user_agent" "$http_x_forwarded_for"'</code><code>;</code>

<code> </code><code>access_log logs</code><code>/access</code><code>.log main; </code><code>#上面是访问日志格式和记录位置</code>

<code> </code><code>sendfile on;</code>

<code> </code><code>tcp_nopush on;</code>

<code> </code><code>keepalive_timeout 65;</code>

<code> </code><code>gzip</code> <code>on;</code>

<code>upstream www.</code><code>test</code><code>.com {</code>

<code> </code><code>server 192.168.0.203:80 weight=2;  </code><code>#我们使用weight算法</code>

<code> </code><code>server 192.168.0.204:80 weight=3;   考虑到服务器性能不均</code>

<code> </code><code>server {</code>

<code> </code><code>index index.html index.htm; </code><code>#请求转向mysvr 定义的服务器列表</code>

<code> </code><code>#设置头部哈希表的最大值,不能小于你后端服务器设置的头部总数。</code>

<code> </code><code>proxy_headers_hash_bucket_size 6400; </code><code>#设置头部哈希表大小</code>

<code># vi /usr/local/nginx/conf/proxy.conf</code>

<code>proxy_redirect off;</code>

<code>proxy_set_header Host $host; </code><code>#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP</code>

<code>proxy_set_header X-Real-IP $remote_addr;</code>

<code>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</code>

<code>client_max_body_size 10m; </code><code>#允许客户端请求的最大单文件字节数</code>

<code>client_body_buffer_size 128k; </code><code>#缓冲区代理缓冲用户端请求的最大字节数,</code>

<code>proxy_connect_timeout 90; </code><code>#nginx跟后端服务器连接超时时间(代理连接超时)</code>

<code>proxy_read_timeout 90; </code><code>#连接成功后,后端服务器响应时间(代理接收超时)</code>

<code>proxy_buffer_size 4k; </code><code>#设置代理服务器(nginx)保存用户头信息的缓冲区大小</code>

<code>proxy_buffers 6 32k; </code><code>#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置</code>

<code>proxy_busy_buffers_size 64k; </code><code>#高负荷下缓冲大小(proxy_buffers*2)</code>

<code>proxy_temp_file_write_size 64k; </code><code>#设定缓存文件夹大小,大于这个值,将从upstream服务器传</code>

三、维护命令

<code># /usr/local/nginx/sbin/nginx #启动nginx</code>

<code># /sbin/nginx -s stop #快速终止web服务</code>

<code># /sbin/nginx -s quit #有安排的结束web服务</code>

<code># /sbin/nginx -s reload #重新加载相关配置</code>

<code># /logs/access.log #访问日志</code>

<code># /logs/error.log #错误日志</code>

<code># echo '/usr/local/nginx/sbin/nginx' &gt;&gt; /etc/rc.local #设置开机启动</code>

配置完毕,后端web不需要配置,启动nginx后访问www.test.com可以看到轮训调度后端web!

本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1300684,如需转载请自行联系原作者

继续阅读