Nginx集群是.NET WebApi提供了負載均衡的其中一種實現方式,同時還增加了SSL認證,能夠確保WebApi能夠以加密形式進行響應。Nginx使用其中的SSL模塊,能夠支持HTTPS的配置,當然也能夠讓HTTP與HTTPS並存(只需要增加listen 80監聽埠則可),本文主要實現HTTP... ...
目錄
1 大概思路... 1
2 Nginx集群之SSL證書的WebApi微服務... 1
3 HTTP與HTTPS(SSL協議)... 1
4 Openssl生成SSL證書... 2
5 編寫.NET WebApi 3
6 部署WebApi到區域網內3台PC機... 5
7 Nginx集群配置搭建... 6
8 運行結果... 8
9 總結... 9
1 大概思路
l Nginx集群之SSL證書的WebApi微服務
l HTTP與HTTPS(SSL協議)
l Openssl生成SSL證書
l 編寫.NET WebApi
l 部署WebApi到區域網內3台PC機
l Nginx集群配置搭建
l 運行結果
l 總結
2 Nginx集群之SSL證書的WebApi微服務
Nginx集群是.NET WebApi提供了負載均衡的其中一種實現方式,同時還增加了SSL認證,能夠確保WebApi能夠以加密形式進行響應。Nginx使用其中的SSL模塊,能夠支持HTTPS的配置,當然也能夠讓HTTP與HTTPS並存(只需要增加listen 80監聽埠則可),本文主要實現HTTP訪問則跳轉至以HTTPS方式。
以下是本文講述的主要結構圖:
客戶端訪問Nginx的功能變數名稱zhyongfeng.com,然後Nginx進行負載均衡,返回https的響應。Nginx集群之SSL證書的WepApi微服務架構,如下圖所示:
3 HTTP與HTTPS(SSL協議)
HTTP(HyperText Transfer Protocol)超文本傳輸協議是互聯網上應用最為廣泛的一種網路協議。所有的WWW文件都必須遵守這個標準。
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議:它是一個安全通信通道,它基於HTTP開發,用於在客戶電腦和伺服器之間交換信息,它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
HTTPS和HTTP的區別:
l https協議需要到ca申請證書,一般免費證書很少,需要交費。
l http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
l http和https使用的是完全不同的連接方式用的埠也不一樣,前者是80,後者是443。
l http的連接很簡單,是無狀態的。
l HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全。
4 Openssl生成SSL證書
OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。
本文安裝了Visualbox虛擬機,內裝了Linux Ubuntu系統,所以使用內置的openssl,具體生成SSL證書命令行如下:
(Windows下可以到https://www.openssl.org/source/下載,使用ActivePerl安裝Openssl):
自行頒發不受瀏覽器信任的SSL證書,先生成一個RSA密鑰
zhyongfeng@zhyongfeng-VirtualBox:~$ openssl genrsa -des3 -out server.key 1024
拷貝一個不需要輸入密碼的密鑰文件
zhyongfeng@zhyongfeng-VirtualBox:~$ openssl rsa -in server.key -out server_nopass.key
生成一個證書請求,會提示輸入省份、城市、功能變數名稱信息等,重要的是,email一定要是你的功能變數名稱尾碼的。這樣就有一個 csr 文件了,提交給 ssl 提供商的時候就是這個 csr 文件。
zhyongfeng@zhyongfeng-VirtualBox:~$ openssl req -new -key server.key -out server.csr
自己簽發證書
zhyongfeng@zhyongfeng-VirtualBox:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out
如下圖所示:
5 編寫.NET WebApi
UserController.cs
using System.Net; using System.Web.Http; namespace SSLWebApi.Controllers { [RoutePrefix("api/User")] public class UserController : ApiController { /// <summary> /// 獲取當前用戶信息 /// </summary> /// <param name="msg"></param> /// <returns></returns> [HttpPost] [Route("PostMessage")] public string PostMessage([FromBody]string msg) { return string.Format("當前輸入的消息是:{0}", msg); } [Route("GetMachine")] public string GetMachine() { string AddressIP = string.Empty; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); } } return string.Format("當前系統的IP是:{0}", AddressIP); } } }
安裝Microsoft.AspNet.WebApi.HelpPage
註冊HelpPage頁面:
Global.asax
using System.Web.Http; using System.Web.Mvc; namespace SSLWebApi { public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { //註冊HelpPage頁面 AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); } } }
編譯後如下:
6 部署WebApi到區域網內3台PC機
將WebApi部署到以下10.92.202.56的3台PC機
7 Nginx集群配置搭建
通過自主義功能變數名稱zhyongfeng.com:80埠進行負載均衡集群訪問,則訪問C:\Windows\System32\drivers\etc\hosts,添加下列“本機IP 自定義的功能變數名稱”:
10.93.85.66 zhyongfeng.com
Nginx的localhost配置如下:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # HTTPS server server { listen 443 ssl; server_name localhost; ssl_certificate server.crt; ssl_certificate_key server_nopass.key; location / { root html; index index.html index.htm; } } }
Nginx的集群配置:
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #server { # listen 80; # server_name localhost; # location / { # root html; # index index.html index.htm; # } # error_page 500 502 503 504 /50x.html; # location = /50x.html { # root html; # } #} upstream zhyongfeng.com { server 10.92.202.56:560; server 10.92.202.57:570; server 10.92.202.58:580; } server { listen 80; server_name zhyongfeng.com; rewrite ^(.*)$ https://$host$1 permanent; } # HTTPS server # server { listen 443 ssl; server_name zhyongfeng.com; ssl_certificate server.crt; ssl_certificate_key server_nopass.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; location / { proxy_pass http://zhyongfeng.com; } } }
運行CMD:
D:\DTLDownLoads\nginx-1.10.2>start nginx
D:\DTLDownLoads\nginx-1.10.2>nginx -s reload
8 運行結果
Nginx的localhost配置運行結果:
Nginx的集群配置運行結果:
9 總結
Nginx使用SSL模塊可以支持WebApi的https訪問,增加了訪問的安全性。SSL模塊,具體可以參考Nginx中文文檔http://www.nginx.cn/doc/的SSL*模塊。WebApi基於SSL協議數據傳輸的加密, 保證了通信的安全性。SSL的功能包含了建立伺服器與客戶之間安全的數據通道、伺服器對客戶的身份認證(如公鑰、私鑰)等。
源代碼下載:
http://download.csdn.net/download/ruby_matlab/10138057
PDF下載: