nginx學習筆記–負載均衡算法及故障轉移
前言
nginx作爲高性能的HTTP和反向代理web服務器,其實很早就有去接觸瞭解,但是可能自己之前技術水平有限,感覺有些東西總是覺得高大上不能理解,而且也沒有去動手操作。現在再去學習操作,發現其實很好理解,而且基本的使用還是比較容易。本篇博客主要介紹nginx的負載均衡,以及故障轉移配置。
nginx的基本配置
要簡單的練習nginx的負載均衡,這裏可能涉及的模塊有server,location,upstream;其中location是用來配置路由,upstream是用來配置負載均衡的。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream www.loadbalance.com{
#這裏指定多個源服務器,ip:端口,80端口的話可寫可不寫 weight=5 weight=2
server 127.0.0.1:10350 max_fails=2 fail_timeout=20s; #10350,10351是我創建的一個SpringBoot應用程序的兩個服務節點端口
server 127.0.0.1:10351 max_fails=2 fail_timeout=20s; #max_fails:表示失敗最大次數,超過失敗最大次數暫停服務 fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求
}
#gzip on;
server {
listen 8888;
server_name www.loadbalance.com;#是本機測試,在hosts文件配置的一個映射域名
charset utf-8;
access_log logs/access.log;
location / {
root html;
index index.html index.htm;
proxy_pass http://www.loadbalance.com;
proxy_connect_timeout 3; #這裏就保證了自動切換服務器,連接超時時間,超時會去連接集羣的其它服務器節點
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
這裏有幾個重點配置,故障轉移必須配置,這樣集羣中一個節點故障纔會去請求其它節點。
proxy_connect_timeout:用來配置連接超時時間,如果連接超時,nginx纔會故障轉移去連接其它服務器節點。
max_fails:表示失敗最大次數,超過失敗最大次數暫停服務
fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求
nginx的負載均衡配置
nginx主要有4中負載均衡策略:隨機輪詢,ip_hash,url_hash,fail:
1、nginx默認是隨機輪詢算法,請求會依次分配到相應的集羣節點
upstream www.loadbalance.com{
#這裏指定多個源服務器,ip:端口,80端口的話可寫可不寫 weight=5 weight=2
server 127.0.0.1:10350 max_fails=2 fail_timeout=20s; #10350,10351是我創建的一個SpringBoot應用程序的兩個服務節點端口
server 127.0.0.1:10351 max_fails=2 fail_timeout=20s; #max_fails:表示失敗最大次數,超過失敗最大次數暫停服務 fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求
}
2、ip_hash,會根據ip計算hash值,相同的客戶端的請求會路由到同一個集羣服務節點。如果配置了proxy_connect_timeout,max_fails,fail_timeout幾個配置,那麼在被路由的服務節點故障時,依然可以故障轉移到其它的服務節點。
upstream www.loadbalance.com{
ip_hash;
#這裏指定多個源服務器,ip:端口,80端口的話可寫可不寫 weight=5 weight=2
server 127.0.0.1:10350 max_fails=2 fail_timeout=20s;
server 127.0.0.1:10351 max_fails=2 fail_timeout=20s; #max_fails:表示失敗最大次數,超過失敗最大次數暫停服務 fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求
}
3、url_hash,會根據url計算hash值路由,相同的url會被路由到同一個服務節點中去。。如果配置了proxy_connect_timeout,max_fails,fail_timeout幾個配置,那麼在被路由的服務節點故障時,依然可以故障轉移到其它的服務節點。
upstream www.loadbalance.com{
hash $request_uri;
#這裏指定多個源服務器,ip:端口,80端口的話可寫可不寫 weight=5 weight=2
server 127.0.0.1:10350 max_fails=2 fail_timeout=20s;
server 127.0.0.1:10351 max_fails=2 fail_timeout=20s; #max_fails:表示失敗最大次數,超過失敗最大次數暫停服務 fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求
}
4、fair負載均衡, 按後端服務器的響應時間來分配請求,響應時間短的優先分配;需喲安裝upstream-fair模塊。
upstream www.loadbalance.com{
#這裏指定多個源服務器,ip:端口,80端口的話可寫可不寫 weight=5 weight=2
server 127.0.0.1:10350 max_fails=2 fail_timeout=20s;
server 127.0.0.1:10351 max_fails=2 fail_timeout=20s; #max_fails:表示失敗最大次數,超過失敗最大次數暫停服務 fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求
fair;
}
新建一個SpringBoot應用,來測試負載均衡
1、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>swagger</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>swagger</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.2.3.RELEASE</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>7.0.68</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、application.properties
server.port=10350
3、新建一個controller用來測試
HelloWordController.jva
@RestController
@RequestMapping("/hello")
@Api(value="測試負載均衡")
public class HelloWordController {
@RequestMapping("/sayHello")
public String sayHello(){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = "------------------->>>>>>>>>" + dateFormat.format(new Date()) + ".Hello World!";
System.out.println(str);
return "str";
}
}
4、啓動應用
其中一臺直接啓動,另外一臺DOS窗口命令啓動:
java -jar swagger-0.0.1-SNAPSHOT.jar --server.port=10351
5、訪問http://www.loadbalance.com:8888/hello/sayHello,停掉其中的一個模擬節點,切換負載均衡策略進行測試。
備註:
一些常見的命令:
start nginx : 啓動nginx
nginx -s reload :修改配置後重新加載生效
nginx -s reopen :重新打開日誌文件
nginx -t -c /path/to/nginx.conf 測試nginx配置文件是否正確
關閉nginx:
nginx -s stop :快速停止nginx
nginx -s quit :完整有序的停止nginx
[1]: https://blog.csdn.net/papima/article/details/80984239
[2]: https://www.cnblogs.com/loong-hon/p/9060515.html
[3]: https://www.cnblogs.com/handongyu/p/6410405.html