负载均衡

前面的例子中,代理仅仅指向一个服务器。

但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。

nginx 也可以实现简单的负载均衡功能。

img

假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台 linux 环境的服务器上。网站域名叫 www.helloworld.com,公网 IP 为 192.168.1.11。在公网 IP 所在的服务器上部署 nginx,对所有请求做负载均衡处理(下面例子中使用的是加权轮询策略)。

nginx.conf 配置如下:

  1. http {
  2. #设定mime类型,类型由mime.type文件定义
  3. include /etc/nginx/mime.types;
  4. default_type application/octet-stream;
  5. #设定日志格式
  6. access_log /var/log/nginx/access.log;
  7. #设定负载均衡的服务器列表
  8. upstream load_balance_server {
  9. #weigth参数表示权值,权值越高被分配到的几率越大
  10. server 192.168.1.11:80 weight=5;
  11. server 192.168.1.12:80 weight=1;
  12. server 192.168.1.13:80 weight=6;
  13. }
  14. #HTTP服务器
  15. server {
  16. #侦听80端口
  17. listen 80;
  18. #定义使用www.xx.com访问
  19. server_name www.helloworld.com;
  20. #对所有请求进行负载均衡请求
  21. location / {
  22. root /root; #定义服务器的默认网站根目录位置
  23. index index.html index.htm; #定义首页索引文件的名称
  24. proxy_pass http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表
  25. #以下是一些反向代理的配置(可选择性配置)
  26. #proxy_redirect off;
  27. proxy_set_header Host $host;
  28. proxy_set_header X-Real-IP $remote_addr;
  29. #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
  30. proxy_set_header X-Forwarded-For $remote_addr;
  31. proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
  32. proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
  33. proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
  34. proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
  35. proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
  36. proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
  37. proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
  38. client_max_body_size 10m; #允许客户端请求的最大单文件字节数
  39. client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
  40. }
  41. }
  42. }

负载均衡策略

Nginx 提供了多种负载均衡策略,让我们来一一了解一下:

负载均衡策略在各种分布式系统中基本上原理一致,对于原理有兴趣,不妨参考 负载均衡

轮询
  1. upstream bck_testing_01 {
  2. # 默认所有服务器权重为 1
  3. server 192.168.250.220:8080
  4. server 192.168.250.221:8080
  5. server 192.168.250.222:8080
  6. }
加权轮询
  1. upstream bck_testing_01 {
  2. server 192.168.250.220:8080 weight=3
  3. server 192.168.250.221:8080 # default weight=1
  4. server 192.168.250.222:8080 # default weight=1
  5. }
最少连接
  1. upstream bck_testing_01 {
  2. least_conn;
  3. # with default weight for all (weight=1)
  4. server 192.168.250.220:8080
  5. server 192.168.250.221:8080
  6. server 192.168.250.222:8080
  7. }
加权最少连接
  1. upstream bck_testing_01 {
  2. least_conn;
  3. server 192.168.250.220:8080 weight=3
  4. server 192.168.250.221:8080 # default weight=1
  5. server 192.168.250.222:8080 # default weight=1
  6. }
IP Hash
  1. upstream bck_testing_01 {
  2. ip_hash;
  3. # with default weight for all (weight=1)
  4. server 192.168.250.220:8080
  5. server 192.168.250.221:8080
  6. server 192.168.250.222:8080
  7. }
普通 Hash
  1. upstream bck_testing_01 {
  2. hash $request_uri;
  3. # with default weight for all (weight=1)
  4. server 192.168.250.220:8080
  5. server 192.168.250.221:8080
  6. server 192.168.250.222:8080
  7. }