https://www.yduba.com/biancheng-3152689737.html

配置前的准备

我们这里准备两台服务器(centos_6.5_x64),nginx 环境都已安装好(nginx version 1.10),两台服务器 IP 分别是:
服务器A:192.168.91.128
服务器B:192.168.91.129
这里为了省的配置防火墙,暂时先把两台服务器的防火墙给关闭了,真实环境下千万不要关闭防火墙。在两台服务器上分别指行:
# service iptables stop

反向代理配置

《图解正向代理、反向代理、透明代理》 这篇文章,我们知道,反向代理就是用户访问服务器A服务器A再去访问服务器BB返回数据给AA再把数据展现给用户,其中用户并不知道有 B服务器 的存在。
其实,在 Nginx 下配置反向代理,很简单的,主要是 Nginx 的 upstream 模块配置。我们将 服务器 A 的 配置修改成如下:

  1. ......
  2. upstream study_pc {
  3. # 这是将去访问 192.168.91.129 服务器
  4. server 192.168.91.129:80;
  5. }
  6. server {
  7. listen 80;
  8. server_name localhost;
  9. location / {
  10. proxy_pass http://study_pc;
  11. proxy_set_header HOST $host;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. }
  15. }
  16. ......

配置好之后,重启服务器A,其中,服务器 B不需要特别的配置,按平常配置即可。重启A服务器之后,访问 http://192.168.91.128
Nginx 反向代理和负载均衡配置 - 图1
我们可以发现,访问的内容确是服务器B提供的内容,表明我们的反向代理是配置成功了。

负载均衡配置

负载均衡的原理和反向代理是一样的,唯一的区别是 反向代理的后台服务器是 1 台,负载均衡的后台服务器是由多台。即:用户访问服务器A,服务器 A 均衡的去代理服务器B 或 服务器 C,B或C返回给服务器A,A再把内容展现给用户。即如图:
Nginx 反向代理和负载均衡配置 - 图2
这里不再去配置服务器C,我们把服务器A和B当做后台服务器,A也充当前端服务器。其中 A服务器的配置如下:

  1. ......
  2. upstream study_pc {
  3. # 这是将去访问 192.168.91.129 服务器
  4. server 192.168.91.129:80;
  5. # 这是代理到 192.168.91.128 服务器
  6. server 192.168.91.128:8080;
  7. }
  8. server {
  9. listen 8080;
  10. server_name localhost;
  11. #charset koi8-r;
  12. #access_log logs/host.access.log main;
  13. root /www;
  14. index index.html index.php;
  15. # if (!-e $request_filename){
  16. # rewrite ^/(.*)$ /index.php?s=/$1 last;
  17. # }
  18. #error_page 404 /404.html;
  19. # redirect server error pages to the static page /50x.html
  20. #
  21. error_page 500 502 503 504 /50x.html;
  22. location = /50x.html {
  23. root html;
  24. }
  25. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  26. #
  27. location ~ \.php$ {
  28. fastcgi_pass 127.0.0.1:9000;
  29. fastcgi_index index.php;
  30. fastcgi_split_path_info ^(.+\.php)(/.+)$;
  31. fastcgi_param PATH_INFO $fastcgi_path_info;
  32. fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
  33. fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  34. include fastcgi_params;
  35. }
  36. }
  37. server {
  38. listen 80;
  39. server_name localhost;
  40. location / {
  41. proxy_pass http://study_pc;
  42. proxy_set_header HOST $host;
  43. proxy_set_header X-Real-IP $remote_addr;
  44. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  45. }
  46. }
  47. ......

配置好之后 ,我们重启服务器A的 Nginx ,我们再去访问 http://192.168.91.128 发现,有时显示的内容是服务器A的内容,有时显示的内容是服务器B内容,这也说明 负载均衡 配置是成功的。

upstream 的分配方式

在上面的配置中,我们没有设置 upstream 的分配方式,默认情况下,这将采用轮询的方式,即每个请求按时间逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
其实,我们可以手动设置 upstream 的分配方式 nginx 有 5 种分配方式,分别是:

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
如:

  1. upstream study_pc {
  2. server 192.168.91.129:8080;
  3. server 192.168.91.128:8080;
  4. }

2、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如:

  1. upstream study_pc {
  2. server 192.168.91.129:8080 weight=10;
  3. server 192.168.91.128:8080 weight=15;
  4. }

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。如:

  1. upstream study_pc {
  2. server 192.168.91.129:8080;
  3. server 192.168.91.128:8080;
  4. ip_hash;
  5. }

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个是第三方模块,需要额外安装。配置如下:

  1. upstream study_pc {
  2. server 192.168.91.129:8080;
  3. server 192.168.91.128:8080;
  4. fair;
  5. }

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。这个是第三方模块,需要额外安装。配置如下:

  1. upstream study_pc {
  2. server 192.168.91.129:8080;
  3. server 192.168.91.128:8080;
  4. hash $request_uri;
  5. hash_method crc32;
  6. }

注意:使用 url_hash 时,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

upstream 服务状态

upstream 在配置后端服务器时,可以指定服务器的状态,如:

  1. upstream study_pc {
  2. server 192.168.91.129:8080 down;
  3. server 192.168.91.128:8080;
  4. }

每个设置的状态设置参数可以有以下几个值:
1、down 表示单前的 server 暂时不参与负载
2、weight 默认为1;weight 越大,负载的权重就越大。
3、max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
4、fail_timeout:max_fails 次失败后,暂停的时间。
5、backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。