1. 程式人生 > >nginx upstream 配置實現多伺服器無感知切換

nginx upstream 配置實現多伺服器無感知切換

 在開發過程中,開發完成,完成測試階段,修復bug後都要重啟後臺服務,測試又在測試,每次重啟都要一兩分鐘,平凡的重啟,測試不幹了;所以想到就是部署兩臺伺服器;用nginx upstream 模組實現 無感知部署,發現一個bug,修復;直接部署不會打斷測試;

原來的測試環境部署的jenkins部署的,在一臺機器中部署了,現在要需要增加一個部署一臺機器;我們在jenkins的專案中部署指令碼中再部署一個專案;

部署思想:打時間差,就是先後部署這兩臺機器,控制好時間,保證有一臺機器可以使用;我在jenkins在部署的時候,用了一個sleep 100  來啟動間隔,間隔是100秒,100秒後臺,重新啟動第二臺伺服器;

伺服器1  : 192.168.1.120:7851

伺服器2  :  192.168.1.121:7851

廢話不多說,直接上配置檔案  test.conf (配置檔案直接上)

upstream adminProxy{
      server 192.168.1.120:7851 weight=2 max_fails=3 fail_timeout=100s;
      server 192.168.1.121:7851 weight=2  max_fails=3 fail_timeout=100s;
   }
 
 
server {
    listen 80;
    server_name dev.manage.com;
    root /home/work/app/dist;
    index index.html;
    location /sys  {
        proxy_pass http://adminProxy;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream http_502 http_504 error timeout invalid_header; 
    }
}

max_fails = 3 fail_timeout=100s  表示 ${fail_timeout}(100秒)時間內出現${max-fails}(3次)次失敗,就會把這個機器狀態置為down(下線),就是失敗$(fail_timeout)(100秒)時間後,會重新嘗試啟用這伺服器;

這樣就配置好一個兩臺伺服器負載均衡的配置了;

但是這還是不夠的;因為這樣的話,一個伺服器要被請求3次才會被下線,也就是說,會有3次錯誤的請求;返回502或者是error;

所以我們還要啟用proxy_next_upstream 功能: 在伺服器返回502,504,錯誤,超時 的時候;允許轉發到其他伺服器;

proxy_next_upstream http_502 http_504 error timeout invalid_header; 
啟用該功能需要在nginx.conf中新增 
proxy_next_upstream on
注:就是在部署這兩臺伺服器的時候,最好能夠和這邊nginx配置的伺服器失敗重試時間一致;這樣nginx失敗轉發就不會出錯,使用者也會無感知;

附上怎麼在jenkins中部署程式碼到另外一臺機器上:

步驟: 1、兩臺伺服器新增信任(ssh的互相信賴,這樣在遠端copy檔案執行指令碼的時候就不用密碼連線,不知道的可以百度)

           2、把jenkins編譯好的檔案遠端copy到第二臺伺服器中

           3、用jenkins遠端呼叫啟動指令碼

直接上指令碼:

jenkins 部署指令碼:

sleep 100
 
scp  ./admin/target/admin.jar  [email protected]:/home/work/withhold-feature/admin7851.jar
 
ssh [email protected] "/home/work/withhold-feature/start-jar.sh"
注:這個指令碼是在啟動第一臺伺服器(192.168.1.120)的時候執行,先停頓100s 在第一臺伺服器(192.168.1.120)啟動完成後,再重新啟動第二臺伺服器(129.168.1.121);

scp是把本地檔案拷貝到遠端伺服器中,然後用 ssh 遠端執行start-jar.sh  指令碼

在第二臺伺服器中的start-jar.sh 指令碼

