基於nginx實現web伺服器的雙機熱備
1.適用場景
對於部署重要的服務,會使用兩臺伺服器,互相備份,共同執行同一服務。當一臺伺服器出現故障時,可以由另一臺伺服器承擔服務任務,從而在不需要人工干預的情況下,自動保證系統能持續提供服務。雙機熱備由備用的伺服器解決了在主伺服器故障時服務不中斷的問題。
2.nginx
nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。
3.方法
前提:
-
nginx環境
-
準備兩臺web伺服器
- 192.168.81.146
- 192.168.81.147
在兩臺機器上部署相同web服務,共用一套儲存裝置,其中146伺服器作為主伺服器,147作為備用伺服器。yii.nginx.com作為該web服務的域名。
步驟1. 配置nginx.conf檔案
在nginx.conf檔案裡新增如下程式碼
#雙機熱備方式 upstream yii.nginx.com { server 192.168.81.146:8080; server 192.168.81.147:8080 backup; } #反向代理配置 server { listen 80; server_name yii.nginx.com; charset utf-8; location /{ proxy_pass http://yii.nginx.com; } }
#對映到tomcat訪問路徑 #雙機熱備方式 upstream srm.rrswl.com_server { server 10.138.10.23:8080; server 10.138.10.24:8080; #會話保持 ip_hash; } #反向代理 server { #此處的80埠可以改為其他埠,nginx預設80可以改為8080,防止埠衝突上面的 #8080需要改為其他埠即可 listen 80; server_name 10.138.10.23; # individual nginx logs for this web vhost #日誌路徑即nginx安裝路徑 #啟動日誌報錯可刪除日誌 access_log /usr/local/nginx/logs/srm.rrswl-access.log main; error_log /usr/local/nginx/logs/srm.rrswl-error.log ; #訪問對映路徑 location =/ { rewrite ^ /srm-angular-bootstrap/login.html redirect ; } #靜態檔案載入 location / { proxy_pass http://srm.rrswl.com_server; gzip on; gzip_min_length 1k; gzip_buffers 16 64k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; gzip_vary on; gzip_disable "MSIE [1-6]\."; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_connect_timeout 3; proxy_read_timeout 600; proxy_send_timeout 600; proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
##############################################################
#對映到tomcat訪問路徑
#雙機熱備方式
#訪問域名
upstream srm.rrswl.com_server {
server 10.138.41.139:8080;
server 10.138.41.140:8080;
#會話保持
ip_hash;
}
#附件nginx配置
upstream srm.rrswl.com_8000_server {
server 10.138.231.185:8000;
server 10.138.231.186:8000;
ip_hash;
}
#反向代理
#作用:訪問80 自動跳轉到443 也就是htttp重定向到https
server {
listen 80;
server_name srm.rrswl.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
#listen 80;
listen 443 ssl;
server_name srm.rrswl.com;
#證書
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/server_rrswl.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/server_rrswl.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#日誌路徑即nginx安裝路徑
#啟動日誌報錯可刪除日誌
# individual nginx logs for this web vhost
access_log /usr/local/nginx/logs/srm.rrswl-access.log main;
error_log /usr/local/nginx/logs/srm.rrswl-error.log ;
#訪問對映路徑
location =/ {
rewrite ^ /srm-angular-bootstrap/login.html redirect ;
}
#靜態檔案載入
location / {
proxy_pass http://srm.rrswl.com_server;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_connect_timeout 3;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
#附件
server {
listen 8000 ssl;
server_name srm.rrswl.com;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/server_rrswl.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/server_rrswl.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
access_log /usr/local/nginx/logs/srm.rrswl_8000-access.log main;
error_log /usr/local/nginx/logs/srm.rrswl_8000-error.log ;
location / {
proxy_pass http://srm.rrswl.com_8000_server;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_connect_timeout 3;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 64k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
#雙機熱備方式
upstream server_backend{
server 10.138.10.23:8080;
server 10.138.10.24:8080;
}
#反向代理配置
server {
listen 80;
server_name 10.138.10.23;
charset utf-8;
location /{
proxy_pass http://server_backend/srm-angular-bootstrap/login.html;
}
}
訪問地址 http://10.138.10.23 自動對映到對應地址,在頁面端不要加埠
-
校驗nginx配置正確./nginx -t nginx重新啟動。在改了配置檔案的情況下:./nginx -s reload
說明:backup是利用nginx的熱備功能,這也是最典型的應用帶來的重要好處之一,當非backup Server能夠很好的為Client提供服務的時候,backup Server不對外界提供服務,此時backup Server處於冷狀態;當所有非backup Server不能很好的為Client提供服務的時候,backup Server為Client提供服務,做到了熱備,某臺或者所有非backup Web Server宕機不會影響整個Web專案的訪問功能,Web專案仍然可以為Client提供服務。
步驟2.啟動nginx
start nginx
步驟3.訪問域名http://yii.nginx.com
訪問http://yii.nginx.com域名,可以看到我們部署的web服務(我們看到的是146伺服器上部署的服務),如果此時192.168.81.146的伺服器出現故障,伺服器無法連線,nginx自動將請求轉發到備用伺服器192.168.81.147:8080上。通過nginx的主備機制,使得使用者訪問的web服務不會因為主伺服器的故障而無法訪問。
4.測試方法可行性
通過上述步驟,我們可以測試nginx對於雙機熱備是否可行,我們在146機器上部署tomcat7.0,在147機器上部署tomcat8.0,當146機器沒有故障時,訪問域名我們可以看到介面是tomcat7.0,當我們關閉146服務,重新訪問域名,訪問頁面是tocmat8.0,因此可以證明,當主伺服器出現故障時無法提供服務時,備用伺服器能代替主伺服器提供服務,保證服務的不中斷。
5.其他知識點
5.1關於nginx的反向代理
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。
反向代理方式實際上就是一臺負責轉發的代理伺服器,貌似充當了真正伺服器的功能,但實際上並不是,代理伺服器只是充當了轉發的作用,並且從真正的伺服器那裡取得返回的資料。這樣說,其實nginx完成的就是這樣的工作。我們讓nginx監聽一個埠,譬如80埠,但實際上我們轉發給在8080埠的tomcat,由它來處理真正的請求,當請求完成後,tomcat返回,但資料此時沒直接返回,而是直接給nginx,由nginx進行返回,這裡,我們會以為是nginx進行了處理,但實際上進行處理的是tomcat。
5.2關於雙機熱備
- 雙機熱備
從廣義上講,就是對於重要的服務,使用兩臺伺服器,互相備份,共同執行同一服務。當一臺伺服器出現故障時,可以由另一臺伺服器承擔服務任務,從而在不需要人工干預的情況下,自動保證系統能持續提供服務。雙機熱備由備用的伺服器解決了在主伺服器故障時服務不中斷的問題。
- 為什麼使用雙機熱備
雙機熱備針對的是伺服器的故障。
伺服器的故障可能由各種原因引起,如裝置故障、作業系統故障、軟體系統故障等等。
而對於一些重要系統而言,使用者是很難忍受這樣長時間的服務中斷的。因此,就需要通過雙機熱備,來避免長時間的服務中斷,保證系統長期、可靠的服務。
決定是否使用雙機熱備,正確的方法是要分析一下系統的重要性以及對服務中斷的容忍程度,以此決定是否使用雙機熱備。即,你的使用者能容忍多長時間恢復服務,如果服務不能恢復會造成多大的影響。
- 雙機熱備的三種實現方案
組成雙機熱備的方案主要的三種方式分別為:基於共享儲存(磁碟陣列)的方式,全冗餘方式和複製方式。
-
(1)基於共享儲存(磁碟陣列)的方式
共享儲存方式主要通過磁碟陣列提供切換後,對資料完整性和連續性的保障。使用者資料一般會放在磁碟陣列上,當主機宕機後,備機繼續從磁碟陣列上取得原有資料。如下圖所示
這種方式因為使用一臺儲存裝置,往往被業內人士稱為磁碟單點故障。但一般來講儲存的安全性較高。所以如果忽略儲存裝置故障的情況下,這種方式也是業內採用最多的熱備方式了。 -
image.png
-
(2)全冗餘方式
全冗餘方式就是雙機雙儲存,基於單臺儲存的傳統雙機熱備方式,確實存在儲存單點故障的情況,為實現儲存冗餘,儲存高可用也已經越來越多的被使用者接受。我們從理解上可以看出,雙機熱備最早是為解決伺服器的計劃性停機與非計劃性宕機的解決方案,但是我們無法實現儲存的計劃性停機與非計劃性宕機帶來的伺服器停機,而儲存作為雙機熱備中唯一儲存資料的裝置,它一旦發生故障往往會造成雙機熱備系統全面崩潰。 -
image.png
-
(3)
這種方式主要利用資料的同步方式,保證主備伺服器的資料一致性。 -
image.png
參考資料
http://www.cnblogs.com/Eric-5279/p/5479255.html
nginx實現跨域
在location / {}的配置里加上這個
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
作者:_Reality
連結:https://www.jianshu.com/p/db1f114182b1
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。