2011-11-04 64 views
9

免責聲明:缺少使用Django,Nginx的自定義頁眉和gunicorn

我在存在一個「巨大」的webapp具有對手機的API的一個項目工作,所以更改API是不是一種選擇。

此應用程序是很久以前開發和一些開發商已經在它的工作,

話雖如此,問題是這樣的;

在API爲這個網站的移動(只是意見不是返回JSON數據),代碼尋找一個令牌,但確實在請求頭:

token = request.META.get('HTTP_TOKEN') 

當我在本地測試這個API,工作正常,但在生產沒有,所以,我試圖弄清楚發生了什麼事情,並發現這一點:

django轉換標題,甚至自定義標題,在request.META鍵,我用urllib2和requests進行測試API和生產中的問題是生產服務器中的請求.META從來沒有一個名爲HTTP_TOKEN的密鑰,因此,做一些調試I s認真思考問題是我們爲django應用程序提供服務的方式。

我們使用的是django1.3,nginx,gunicorn,virtualenvwrapper,python2.7。我試着對此做一些研究,但是我只找到關於nginx的安全性頭文件和自定義頭文件的信息,但我沒有找到文檔或有關如何告訴nginx允許該標題並且不刪除它的內容。

我需要幫助,第一件事是測試如果nginx收到頭,但我只知道一點關於nginx,我不知道如何告訴它記錄請求頭。

感謝

更新

nginx conf file

+1

你能證明這個假設?記錄來自nginx和django的請求,並確保HTTP頭中確實存在差異。 –

+0

部分原因在於,在測試中,使用urllib2的腳本要求我定義我發送的頭文件,在視圖中打印我在開發服務器中收到的頭文件,頭文件很好,但在生產中,django沒有收到HTTP_TOKEN標頭。 – diegueus9

+0

因此,我正在尋找一種方式來說nginx打印請求標題,但文檔有點可怕 – diegueus9

回答

4

如果Django是使用uwsgi_pass,然後在適當的位置(一個或多個)...存取的

# All request headers should be passed on by default  
# Make sure "Token" response header is passed to user 
uwsgi_pass_header Token; 

如果Django是使用fastcgi_pass,然後在適當的位置(一個或多個)...存取的

# All request headers should be passed on by default  
# Make sure "Token" response header is passed to user 
fastcgi_pass_header Token; 

如果Django是使用proxy_pass,然後在適當的位置(一個或多個)...

# All request headers should be passed on by default 
# but we can make sure "Token" request header is passed to Django 
proxy_set_header Token $http_token; 

# Make sure "Token" response header is passed to user 
proxy_pass_header Token; 

訪問這些應該有助於消除Nginx沒有把你的問題傳遞給你。

+0

這是與nginx配置文件的gunicorn? – diegueus9

+0

假設你的意思是「gunicorn或...」,那麼答案就是這些是nginx指令。 ubiquitousthey早些時候給了你一些鏈接。 – Dayo

+1

有趣的是,在使用uwsgi_pass_header時,我個人遇到了傳遞名稱包含下劃線的頭的問題。例如,使用AUTHTOKEN時,頭部AUTH_TOKEN將永遠不會到達Django! – stephenmuss

2

我覺得這是你所需要的:

log_format combined '$remote_addr - $remote_user [$time_local] ' 
        '"$request" $status $body_bytes_sent ' 
        '"$http_referer" "$http_user_agent" "$http_http_token" "$upstream_http_http_token"' 

記錄正在發生的事情。

您可以深入瞭解上游代理模塊的proxy_set_header部分,以瞭解如何傳遞所需的標頭。

您可以在這裏找到的文檔:

中的最後一項似乎表明,nginx的默認

經過最頭
2

我沒有找到real答案,但能夠做出解決方法。我遇到了與RFC標準標題相同的問題,如果不匹配和if-modified-since,那麼我的解決方案將針對這些標頭進行測試。

添加到我的nginx的配置:

uwsgi_param HTTP_IF_NONE_MATCH $http_if_none_match; 
uwsgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since; 

我無法解釋爲什麼nginx的拒絕通過這些標題,默認情況下uwsgi。這個配置強制它。頁面現在生成適當的304。

有關非標「令牌」頭原來的問題,這應該做的伎倆:

uwsgi_param HTTP_TOKEN $http_token; 
3

在你的nginx的配置文件(FE mysite_nginx.conf)在服務器節添加此參數:uwsgi_pass_request_headers on;

例如:

server { 
    # the port your site will be served on 
    listen  8000; 

    ... 

    underscores_in_headers on; 
} 

如果訪問的Django經過uwsgi_pass,則需要添加此一個參數uwsgi_pass_request_headers on;位置部分。

例如:

location/{ 
    include  /etc/nginx/uwsgi_params; # the uwsgi_params file you installed 
    uwsgi_pass_request_headers on; 
    uwsgi_pass django; 
}