pid=`ps -ef | grep admin7851.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
#!kill -9 強制終止
   echo "kill -9 的pid:" $pid
   kill -9 $pid
fi
 
cd /home/work/withhold-feature
 
nohup java -jar admin7851.jar --server.port=7851  --spring.profiles.active=test >/dev/null &

相關推薦

nginx upstream 配置實現伺服器感知切換

 在開發過程中,開發完成,完成測試階段,修復bug後都要重啟後臺服務,測試又在測試,每次重啟都要一兩分鐘,平凡的重啟,測試不幹了;所以想到就是部署兩臺伺服器;用nginx upstream 模組實現 無感知部署,發現一個bug,修復;直接部署不會打斷測試; 原來的測試環境部

nginx實現伺服器共用一個80埠

一、下載nginx。 我使用的版本是1.7.2 二、部署專案 下面我有兩個專案A和B,分別使用兩個tomcat:tomcatA和tomcatB,分別把專案A部署到tomcatA和專案B部署到tomcatB裡面去。 1. 找到tomcatA下的conf資料夾,找到server.xml檔案。修改埠號

nginx實驗---lnmp實現個虛擬主機,部署wordpress和phpmyadmin,並為後一個主機提供https

nginx php mariadb ca httpslnmp實現多個虛擬主機,部署wordpress和phpmyadmin,並為後一個主機提供https。 一、安裝nginx 方法一:編譯安裝1.下載nginx程序包,傳導至CentOS主機中,並解壓。2.進入解壓目錄3.~]# ./configure -

Nginx+Tomcat 配置實現負載均衡(附安裝包)

jsp color 一個 網頁 管理 密碼 bin pcr 解壓 實驗目的: Nginx 是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。 其特點是占有內存少,並發能力強,事實上nginx的

memcache通過hash取模演算法,實現伺服器存取值

<?php //封裝一個hash演算法類 class Mem{ //儲存memcache的伺服器個數 private $hostCount=''; //多個伺服器 private $host=[]; //構造方法用來給接收值,給屬性賦值 publi

nginx upstream實現

很多其他模組會呼叫該模組完成對後端伺服器的訪問 upstream模組還是一個http模組,所有它自己必須要實現一些特定的介面: 1.static ngx_command_t ngx_http_upstream_commands[] = { { ngx_string("upstream

Nginx反向代理實現個域名指向同一個ip的不同網站解決方法

一個伺服器需要掛載多個專案【重點是都能通過域名訪問】 實現原理: 1.當前市面上看到的一些伺服器,開放的埠一般都要求為 '80' 埠 所以80埠成了商用埠 2.域名的繫結是繫結一個一般是繫結你的伺服器ip地址 3.使用伺服器的80埠攔截訪問的域名是什麼跳轉至伺服器的其他 舉例 只有一臺伺服器

TP3.2 Nginx配置ThinkPhp入口訪問

thinkphp多入口配置後,入口index.php指向應用目錄=>app,入口admin.php指向後臺管理目錄=>admin在nginx下設定偽靜態(在nginx的配置檔案中): #ThinkPHP REWRITE支援if (!-e $request_filename) {rewrit

TP3.2 Nginx配置ThinkPhp入口訪問

目錄 一個 .com request www. 配置 tp3.2 $1 last thinkphp多入口配置後,入口index.php指向應用目錄=>app,入口admin.php指向後臺管理目錄=>admin在nginx下設置偽靜態(在nginx的配置文件中)

nginx利用try_files實現個源

col 作用 視頻 pre cep files 是否 err data 比如一個視頻網站,視頻資源分散在幾臺機器上,但是給用要提供統一的IP,路徑,端口。就需要nginx,先檢查本機是否有改文件,如果沒有就代理其他地方 location / { root /da

nginx upstream配置

2018年11月08日 18:19:26 chas_xing 閱讀數:8 標籤: nginx upstream

Python通過Manager方式實現關聯程序共享資料

Python實現多程序間通訊的方式有很多種,例如佇列,管道等。但是這些方式只適用於多個程序都是源於同一個父程序的情況。如果多個程序不是源於同一個父程序,只能用共享記憶體,訊號量等方式,但是這些方式對於複雜的資料結構,例如Queue,dict,list等,使用起來比較麻煩,不夠靈活。Manager是一種較為高階

PHP+ffmpeg+nginx配置實現視訊轉碼

最近專案中需要實現上傳視訊過程中自動轉碼MP4格式的功能,想到了用FFmpeg來實現它,但從來沒有操作過,查閱了很多資料,遇到了好多問題,現在終於安裝成功,覺得應該寫下來與人分享一下,以免有人遇到和我一樣的困境。 首先我是CentOs 6.7版本 環境是LNMP 我需要用P

在SpringBoot中配置個cache,實現個cacheManager靈活切換

SpringBoot配置多個cache,實現多個cacheManager靈活切換 注:本文所用的springBoot版本號為1.5.6.6 目的&效果 在springBoot中同時配置了RedisCache和ehCache,當使用@Cacheable註解

springboot+Mybatis配置實現資料來源

簡述 應公司需求,結合網上的許多資料和公司專案配置實現多資料來源。在此記錄一下配置過程,以供大家參考。 專案簡介 框架用的是SpringBoot+Mybatis,初始資料庫是MySQL,具體MySQL的整合在這裡不做詳細說明,要求是新增一個Oracle

nginx 基礎配置個location轉發任意請求或訪問靜態資原始檔

2018-08-10更新 server { #監聽的埠 listen 80; #監聽的域名 server_name l

Nginx 整合 FastDFS 實現檔案伺服器

  上一篇文章《[FastDFS 分散式檔案系統詳解](https://www.cnblogs.com/mrhelloworld/p/fastdfs.html)》中帶大家詳細瞭解它的核心概念,架構體系及 FastDFS 環境的搭建與使用。但是此時還無法通過 HTTP 對檔案進行訪問,這篇文章將帶大家解決這個問

基於spring實現資料來源通過註解切換

主要使用spring的AbstractRoutingDataSource實現,先簡單瞭解下AbstractRoutingDataSource 我們配置的多個數據源會放在AbstractRoutin

Android新增Activity,並實現Activity之間的切換

開啟 AndroidManifest.xml 找到節點 application 並增加 activity <activity android:name="TestActivity" android:theme="@style/AppTheme">

MFC實現TAB頁的切換

1. 新建一個MFC工程, 取名MyTab, 選擇Dialog based, 然後Finish. 2. 刪除對話方塊上預設新增的三個控制元件. 新增Tab Control控制元件並在Property屬性中設定ID為IDC_TABTEST 在More Styles裡勾上Bottom. 調速尺寸使其佈滿整個