一个请求由不同的服务进行处理,默认以轮询方式处理请求

  1. upstream hyperf {
  2. #Hyperf HTTP Server 的 IP 及 端口
  3. server 127.0.0.1:9501;
  4. server 127.0.0.1:9502;
  5. server 127.0.0.1:9503;
  6. server 127.0.0.1:9504;
  7. server 127.0.0.1:9505;
  8. }
  9. server {
  10. listen 80;
  11. listen 443 ssl http2;
  12. listen [::]:443 ssl http2;
  13. server_name api.yuwei.cc;
  14. ssl_certificate /etc/nginx/ssl/api.yuwei.cc.pem;
  15. ssl_certificate_key /etc/nginx/ssl/api.yuwei.cc.key;
  16. access_log /dev/null;
  17. error_log /var/log/nginx/error_api.yuwei.cc.log;
  18. location / {
  19. proxy_set_header Host $http_host;
  20. proxy_set_header X-Real-IP $remote_addr;
  21. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  22. proxy_pass http://hyperf;
  23. }

轮询策略

轮询(默认)

weight 默认为 1,请求按时间顺序逐一分配到不同的后端服务,会自动剔除停机的后端服务

名称 说明
fail_timeout 请求超时时间,与 max_fails 结合使用
max_fails 请求超时次数,与 fail_timeout 结合使用
fail_time 服务器自动停机的时长,默认 10s
backup 标记服务为备用服务,当主服务停止时,请求会被发送到这里
down 标记的服务永久停机

权重

指定轮询几率,weight 和访问比率成正比

  1. upstream hyperf {
  2. #Hyperf HTTP Server 的 IP 及 端口
  3. server 127.0.0.1:9501 weight=3;
  4. server 127.0.0.1:9502 weight=2;
  5. server 127.0.0.1:9503;
  6. server 127.0.0.1:9504;
  7. server 127.0.0.1:9505 weight=2;
  8. }
  • 权重越高分配到需要处理的请求越多
  • 此策略可以与 least_conn 和 ip_hash 结合使用
  • 此策略比较适合服务器的硬件配置差别比较大的情况

    ip_hash

    请求按访问 ip 的 hash 分配,每个访客会固定访问一个后端服务,可以解决 Session 不能跨服务器的问题

    1. upstream hyperf {
    2. ip_hash;
    3. #Hyperf HTTP Server 的 IP 及 端口
    4. server 127.0.0.1:9501 weight=1;
    5. server 127.0.0.1:9502 weight=2;
    6. server 127.0.0.1:9503 weight=3;
    7. server 127.0.0.1:9504 weight=4;
    8. server 127.0.0.1:9505 weight=5;
    9. }
  • nginx v1.3.1 之前的版本不能在 ip_hash 中使用权重(weight)

  • ip_hash 不能与 backup 同时使用
  • 此策略适合有状态服务,比如 Session
  • 当有服务器需要剔除,必须手动 down 掉

    least_conn

    请求按连接数分配,连接数少的优先分配; 适合请求处理时间长短不一造成服务过载的情况
    1. upstream hyperf {
    2. least_conn;
    3. #Hyperf HTTP Server 的 IP 及 端口
    4. server 127.0.0.1:9501 weight=1;
    5. server 127.0.0.1:9502 weight=2;
    6. server 127.0.0.1:9503 weight=3;
    7. server 127.0.0.1:9504 weight=4;
    8. server 127.0.0.1:9505 weight=5;
    9. }

    第三方策略

    fair

    nginx-upstream-fairhttps://github.com/gnosek/nginx-upstream-fair
    请求按响应时间来分配,响应时间短的优先分配
    1. upstream hyperf {
    2. ip_hash;
    3. #Hyperf HTTP Server 的 IP 及 端口
    4. server 127.0.0.1:9501;
    5. server 127.0.0.1:9502;
    6. server 127.0.0.1:9503;
    7. server 127.0.0.1:9504;
    8. server 127.0.0.1:9505;
    9. }

    url_hash

    nginx_upstream_hashhttps://github.com/evanmiller/nginx_upstream_hash
    请求按访问 URL 的 hash 分配,使每个 URL 定向到同一个后端服务,后端服务为缓存时比较有效
    1. upstream hyperf {
    2. #在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用 hash 算法
    3. hash $request_uri;
    4. hash_method crc32;
    5. #Hyperf HTTP Server 的 IP 及 端口
    6. server 127.0.0.1:9501;
    7. server 127.0.0.1:9502;
    8. server 127.0.0.1:9503;
    9. server 127.0.0.1:9504;
    10. server 127.0.0.1:9505;
    11. }