2015-08-14 164 views
0

我有,我需要做的proxy_pass變量的問題,但是,當我讓一個變量,它未能在後端服務器上正確解析Nginx的proxy_pass與斜線變量無法

nginx -v 
nginx version: nginx/1.6.2 

這是工作之一:

server { 
    listen 443 ssl; 
    ssl on; 
    server_name api.hostname.com; 

    include ssl_params; 

    location = /v1 { 
     return 302 /v1/; 
    } 

    location /v1/ { 
     proxy_pass  http://internal-api.hostname.com.us-east-1.elb.amazonaws.com/; 
     proxy_set_header Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    } 

這是一個已損壞一個

server { 
    listen 443 ssl; 
    ssl on; 
    server_name api.hostname.com; 

    include ssl_params; 

    location = /v1 { 
     return 302 /v1/; 
    } 

    location /v1/ { 
     resolver 10.0.0.2; 
     set $backend "http://internal-api.hostname.com.us-east-1.elb.amazonaws.com/"; 
     proxy_pass  $backend; 
     proxy_set_header Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    } 

後端結果FO在工作一個R https://api.hostname.com/v1/profile是:

<-- GET /profile 
--> GET /profile 200 16ms 349b 

但在打破一個

<-- GET/
--> GET/401 1ms 12b 

我已經試過:

set $backend "internal-api.hostname.com.us-east-1.elb.amazonaws.com"; 
proxy_pass http://$backend/ 

set $backend "internal-api.hostname.com.us-east-1.elb.amazonaws.com/"; 
proxy_pass http://$backend/ 

任何時候,我使用的proxy_pass變量,它將所有內容轉發到後端的/(根),絕對不是我想要的。

+0

*我需要使proxy_pass成爲一個變量* ...我正在研究這個,但我也很好奇它爲什麼需要變量。是不是因爲後端的IP地址發生變化,但nginx已經緩存了後端查找,並且沒有根據需要再次嘗試解析它? –

+0

我懷疑使用一個變量會破壞uri的其他自動保存,所以也許在位置塊內部重寫^/v1(/.*)$ $ 1;'然後'proxy_pass $ backend $ uri;'可能會更接近你需要什麼(沒有在'$ backend'中存儲尾部斜線)。 –

+0

使用變量的原因是,當aws後端的ip發生變化時,我將不會發生持續幾個小時的中斷,意識到需要重新啓動Web服務器。我試圖刪除在每次調用中使用正則表達式的需要。但這可能是一條路。我會先嚐試上游,然後我會嘗試你的建議。 –

回答

0

使用upstream module設置變量:

http { 

    ... 

    upstream backend { 
     server internal-api.hostname.com.us-east-1.elb.amazonaws.com; 
    } 

    ... 

    server { 

     ... 

     location /v1/ { 
      proxy_pass http://backend; 

      ... 

     } 
    } 
} 

上游模塊是一個標準模塊,並就不得不被禁用專門爲它不會在你的Nginx的安裝。

+0

當我醒來時,我會給這個鏡頭一個鏡頭,我從來沒有想過使用上游模塊,因爲我以前使用它時,我沒有訪問ELB,這是一段時間。 –

+0

您是否意味着我要使用上游模塊的解析器? 因爲你的答案不會按照文檔工作: 我將需要在本週的某個時候測試這個希望: –