Nginx實現負載均衡和反向代理

Nginx 簡介

什麼是 Nginx

Nginx 是一款高性能的 HTTP 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。由俄羅斯的程序設計師 Igor Sysoev 所開發,官方測試 Nginx 能夠支支撐 5 萬併發鏈接,並且 CPU、內存等資源消耗卻非常低,運行非常穩定。

Nginx 的應用場景

  • HTTP 服務器:Nginx 是一個 HTTP 服務可以獨立提供 HTTP 服務。可以做網頁靜態服務器。
  • 虛擬主機:可以實現在一臺服務器虛擬出多個網站。例如個人網站使用的虛擬主機。
  • 反向代理,負載均衡:當網站的訪問量達到一定程度後,單臺服務器不能滿足用戶的請求時,需要用多臺服務器集羣可以使用 Nginx 做反向代理。並且多臺服務器可以平均分擔負載,不會因爲某臺服務器負載高宕機而某臺服務器閒置的情況

Nginx 驚羣問題

在建立連接的時候,Nginx處於充分發揮多核CPU架構性能的考慮,使用了多個worker子進程監聽相同端口的設計,這樣多個子進程在accept建立新連接時會有爭搶,這會帶來著名的“驚羣”問題,子進程數量越多越明顯,這會造成系統性能的下降。

一般情況下,有多少CPU核心就有配置多少個worker子進程。假設現在沒有用戶連入服務器,某一時刻恰好所有的子進程都休眠且等待新連接的系統調用(如epoll_wait),這時有一個用戶向服務器發起了連接,內核在收到TCP的SYN包時,會激活所有的休眠worker子進程。最終只有最先開始執行accept的子進程可以成功建立新連接,而其他worker子進程都將accept失敗。這些accept失敗的子進程被內核喚醒是不必要的,他們被喚醒會的執行很可能是多餘的,那麼這一時刻他們佔用了本不需要佔用的資源,引發了不必要的進程切換,增加了系統開銷。

簡單的說:就比如你去KTV唱歌,KTV晚上剛上班,你一進去就要叫小姐陪唱,老闆一下就叫了好多個小姐姐過來,但是你只需要一個,所以這就造成了沒必要的浪費。

Nginx 反向代理

什麼是代理服務器?

代理服務器,客戶機在發送請求時,不會直接發送給目的主機,而是先發送給代理服務器,代理服務接受客戶機請求之後,再向主機發出,並接收目的主機返回的數據,存放在代理服務器的硬盤中,再發送給客戶機。

在這裏插入圖片描述
爲什麼要使用代理服務器?

提高訪問速度

由於目標主機返回的數據會存放在代理服務器的硬盤中,因此下一次客戶再訪問相同的站點數據時,會直接從代理服務器的硬盤中讀取,起到了緩存的作用,尤其對於熱門站點能明顯提高請求速度。

防火牆作用

由於所有的客戶機請求都必須通過代理服務器訪問遠程站點,因此可在代理服務器上設限,過濾某些不安全信息。

通過代理服務器訪問不能訪問的目標站點

互聯網上有許多開放的代理服務器,客戶機在訪問受限時,可通過不受限的代理服務器訪問目標站點,通俗說,我們使用的翻牆瀏覽器就是利用了代理服務器,雖然不能出國,但也可直接訪問外網。

什麼是正向代理?

正向代理,架設在客戶機與目標主機之間,只用於代理內部網絡對 Internet 的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到 Web 服務器上的 Http 請求發送到代理服務器中。

在這裏插入圖片描述
什麼是反向代理?

反向代理服務器架設在服務器端,通過緩衝經常被請求的頁面來緩解服務器的工作量,將客戶機請求轉發給內部網絡上的目標服務器;並將從服務器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理服務器與目標主機一起對外表現爲一個服務器。

在這裏插入圖片描述
反向代理有哪些主要應用?

