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;  } }
相關文章
相關標籤/搜索