天天看點

proxy_pass根據path路徑轉發時的"/"問題記錄

在nginx中配置proxy_pass時,如果是按照^~比對路徑時,要注意proxy_pass後的url最後的/。當加上了/,相當于是絕對根路徑,則nginx不會把location中比對的路徑部分代理走;如果沒有/,則會把比對的路徑部分也給代理走。

比如下面設定:
location ^~ /wangshibo/ 
{ 
proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com/; 
}
如上面的配置,如果請求的url是http://servername/wangshibo/test.html會被代理成http://js.test.com/test.html

而如果這麼配置
location ^~ /wangshibo/ 
{ 
proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com; 
}
則請求的url是http://servername/wangshibo/test.html會被代理到http://js.test.com/wangshibo/test.html

當然,可以用如下的rewrite來實作/的功能
location ^~ /wangshibo/ 
{ 
proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
rewrite /wangshibo/(.+)$ /$1 break; 
proxy_pass http://js.test.com; 
} 
      

=====================注意一些配置細節=========================

upstream bobo {
      ip_hash;
      server 192.168.10.73:80  max_fails=3 fail_timeout=15s;
      server 192.168.10.74:80  max_fails=3 fail_timeout=15s;
}
          
  server {
      listen      80;
      server_name bobo.kevin.com;
    
      access_log  /data/nginx/logs/bobo.kevin.com-access.log main;
      error_log  /data/nginx/logs/bobo.kevin.com-error.log;
    
 location / {
         proxy_pass http://bobo;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_buffer_size 256k;
         proxy_buffers 4 256k;
         proxy_busy_buffers_size 256k;
         proxy_temp_file_write_size 256k;
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
         proxy_max_temp_file_size 128m;
         #proxy_cache mycache;                                
         #proxy_cache_valid 200 302 1h; 
         #proxy_cache_valid 301 1d;
         #proxy_cache_valid any 1m;
        }

 location /los/ {
         proxy_pass http://fvt.kevin.com;
        }
}

 location /han/ {
         proxy_pass http://dcc.kevin.com/;
        }
}

解釋說明:
1)通路http://bobo.kevin.com的請求會負載分發到192.168.10.73:80和192.168.10.74:80上面
2)通路http://bobo.kevin.com/los/.... 會代理跳轉到http://fvt.kevin.com/los/.... 上面
3)通路http://bobo.kevin.com/han/.... 會代理跳轉到http://dcc.kevin.com/.... 上面
4)注意proxy_pass跳轉upstream子產品時的配置和跳轉到一個完整url的配置(後者不需要加那些header配置以及健康檢查配置)      

如下面一個配置執行個體

1)第一種配置
[root@BJLX_16_202_V vhosts]# cat ssl-wangshibo.conf
upstream at {
    server 192.168.1.202:8080 max_fails=3 fail_timeout=30s;
}
  
server {
   listen 443;
   server_name www.wangshibo.com;
   ssl on;
  
   ### SSL log files ###
   access_log logs/wangshibo_access.log;
   error_log logs/wangshibo_error.log;
  
### SSL cert files ###
   ssl_certificate ssl/wang.cer;    
   ssl_certificate_key ssl/wang.key; 
  
   location /attendance/ {
   proxy_pass http://at;                                                          //不需要加上"/"                     
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
       }
  
}
  
通路https://www.wangshibo.com/attendance/和http://192.168.1.202:8080/attendance結果是一緻的。
  
2)第二種配置
[root@BJLX_16_202_V vhosts]# cat ssl-wangshibo.conf
upstream at {
    server 192.168.1.202:8080 max_fails=3 fail_timeout=30s;
}
  
server {
   listen 443;
   server_name www.wangshibo.com;
   ssl on;
  
   ### SSL log files ###
   access_log logs/wangshibo_access.log;
   error_log logs/wangshibo_error.log;
  
### SSL cert files ###
   ssl_certificate ssl/wang.cer;    
   ssl_certificate_key ssl/wang.key; 
  
   location / {
   proxy_pass http://at/attendance/;                                                  //一定要加上"/"                         
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
       }
  
}
  
通路https://www.wangshibo.com和http://192.168.1.202:8080/attendance結果是一緻的。      

如下配置,想要實作的需求:

192.168.1.27是後端的real server,8080端口是公司的ehr人事系統端口。

又由于該系統涉及到微信接口通路,即http://ehr.wang.com/attendance和http://ehr.wang.com/app

