本次要分享的是利用windows+nginx+iis+redis+Task.MainForm組建分布式架構,由标題就能看出此内容不是一篇分享文章能說完的,是以我打算分幾篇分享文章來講解,一步一步實作分布式架構;下面将先給出整個架構的核心節點簡介,希望各位多多點贊:
. 架構設計圖展示
. nginx+iis建構服務叢集
. redis存儲分布式共享的session及共享session運作流程
. redis主從配置及Sentinel管理多個Redis叢集
. 定時架構
Task.MainForm提供資料給redis叢集儲存
以上是整個架構的我認為核心的部分,其中沒有包含有資料庫方面的設計(請忽略),下面先發張架構設計圖:

以上是個人的看法,下面來正式分享今天的文章吧(nginx+iis建構服務叢集):
. nginx常用基礎配置總結
. 用nginx搭建靜态檔案緩存服務
下面一步一個腳印的來分享:
首先,我們需要從網上下載下傳nginx服務檔案,具體windows系統下用何版本請網上搜尋,我這裡用的版本是nginx-1.10.1;下載下傳下來後目錄結構是這樣的:
我們需要了解并且操作的配置檔案是conf檔案夾下面的nginx.conf檔案,該目錄下的其他檔案一般采用預設的就行;打開檔案不看#号注釋的行;events節點:
events節點:
worker_connections:預設值1024,代表nginx服務位址的最大連接配接數1024;
http節點:
include:mime.types其實對應的是nginx.conf同級目錄下的mime.types檔案,裡面是能通路的mime類型
default_type:application/octet-stream預設類型
keepalive_timeout:連接配接逾時時間,機關秒
server節點:
listen:nginx監聽的端口号
server_name:服務名稱
location:路由設定(支援正規表達式);其中常用到的節點有
proxy_connect_timeout:nginx跟後端伺服器連接配接逾時時間(代理連接配接逾時)
proxy_pass:代理位址名稱
proxy_set_header:設定讓服務端擷取真實的Ip,端口等;對應的值有(Host,X-Real-IP,X-Forwarded-For)
upstream節點:
設定負載均衡的伺服器清單
設定代理位址名稱(和上面的proxy_pass對應)
設定負載均衡配置設定規則,常用規則有:
輪詢:挨個輪詢通路(預設)
ip_hash:通路一次後固定通路一個後端伺服器,可以解決session的問題
fair:後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定
weight:權重,值越大通路量越多
proxy_temp_path節點:代理臨時檔案夾路徑
proxy_cache_path節點:代理緩存檔案夾路徑(緩存檔案都在這裡)
以上介紹的資訊基本能完成一個負載均衡常用搭建了,其他的更詳細的節點請參考官網
通常分布式架構的一些css,js,圖檔檔案都是被緩存起來的,這樣提供高效的加載速度;由文章開頭時釋出的一張架構圖可以看到,使用者A要真實通路到服務叢集需要經過nginx這道伺服器轉發,這樣需要跳轉一次才能擷取到css靜态檔案明顯比直接在nginx伺服器就傳回這些檔案的速度慢;是以這種情況下就有了把靜态資源緩存到nginx服務上的需求了;下面先來看下nginx配置檔案需要的配置資訊:
#負載均衡的伺服器清單
upstream shenniu.test.com{
server 127.0.0.1:4041;
}
##cache##
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path D:/E/nginx-1.10.1/home/temp_dir;
proxy_cache_path D:/E/nginx-1.10.1/home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
##end##
注意這裡upstream節點後面的shenniu.test.com域名在後面會使用,節點裡面的server對應ip:端口如:server 127.0.0.1:4041(這個是真實的站點項目的ip+端口),然後需要設定儲存緩存檔案的路徑:proxy_cache_path和proxy_temp_path
然後server節點裡面listen監聽3031端口,server_name:shenniu.test.com,增加靜态資源路由配置
location ~ .*\.(gif|jpg|png|css|js|flv|ico|swf)(.*) {
#proxy_pass http://shenniu.file.com;
proxy_pass http://shenniu.test.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 30d; #緩存時長,這裡是30天
}
注意裡面反向代理的proxy_pass 對應的值http://+上面upstream節點的shenniu.test.com,是以就是proxy_pass http://shenniu.test.com這個位址就是通路代理的位址;直接shenniu.test.com域名,我們需要在本機的這個目錄結構C:\Windows\System32\drivers\etc中找到host檔案,然後裡面增加如:127.0.0.1 shenniu.test.com一樣代碼,這樣我們的域名就可以在本機的浏覽器中通路了;增加頁面的路由配置:
location ~ .*(\/|\.(html|htm))(.*) {
proxy_connect_timeout 90; #nginx跟後端伺服器連接配接逾時時間(代理連接配接逾時)
proxy_pass http://shenniu.test.com;
proxy_redirect default;
#服務端擷取真實的Ip,端口等
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
然後,我們還需要用iis釋出一個項目,名稱為ShenNiu.Stage01,對應的ip和端口是上面upstream節點裡面的資料:
然後,在浏覽器通路分别用ip和域名通路效果:
好這個是本地host配置域名通路,但是這還沒有用到nginx,因為咋們配置的nginx反向代理的端口是server節點裡面listen監聽3031端口,是以應該通路的是http://shenniu.test.com:3031/user/login位址,此時在浏覽器是通路不了該端口的,還需要咋們來啟動nginx服務:
好,現在使用nginx配置反向代理并第一次通路代理對應的站點程式,由于咋們配置的緩存檔案位址在D:/E/nginx-1.10.1/home/cache目錄,是以檢視檔案夾:
這裡面的就是緩存檔案所在的位置,此處問生成的緩存檔案夾;再來咋們第二次在浏覽器中通路網站,并F12檢視對應的js,css等檔案:
此時檔案的來源Server對應的是nginx服務,沒錯現在通路的就是nginx緩存的檔案了
上面的搭建靜态緩存服務其實大緻都涉及到了nginx用來做分發的功能,下面我們來快速在剛才的基礎增加一些節點資訊,搭建站點服務叢集;首先,我們修改upstream節點,内容資訊增加如:
#負載均衡的伺服器清單
upstream shenniu.test.com{
server 127.0.0.1:4041;
server 127.0.0.1:4040;
}
隻需要增加這段代碼,因為上面靜态檔案服務的時候已經增加了頁面的路由設定(可以往上看);為了示範分布式架構,我們還需要在iis中在配置個和ShenNiu.Stage01(對應的ip+端口:127.0.0.1:4041)站點一樣程式的站點ShenNiu.Stage02(對應的ip+端口:127.0.0.1:4040),但是把登陸頁的title分别标注為"系統01","系統02"這樣來區分通路到的是那個站點,配置好後下面我們來再重新加載nginx配置:
然後,通路反向代理位址http://shenniu.test.com:3031/user/login通路下頁面看到的效果如:
此時通路同樣的域名,得出的第一個頁面title是"系統01",第二個是"系統02",可以看出通路的站點分别對應的是127.0.0.1:4041和127.0.0.1:4040,也就是咋們配置的iis中的ShenNiu.Stage01和ShenNiu.Stage02,這樣nginx做分發站點就成功了,站點服務叢集就這樣建立成功了。
本篇分享的内容隻是nginx+iis做一個簡單的叢集,後面一篇的分享文章将講解redis存儲分布式共享的session及共享session運作流程,敬請期待也謝謝多多支援點贊。
git位址:
https://github.com/shenniubuxing3nuget釋出包:
https://www.nuget.org/profiles/shenniubuxing3