現在許多大型 web 網站都用到反向代理。除了可以防止外網對內網服務器的惡性攻擊、緩存以減少服務器的壓力和訪問安全控制之外,還可以進行負載均衡,將用戶請求分配給多個服務器。

下載Windows版本的Nginx:http://nginx.org/en/download.html
Linux下使用Docker容器安裝:docker pull nginx

注意:在Linux或者Windows下實現負載均衡和反向代理的方式基本相同都是更改nginx的nginx.conf配置文件

需求

  • 兩個 tomcat 服務通過 nginx 反向代理
  • tomcat1 服務器:192.168.88.136:9090
  • tomcat2 服務器:192.168.88.136:9091

1、運行兩個tomcat容器(我這裏使用docker容器啓動)

docker run --name tomcat1 -p 9090:8080 -d tomcat
docker run --name tomcat2 -p 9091:8080 -d tomcat

2、編輯nginx.conf配置文件(windows版本的)

3、複製以下代碼

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	
	# 配置一個代理即 tomcat1 服務器
	upstream tomcatServer1 {
		server 192.168.88.136:9090;
	}

	# 配置一個代理即 tomcat2 服務器
	upstream tomcatServer2 {
		server 192.168.88.136:9091;
	}

	# 配置一個虛擬主機
	server {
		listen 80;
		server_name localhost;
		location / {
				# 域名 localhost 的請求全部轉發到https://www.baidu.com/服務上
				proxy_pass https://www.baidu.com/;
				# 歡迎頁面,按照從左到右的順序查找頁面
				index index.jsp index.html index.htm;
		}
	}
	
server {
		listen 80;
		server_name localhost;

		location / {
			# 域名 admin.web.itoken.funtl.com 的請求全部轉發到 tomcatserver2 即 tomcat2 服務上
			proxy_pass https://www.google.com/;
			index index.jsp index.html index.htm;
		}
	}
}	

一個server就是一個虛擬主機,可以配置多個

4、瀏覽器輸入localhost 出現百度頁面就說明反向代理配置成功
(這裏只是一個例子,在實際開發中域名用自己,轉發頁面自己指定)
在這裏插入圖片描述
Nginx負載均衡一些基礎知識:
nginx 的 upstream目前支持 5 種方式的分配
1)、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
2)、weight
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
比如:

	# 配置一個代理即 tomcat1 服務器
	upstream tomcatServer1 {
		server 192.168.88.136:9090 weight=2;
	}

	# 配置一個代理即 tomcat2 服務器
	upstream tomcatServer2 {
		server 192.168.88.136:9091 weight=1;
	}

3)、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
4)、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
5)、url_hash(第三方)

Nginx 負載均衡

什麼是負載均衡

負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。

負載均衡,英文名稱爲 Load Balance,其意思就是分攤到多個操作單元上進行執行,例如 Web 服務器、FTP 服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。

Nginx 實現負載均衡

  • tomcat1 服務器:192.168.88.136:9090
  • tomcat2 服務器:192.168.88.136:9091

1、編輯nginx.conf配置文件(windows版本的)
2、複製以下代碼到nginx.conf

user  nginx;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	
	# 配置一個代理即 mytomcat 服務器
	upstream mytomcat {
		server 192.168.88.136:9090;
		server 192.168.88.136:9091;
	}


	# 配置一個虛擬主機
	server {
		listen 80;
		server_name localhost;
		location / {
				proxy_pass http://mytomcat;
				# 歡迎頁面,按照從左到右的順序查找頁面
				index index.jsp index.html index.htm;
		}
	}

}

3、啓動nginx,瀏覽器訪問localhost nginx會輪詢訪問tomcat服務器:192.168.88.136:9090192.168.88.136:9091
這樣就實現了負載均衡

如果想指定輪詢機率修改nginx.conf文件(9090端口的tomcat優先級更高):

# 配置一個代理即 mytomcat 服務器
	upstream mytomcat {
		server 192.168.88.136:9090 weight=2;
		server 192.168.88.136:9091 weight=1;
	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章