由于是内部系統,安全考慮,是以要求:

1)登入ehr人事系統的時候要求使用内網登入,即http://192.168.1.27:8080,通路前要先登入公司VPN

2)登入微信接口http://ehr.wang.com/attendance和http://ehr.wang.com/app使用外網登入,即使用解析後域名登入。

3)通路http://ehr.wang.com,強制跳轉為https://ehr.wang.com/attendance

[root@BJLX_4_21_P vhosts]# cat ehr.conf 
server {
    listen 80;
    server_name ehr.wang.com;
  
    access_log  logs/ehr_access.log;
    error_log   logs/ehr_error.log;
 
    return      301 https://$server_name$request_uri;      
}

[root@BJLX_4_21_P vhosts]# cat ssl-ehr.conf
upstream ehr {
    server 192.168.1.27:8080 max_fails=3 fail_timeout=30s;
}

server {
   listen 443;
   server_name ehr.wang.com;
   ssl on;

   ### SSL log files ### 
   access_log logs/ehr_access.log; 
   error_log logs/ehr_error.log; 

### SSL cert files ### 
   ssl_certificate ssl/wang.cer;      
   ssl_certificate_key ssl/wang.key;   
   #ssl_session_timeout 5m;

   location / {
       return  301  https://ehr.wang.com/attendance;
   }

   location /attendance/ {
   proxy_pass http://ehr;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   #proxy_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }

   location /app/ {
   proxy_pass http://ehr;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   #proxy_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }

}

注意:
由于從浏覽器通路(http)到源站的real server之間要經過Nginx反向代理層(https)
需要将proxy_set_header X-Forwarded-Proto https;這一行注釋掉,否則上面的配置無效。
如果中間沒有代理層,直接是在real server本機進行nginx的反向代理(即本機nginx反代到本機的8080端口),則這個參數無需注釋(已經過驗證)
      

---------------------------------------------------------------------------------------------------------------------------------------

再看下面一個需求:
通路https://toc.wang.com/storage/file/​  反向代理到http://192.168.80.105:80/storage/file​/
通路https://toc.wang.com/storage/file/uploadOne  反向代理到http://192.168.80.130:8080/storage/file/uploadOne
通路https://toc.wang.com/storage/file/upload​    反向代理到http://192.168.80.130:8080/storage/file/upload
通路其他https://toc.wang.com的url  反向代理到http://192.168.80.105:8080
   
在nginx的LB層的反向代理配置如下:
[root@nginx-web01 vhosts]# cat ssl-toc.conf
upstream toc-105-80 {
    server 192.168.80.105:80 max_fails=3 fail_timeout=10s;
}
   
upstream toc-130-8080-1 {
    server 192.168.80.130:8080 max_fails=3 fail_timeout=10s;
}
   
upstream toc-130-8080-2 {
    server 192.168.80.130:8080 max_fails=3 fail_timeout=10s;
}
   
upstream toc-105-8080 {
    server 192.168.80.105:8080 max_fails=3 fail_timeout=10s;
}
   
server {
   listen 443;
   server_name toc.wang.com;
   ssl on;
   
   ### SSL log files ###
   access_log logs/toc_access.log;
   error_log  logs/toc_error.log;
   
### SSL cert files ###
   ssl_certificate ssl/wang.cer;   
   ssl_certificate_key ssl/wang.key;
#  ssl_session_timeout 5m;
      
   location /storage/file/ {
   proxy_pass http://toc-105-80/storage/file/;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }
   
   location /storage/file/uploadOne {
   proxy_pass http://toc-130-8080-1/storage/file/uploadOne;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }
   
   location /storage/file/upload {
   proxy_pass http://toc-130-8080-2/storage/file/upload;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }
   
   location / {
   proxy_pass http://toc-105-8080;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }
   
}
  
--------------------------------------------------------------------------------------------------
通路外網位址https://test.wang.com/storage/* 反向代理到内網位址 http://storage.wang-inc.com​/*,即實作外網的連結通路到内網的檔案位址。
  
1)内網url的配置
[root@lb-ng01 vhosts]# cat storage.wang-inc.conf
upstream storage {
    server 192.168.1.25:8080 max_fails=3 fail_timeout=10s;
    server 192.168.1.26:8080 max_fails=3 fail_timeout=10s;
}
  
server {
    listen 80;
    server_name storage.wang-inc.com storage.wang.cn;
    
    access_log  logs/storage_access.log main;
    error_log   logs/storage_error.log;
   
   location / {
   proxy_pass http://storage;                                    
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_redirect off;
    }
  
    }
  
2)外網反向代理配置
[root@nginx-web01 vhosts]# cat ssl-test.conf
upstream storage {
    server 192.168.1.25:8080 max_fails=3 fail_timeout=10s;
    server 192.168.1.26:8080 max_fails=3 fail_timeout=10s;
}
  
server {
   listen 443;
   server_name test.wang.com;
   ssl on;
  
   ### SSL log files ###
   access_log logs/test_access.log main;
   error_log logs/test_error.log;
  
### SSL cert files ###
   ssl_certificate ssl/wang.cer;    
   ssl_certificate_key ssl/wang.key; 
   ssl_session_timeout 5m;
  
   location /storage/ {
   proxy_pass http://storage/;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }
  
}
 
-------------------------------------------------------------------------------------------------
通路http://im.wang.com/_matrix/push/v1/notify  反向代理到192.168.1.36的5000端口
 
[root@nginx-web01 vhosts]# cat im.conf
upstream matrix {
    server 192.168.1.36:5000 max_fails=3 fail_timeout=10s;
}
 
server {
    listen 80;
    server_name im.wang.com;
   
    access_log  logs/im_access.log main;
    error_log   logs/im_error.log;
 
 location /_matrix/push/v1/notify {
   proxy_pass http://matrix;
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   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_set_header X-Forwarded-Proto https;
   proxy_redirect off;
   }
  
    }      

HTTP頭域(proxy_set_header)清單與解釋

HTTP 頭域是HTTP協定中請求(request)和響應(response)中的頭部資訊,其實就是HTTP通信的操作參數,告訴web伺服器和浏覽器怎樣處理這個通信。

HTTP頭從一個請求資訊或者響應資訊的第二行開始(第一行是請求行或者響應行),以兩個CR-LF字元組結束(CR:回車符,\r,LF:換行符\n)

而每個HTTP頭是字元串形式的,用冒号分割的鍵值對,多個HTTP頭之間用CR-LF字元組隔開。

某些http頭可以有注釋,例如user-agent,server,via。但這些注釋會被伺服器或者浏覽器忽略IETF組織已經将一些核心的HTTP頭定義在RFC2616規範中,

這些HTTP頭是每個基于HTTP協定的軟體必須實作的,而其他一些更新和擴充的頭域也必須被基于HTTP的軟體實作。當然,各個軟體也可以定義自己的頭域。

另一方面,RFC2616規範中并沒有限制每個HTTP頭的長度,或者限制HTTP頭的數量,但出于性能和安全的考慮,多數伺服器都會自己作規定,例如apache2.3

就規定每個HTTP頭不能超過8190個位元組,每個請求不能超過100個HTTP頭。

以下來看看發送一個請求(request)時候,可能包含的各個HTTP頭和它的解釋。

------------标準的請求頭------------

Accept: 浏覽器(或者其他基于HTTP的用戶端程式)可以接收的内容類型(Content-types),例如 Accept: text/plain

Accept-Charset:浏覽器能識别的字元集,例如 Accept-Charset: utf-8

Accept-Encoding:浏覽器可以處理的編碼方式,注意這裡的編碼方式有别于字元集,這裡的編碼方式通常指gzip,deflate等。
                 例如 Accept-Encoding: gzip, deflate

Accept-Language:浏覽器接收的語言,其實也就是使用者在什麼語言地區,例如簡體中文的就是 Accept-Language: zh-CN

Authorization:在HTTP中,伺服器可以對一些資源進行認證保護,如果你要通路這些資源,就要提供使用者名和密碼,這個使用者名和密碼就是在Authorization
              頭中附帶的,格式是“username:password”字元串的base64編碼,例如:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==中,
              basic指使用basic認證方式, QWxhZGRpbjpvcGVuIHNlc2FtZQ==使用base64解碼就是“Aladdin:open sesame”

Cache-Control:這個指令在request和response中都有,用來訓示緩存系統(伺服器上的,或者浏覽器上的)應該怎樣處理緩存,因為這個頭域比較重要,
               特别是希望使用緩 存改善性能的時候,内容也較多,是以我想在下一篇博文中主要介紹一下。

Connection:告訴伺服器這個user agent(通常就是浏覽器)想要使用怎樣的連接配接方式。值有keep-alive和close。http1.1預設是keep-alive。keep-alive就是
            浏覽器和伺服器 的通信連接配接會被持續儲存,不會馬上關閉,而close就會在response後馬上關閉。但這裡要注意一點,我們說HTTP是無狀态的,跟
            這個是否keep-alive沒有關系,不要認為keep-alive是對HTTP無狀态的特性的改進。

Cookie:浏覽器向伺服器發送請求時發送cookie,或者伺服器向浏覽器附加cookie,就是将cookie附近在這裡的。例如:Cookie:user=admin

Content-Length:一個請求的請求體的記憶體長度,機關為位元組(byte)。請求體是指在HTTP頭結束後,兩個CR-LF字元組之後的内容,
               常見的有POST送出的表單資料,這個Content-Length并不包含請求行和HTTP頭的資料長度。

Content-MD5:使用base64進行了編碼的請求體的MD5校驗和。例如:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==

Content-Type:請求體中的内容的mime類型。通常隻會用在POST和PUT方法的請求中。例如:Content-Type: application/x-www-form-urlencoded

Date:發送請求時的GMT時間。例如:Date: Tue, 15 Nov 1994 08:12:31 GMT

Expect:訓示需要使用伺服器某些特殊的功能。(這個我不是很清楚)

From:發送這個請求的使用者的email位址。例如:From: [email protected]

Host:被伺服器的域名或IP位址,如果不是通用端口,還包含該端口号,例如:Host: www.some.com:182

If-Match:通常用在使用PUT方法對伺服器資源進行更新的請求中,意思就是,詢問伺服器,現在正在請求的資源的tag和這個If-Match的tag相不相同,如果相同,
         則證明伺服器上的這個資源還是舊的,現在可以被更新,如果不相同,則證明該資源被更新過,現在就不用再更新了(否則有可能覆寫掉其他人所做的更改)。

If-Modified-Since:詢問伺服器現在正在請求的資源在某個時間以來有沒有被修改過,如果沒有,伺服器則傳回304狀态來告訴浏覽器使用浏覽器自己本地的緩存,
                   如果有修改過,則傳回200,并發送新的資源(當然如果資源不存在,則傳回404。)

If-None-Match:和If-Modified-Since用意差不多,不過不是根據時間來确定,而是根據一個叫ETag的東西來确定。關于etag我想在下一篇部落格介紹一下。

If-Range:告訴伺服器如果這個資源沒有更改過(根據If-Range後面給出的Etag判斷),就發送這個資源中在浏覽器缺少了的某些部分給浏覽器,
          如果該資源以及被修改過,則将整個資源重新發送一份給浏覽器。

If-Unmodified-Since:詢問伺服器現在正在請求的資源在某個時刻以來是否沒有被修改過。

Max-Forwards:限制請求資訊在代理伺服器或網關中向前傳遞的次數。

Pragma:好像隻有一個值,就是:no-cache。Pragma:no-cache 與cache-control:no-cache相同,隻不過cache-control:no-cache是http1.1專門指定的,
        而Pragma:no-cache可以在http1.0和1.1中使用

Proxy-Authorization:連接配接到某個代理時使用的身份認證資訊,跟Authorization頭差不多。例如:Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Range:在HTTP頭中,"Range"字眼都表示“資源的byte形式資料的順序排列,并且取其某一段資料”的意思。Range頭就是表示請求資源的從某個數值到某個數值間的資料,
       例如:Range: bytes=500-999 就是表示請求資源從500到999byte的資料。資料的分段下載下傳和多線程下載下傳就是利用這個實作的。

Referer:指目前請求的URL是在什麼位址引用的。例如在www.a.com/index.html頁面中點選一個指向www.b.com的超連結,
         那麼,這個www.b.com的請求中的Referer就是www.a.com/index.html。通常我們見到的圖檔防盜鍊就是用這個實作的。

Upgrade:請求伺服器更新至另外一個協定,例如:Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

User-Agent:通常就是使用者的浏覽器相關資訊。例如:User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0

Via:用來記錄一個請求經過了哪些代理或網關才被送到目标伺服器上。例如一個請求從浏覽器出發(假設使用http/1.0),發送給名為 SomeProxy的内部代理,
    然後被轉發至www.somenet.com的公共代理(使用http/1.1),最後被轉發至目标伺服器www.someweb.com,那麼在someweb.com中收到的via 頭應該是:
    via:1.0 someProxy 1.1 www.someweb.com(apache 1.1)

Warning:記錄一些警告資訊。
      

------------通用但非标準的HTTP頭(通常,非标準的頭域都是用“X-”開頭,例如"x-powered-by")------------

X-Requested-With:主要是用來識别ajax請求,很多javascript架構會發送這個頭域(值為XMLHttpRequest)

DNT:DO NOT TRACK的縮寫,要求伺服器程式不要跟蹤記錄使用者資訊。DNT: 1 (開啟DNT) DNT: 0 (關閉DNT)火狐,safari,IE9都支援這個頭域,
    并且于2011年3月7日被送出至IETF組織實作标準化

X-Forwarded-For:記錄一個請求從用戶端出發到目标伺服器過程中經曆的代理,或者負載平衡裝置的IP。

X-Forwarded-Proto:記錄一個請求最初從浏覽器發出時候,是使用什麼協定。因為有可能當一個請求最初和反向代理通信時,是使用https,
                   但反向代理和伺服器通信時改變成http協定,這個時候,X-Forwarded-Proto的值應該是https

Front-End-Https:微軟使用與其負載平衡的一個頭域。

X-ATT-DeviceId:AT&A的産品中使用的頭域,不過不是很清楚用途。      

------------------曾經注釋"proxy_set_header X-Forwarded-Proto https;"的一個坑-------------------

通路問卷系統https://wj.wang.com/limesurvey/index.php/admin/authentication/sa/login,登入的時候自動跳轉到了公司官網首頁。

這個問卷系統隻能通過https方式通路,http方式通路的都自動跳轉到公司官網。

原因就是因為在nginx代理層注釋了這個參數:
[root@nginx-web01 vhosts]# cat ssl-wj.conf 
upstream ssl-wj {
    server 192.168.1.22:10086 max_fails=3 fail_timeout=10s;
}

server {
   listen 443;
   server_name wj.wang.com;
   ssl on;

   ### SSL log files ### 
   access_log logs/wj_access.log; 
   error_log logs/wj_error.log; 

### SSL cert files ### 
   ssl_certificate ssl/wang.cer;      
   ssl_certificate_key ssl/wang.key;   
   ssl_session_timeout 5m;

   location / {
   proxy_pass http://ssl-wj/;                                      
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; 
   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_set_header X-Forwarded-Proto https;                                 //打開這個參數的注釋即可
   proxy_redirect off; 
   }
}
      

=======================================================================

如下Nginx代理轉發需求:

通路http://grace.kevin.com的80端口的請求,轉發至後端192.168.10.173和192.168.10.174的80端口(這部分是靜态頁的請求)。

當通路位址中比對/leasecore/、/cms/api/、/cap/api/、/crm/api/、/cms/third/的上下文path時,轉發至192.168.10.173和192.168.10.173的8080端口(tomcat處理)

LB層的Nginx轉發配置:
===============================================================
[root@inner-lb01 vhosts]# cat grace.kevin.com.conf
upstream zl-80 {
      server 192.168.10.173:80 max_fails=3 fail_timeout=15s;
      server 192.168.10.174:80 max_fails=3 fail_timeout=15s;
}

upstream leasecore {
      server 192.168.10.173:8080 max_fails=3 fail_timeout=15s;
      server 192.168.10.174:8080 max_fails=3 fail_timeout=15s;
}

upstream cms-api {
      server 192.168.10.173:8080 max_fails=3 fail_timeout=15s;
      server 192.168.10.174:8080 max_fails=3 fail_timeout=15s;
}

upstream cap-api {
      server 192.168.10.173:8080 max_fails=3 fail_timeout=15s;
      server 192.168.10.174:8080 max_fails=3 fail_timeout=15s;
}

upstream crm-api {
      server 192.168.10.173:8080 max_fails=3 fail_timeout=15s;
      server 192.168.10.174:8080 max_fails=3 fail_timeout=15s;
}

upstream cms-third {
      server 192.168.10.173:8080 max_fails=3 fail_timeout=15s;
      server 192.168.10.174:8080 max_fails=3 fail_timeout=15s;
}
          
   server {
      listen      80;
      server_name grace.kevin.com;
    
      access_log  /data/nginx/logs/grace.kevin.com-access.log main;
      error_log  /data/nginx/logs/grace.kevin.com-error.log;

   location / {
         proxy_pass http://zl-80;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_ignore_client_abort on;
         proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
         proxy_max_temp_file_size 128m;
        }

   location ^~ /leasecore/ {
         proxy_pass http://leasecore;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_ignore_client_abort on;
         proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
         proxy_max_temp_file_size 128m;
        }


   location ^~ /cms/api/ {
         proxy_pass http://cms-api;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_ignore_client_abort on;
         proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
         proxy_max_temp_file_size 128m;
        }

   location ^~ /cap/api/ {
         proxy_pass http://cap-api;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_ignore_client_abort on;
         proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
         proxy_max_temp_file_size 128m;
        }

   location ^~ /crm/api/ {
         proxy_pass http://crm-api;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_ignore_client_abort on;
         proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
         proxy_max_temp_file_size 128m;
        }

   location ^~ /cms/third/ {
         proxy_pass http://cms-third;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 600;
         proxy_ignore_client_abort on;
         proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
         proxy_max_temp_file_size 128m;
        }
                      
}


後端192.168.10.173和192.168.10.174的nginx配置
==============================================================
[root@zl-app02 ~]# cat /data/nginx/conf/vhosts/uatzl-zpp.conf
   server {
      listen      80;
      server_name uatzl-app02.kevin.cn;
    
      access_log  /data/nginx/logs/access.log main;
      error_log  /data/nginx/logs/error.log;
    

   location / {
      root   /data/lease_app/dist;
      index  index.html index.htm;
   }
                      
}

[root@zl-app02 ~]# ps -ef|grep tomcat
app      28224     1  0 Dec13 ?        00:06:00 /data/jdk1.8.0_121/bin/java -Djava.util.logging.config.file=/data/tomcat-8.0.47/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Djava.endorsed.dirs=/data/tomcat-8.0.47/endorsed -classpath /data/tomcat-8.0.47/bin/bootstrap.jar:/data/tomcat-8.0.47/bin/tomcat-juli.jar -Dcatalina.base=/data/tomcat-8.0.47 -Dcatalina.home=/data/tomcat-8.0.47 -Djava.io.tmpdir=/data/tomcat-8.0.47/temp org.apache.catalina.startup.Bootstrap start
root     32535 32509  0 14:38 pts/1    00:00:00 grep tomcat
      
順便貼個配置案例:
比如:通路http://www.kevin.com 跳轉到http://192.168.1.20:9040/portal-pc/

upstream scf_cluster {
    ip_hash;
    server 192.168.1.20:9020;
    server 192.168.1.21:9020;
    }
upstream portal_cluster {
    ip_hash;
    server 192.168.1.20:9040;
    server 192.168.1.21:9040;
    }
upstream file_cluster{
    ip_hash;
    server 192.168.1.20:9020;
    }
upstream workflow_cluster{
    ip_hash;
    server 192.168.1.20:9020;
    server 192.168.1.21:9020;
    }
upstream batch_cluster{
    server 192.168.1.20:9020;
    server 192.168.1.21:9020;
    }
upstream mobi_cluster{
    server 192.168.1.20:8080;
    }

server {
        listen       80;
        server_name  www.kevin.com;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


        location /scf {
            proxy_pass http://scf_cluster/scf;
            proxy_redirect  http://scf_cluster/scf http://www.kevin.com/scf;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


       location / {
            proxy_pass http://portal_cluster/portal-pc/;
            proxy_redirect  http://portal_cluster/portal-pc/ http://www.kevin.com/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /msdp-file {
            proxy_pass http://file_cluster/msdp-file;
            proxy_redirect  http://file_cluster/msdp-file http://www.kevin.com/msdp-file;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
    location /upload {
            proxy_pass http://file_cluster/upload;
            proxy_redirect  http://file_cluster/upload http://www.kevin.com/upload;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        
        location /activiti-workflow-console {
            proxy_pass http://workflow_cluster/activiti-workflow-console;
            proxy_redirect  http://workflow_cluster/activiti-workflow-console http://www.kevin.com/activiti-workflow-console;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    location /batch-framework-web {
            proxy_pass http://batch_cluster/batch-framework-web;
            proxy_redirect  http://batch_cluster/batch-framework-web http://www.kevin.com/batch-framework-web;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }  
}

server {
        listen       80;
        server_name  mobi.kevin.com;
    location / {
            proxy_pass http://mobi_cluster;
            proxy_redirect  http://mobi_cluster/ http://mobi.kevin.com/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        } 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        } 
}
server{
        listen       80;
        server_name  kevin.com;
        rewrite ^(.*)$ https://www.kevin.com$1 permanent;
 }      

*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************