Nginx负载均衡总结2

若是要支持健康检查须要开启health_check(好吧,这个是nginx plus版本才有的功能,plus是付费版)html

还有一点,Windows的nginx不支持udp等协议,因此有一些测试还必须用linux环境测试;node

对于Tcp的负载均衡简易配置:linux

tcp { # 若是本身写的话最好不用这个,仍是用stream好,它能够同时表明tcp和udp     upstream xxx-service { # 注意,不管是tcp/udp/http什么的,这里都是upstream clusterName         server localhost:9000;         server localhost:9001;          #check interval 健康:检查时间间隔,单位为毫秒         #rise 检查几回正常后,将server加入以负载列表中         #fall 检查几回失败后,从负载队列移除server         #timeout 检查超时时间,单位为毫秒         check interval=3000 rise=2 fall=5 timeout=1000;     }     server { # 对于TCP/UDP这样的协议不存在location的说法         listen 8786;         proxy_pass xxx-service;     } }

 HTTP协议的:(和tcp或udp的不一样的是,tcp里面一个upstream对于一个server[listen]配置,而http里是多个upstream能够对应一个server[listen]配置,也能够对应多个server配置,nginx

而不一样的server的listen端口是能够同样的【这种状况其实就能够用一个server,固然也能够用两个】)web

http { include conf/mime.types;       default_type  application/octet-stream;  keepalive_timeout 120;  tcp_nodelay on;  upstream www.s135.com { # 这里能够用标识符而非域名,好比upstream uuu {...};而全部的web访问到nginx网关的时候都是指定了对应的server server 192.168.1.2:80;               server   192.168.1.3:80;               server   192.168.1.4:80;               server   192.168.1.5:80;  } upstream blog.s135.com { server 192.168.1.7:8080;               server   192.168.1.7:8081;               server   192.168.1.7:8082;  } server { listen 80;
        # 这个server_name通常要么是nginx所在主机的ip地址,要么就是这台主机绑定的域名(一台主机能够绑定多个域名,这个时候就会用到多个server,可是没有绑定多个域名也是能够配置多个server的【最好不要会产生warn】)
server_name www.s135.com; # 下面的http://www.s135.com对应的是upstream里的名字,和server_name是没有关系的,可是若是一个请求是经过www.s135.com请求过来,那么header里Host值就会是www.s135.com这样就能被nginx识别并由这个server去处理,因此这个东西在多域名访问时仍是有用的,可是若是是nginx集群只处理一个域名 或者 不以域名为转发标识只与url有关 或者 是内部系统的网关直接用的ip那么多个upstream用一个server便可,这里域名处理的做用是为了假设两个server监听的同一个地址,而后两个server里的location存在同样的配置,那么请求过来匹配上该同样的location,若是没有域名处理那么这里就没法知道到底转发给哪一个server的该location【固然是先匹配server而后才是location】) location / { proxy_pass http://www.s135.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } log_format www_s135_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /data1/logs/www.log www_s135_com; } server { listen 80; server_name blog.s135.com; location / { proxy_pass http://blog.s135.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } log_format blog_s135_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /data1/logs/blog.log blog_s135_com; } }

官方的HTTP协议配置里不须要listen,默认就是80端口,若是是https则要listen后面有个ssl后缀:docker

http { upstream backend { server backend1.example.com;         server backend2.example.com;         server 192.0.0.1 backup;  } server { location / { proxy_pass http://backend;  } } }

 本身测试经过的Http协议负载均衡配置:#user nobody;app

worker_processes 1;  #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;  #pid logs/nginx.pid;  events { worker_connections 1024; } http { include mime.types;  default_type application/octet-stream;  log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';  #access_log logs/access.log main;  sendfile on;  #tcp_nopush on;  #keepalive_timeout 0;  keepalive_timeout 65;  tcp_nodelay on;  #gzip on;  # 【重要,这里的cluster_name必须是一个可访问的ip或者是域名,它不是key的意思(是key,以前用cluster_servers这个key有下划线因此失败); # 但通过测试用cluster_servers提示400,用mmm则能够,难道是下划线的缘由?(对,确实是下划线的缘由,真坑啊,通常不都应该支持下划线吗?反却是-支持,不过最好也不要有指不定何时不支持了) upstream clusterservers { server 127.0.0.1:8891 down; # max_fails=3 fail_timeout=60s weight=1 server 127.0.0.1:8892 weight=1; # 注意,weight的值不能是0(可能低版本能够),若是要软卸载单个server能够配置为down而后reload; # server localhost:8080 backup; # 注意,backup也是会转发的,因为以前转发到上面两个主机一直失败,因此就转发到backup机里了;  } server { listen 80; # 若是是80是能够省略的

    # 其实对于HTTP协议而言,location才是至关于tcp/udp这种协议的server,并且一个upstream能够对于多个location; server_name uuuu; # 这个配置能够不用,注意它描述的是nginx开启的server的server_name【错,它对应的实际上是requestHeader中的Host的值,即域名,当两个server都绑定的同一个地址时,请求过来到底转发到哪一个server里的location就能够进一步经过这个来判断】,即listen 80中的这个server,而不是upstream里的被代理服务的server_name charset utf-8; access_log logs/cluster_servers.access.log main; location / { proxy_pass http://clusterservers; # health_check; # 开启健康检查 } # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

 

UDP协议的:负载均衡

stream { # UDP的竟然是叫stream(好吧,貌似TCP也能是这个,只不事后面的server的listene不须要udp后缀) # 能够有多个upstream upstream dns { server 101.89.134.11:8989;        server 101.89.134.12:8989;        server 101.89.134.13:8989;  } # 能够有多个server对应上面的upstream server { listen 8989 udp; # 注意这里有udp         proxy_responses 1;         proxy_timeout 20s;         proxy_bind $server_addr:$remote_port;         proxy_pass dns;  } }

官方文档里的TCP和UDP共同的例子(注意,虽然是官方的例子,可是仍是不要用下划线比较好,本身测试的时候下划线死活没法转发):tcp

stream { upstream stream_backend { least_conn;         server backend1.example.com:12345 weight=5;         server backend2.example.com:12345 max_fails=2 fail_timeout=30s;         server backend3.example.com:12345 max_conns=3;  } upstream dns_servers { least_conn;         server 192.168.136.130:53;         server 192.168.136.131:53;         server 192.168.136.132:53;  } server { # TCP的集群服务 listen 12345;         proxy_pass    stream_backend;         proxy_timeout 3s;         proxy_connect_timeout 1s;  } server { # UDP的集群服务 listen 53 udp;         proxy_pass dns_servers;  } server { # 这个就是没有配置集群,普通的转发; listen 12346; # 注意,这里的server和下面的proxy_pass你能够理解为docker容器和内部应用的关系         proxy_pass backend4.example.com:12346;  } }
相关文章
相关标签/搜索