Nginx反向代理与负载均衡

Linux fireling 786℃

nginx介绍

nginx是一款高性能的http反向代理服务器,同时也是一款imap/pop3/smtp代理服务器。目前很多网站都采用nginx作为web服务器,宁哥的小站也是很早由apache转向了nginx做web服务架设。

nginx有很多优点,其最大的特色就是反向代理负载均衡。要想知道反向代理,还要从正向代理说起。

正向代理

正向代理,也就是传说中的代理。它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也就隐藏了用户的资料,这取决于代理告不告诉网站。

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端必须要进行一些特别的设置。客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

正向代理为在防火墙内的局域网客户端提供访问Internet的途径,正向代理允许客户端通过它访问任意网站并且隐藏客户端自身。

forward_proxy

反向代理

反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

例如,用户访问 http://www.xxx.com/readme ,但 www.xxx.com 上并不存在 readme 页面,于是它偷偷从另外一台服务器上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 www.xxx.com 这个域名对应的服务器就设置了反向代理功能。

正向代理将防火墙后面的服务器提供给Internet用户访问,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

reverse_proxy

nginx反向代理是通过proxy_pass来实现的。

负载均衡

负载均衡,简单来说,就是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。

load_balance

nginx负载均衡是通过upstream来实现的,有以下几种策略:

  • 轮询round-robin (默认):

请求会按照时间顺序逐一分配到不同服务器,如果服务器down掉,能自动剔除。


upstream myapp.com {
    server srv1.example.com:80;
    server srv2.example.com:80;
    server srv3.example.com:80;
}    
  • 基于weight:

请求会按照权重来分配,权重大的分配多。


upstream myapp.com {
    server srv1.example.com:80 weight=3;
    server srv2.example.com:80;
    server srv3.example.com:80;
}
  • 基于least-connected:

请求会按照连接数来分配,连接数少的分配多。


upstream myapp.com {
    least_conn;
    server srv1.example.com:80;
    server srv2.example.com:80;
    server srv3.example.com:80;
}
  • 基于ip-hash:

请求会按照访问IP的hash结果分配,这样每个IP固定访问一个服务器,可以解决session保持的问题。


upstream myapp.com {
    ip_hash;
    server srv1.example.com:80;
    server srv2.example.com:80;
    server srv3.example.com:80;
}

upstream模块下的server指令用来配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。server指令提供以下参数:


weight            
max_conns        
max_fails        
fail_timeout
backup             
down             

nginx配置及访问结果示例

这里举个例子,来说明一下nginx如何进行负载均衡的配置。

  • 主机配置

主机和从机一般选不同的独立服务器,为了方便,这里都在一台服务器上进行,采用服务器的ip为172.16.1.52。


upstream 172.16.1.52 {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
    server 127.0.0.1:8083;
}
server{
    listen 80;
    location / {
        proxy_pass http://172.16.1.52;
    }
}
  • 从机配置

可以采用nginx架设http服务,分为访问8081、8082、8083端口,也可以采用其他办法架设http服务,如采用flask,为了方便查看主机转发结果,可以将不同从机的返回结果设置不同。


#coding: utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello 8081!'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8081)

运行python的web服务:

run_flask

  • 访问主机域名

不管从终端curl,还是从浏览器刷新,可以看到返回的结果正如我们所想,按照默认的轮询模式进行返回。当然,你也可以做其他的配置,以便进一步改进返回结果。
result1result2

  • 主机进一步配置

从之前的结果可以看到,从机负责站点服务功能,而主机只负责转发,如果我们也想让主机也提供站点服务功能,那该怎么办?很简单,将主机对应的域名添加到upstream中。由于80端口已经被占用,此时要注意主机的http服务端口需要改为其它,如8000端口,并在nginx配置中添加监听即可。

 

转载请注明:宁哥的小站 » Nginx反向代理与负载均衡

喜欢 (11)