2011-11-04 34 views
9

Disclaimer:Thiếu tiêu đề tùy chỉnh với django, nginx và gunicorn

Tôi đang làm việc trong một dự án nơi tồn tại một webapp "khổng lồ" có một api cho điện thoại di động, vì vậy thay đổi api không phải là một lựa chọn.

Ứng dụng này được phát triển thời gian trước đây và một số nhà phát triển đã làm việc trên nó,

Có nói rằng, vấn đề là thế này;

Trong api dành cho di động của trang web này (chỉ xem hơn việc quay lại dữ liệu json), mã đang tìm kiếm một mã thông báo nhưng không trong tiêu đề yêu cầu:

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

Khi tôi kiểm tra api này tại địa phương, hoạt động tốt, nhưng trong sản xuất không, vì vậy, tôi cố gắng tìm ra những gì đang xảy ra và thấy điều này:

django chuyển đổi tiêu đề, thậm chí tiêu đề tùy chỉnh thành khóa theo yêu cầu.META, tôi sử dụng urllib2 và requests để kiểm tra api và vấn đề trong sản xuất là trong máy chủ sản xuất request.META không bao giờ có một khóa gọi là HTTP_TOKEN, do đó, làm một chút gỡ lỗi tôi s eriously nghĩ rằng vấn đề là cách chúng tôi phục vụ các ứng dụng django.

Chúng tôi đang sử dụng django1.3, nginx, gunicorn, virtualenvwrapper, python2.7.

nghi ngờ chính của tôi là nginx, tôi nghĩ, trong một vài nginx nhận được tiêu đề nhưng don 'chuyển tiếp nó đến django, tôi cố gắng làm một số nghiên cứu về điều này, nhưng tôi chỉ tìm thấy thông tin về tiêu đề bảo mật và tiêu đề tùy chỉnh từ nginx, nhưng tôi không tìm thấy doc hoặc một cái gì đó về cách nói với nginx cho phép tiêu đề đó và không loại bỏ nó.

Tôi cần trợ giúp ở đây, điều đầu tiên là kiểm tra xem nginx có nhận được tiêu đề hay không, nhưng tôi chỉ biết một chút về nginx và tôi không biết cách ghi lại tiêu đề yêu cầu.

Cảm ơn

Cập nhật

nginx conf file

+1

Bạn có thể chứng minh giả định rằng? Đăng nhập một yêu cầu cả từ nginx và django, và chắc chắn rằng có thực sự là một sự khác biệt trong các tiêu đề HTTP. –

+0

Một phần là vấn đề, trong thử nghiệm, một kịch bản sử dụng urllib2 và yêu cầu tôi definte các tiêu đề tôi gửi, trong xem tôi in các tiêu đề tôi nhận được, trong máy chủ developmente, tiêu đề là tốt, nhưng trong django sản xuất không nhận được Tiêu đề HTTP_TOKEN. – diegueus9

+0

Với điều đó tôi đang tìm một cách để nói với các tiêu đề yêu cầu in nginx nhưng tài liệu hơi khủng khiếp – diegueus9

Trả lời

4

Nếu Django được truy cập sử dụng uwsgi_pass, sau đó trong vị trí thích hợp (s) ...

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

Nếu Django được truy cập sử dụng fastcgi_pass, sau đó trong vị trí thích hợp (s) ...

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

Nếu Django được truy cập sử dụng proxy_pass, sau đó trong vị trí thích hợp (s) ...

# 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; 

những sẽ giúp loại bỏ khả năng Nginx không vượt qua mọi thứ từ vấn đề của bạn.

+0

Điều này là với gunicorn của tập tin cấu hình nginx? – diegueus9

+0

Giả sử bạn có nghĩa là "gunicorn hoặc ...", thì câu trả lời là đây là những chỉ thị nginx. ubiquitousthey đã cung cấp cho bạn một số liên kết trước đó. – Dayo

+1

Trên một lưu ý thú vị, cá nhân tôi đã gặp sự cố khi chuyển tiêu đề có tên chứa dấu gạch dưới khi sử dụng uwsgi_pass_header. Ví dụ, tiêu đề AUTH_TOKEN sẽ không bao giờ đạt Django được nêu ra khi sử dụng AUTHTOKEN nó sẽ! – stephenmuss

2

Tôi nghĩ rằng đây là những gì bạn cần:

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"' 

để đăng những gì đang xảy ra.

Bạn có thể xem kỹ hơn phần proxy_set_header trên mô-đun proxy ngược dòng để xem cách vượt qua các tiêu đề bạn cần.

Bạn có thể tìm tài liệu ở đây:

Các mục cuối cùng dường như chỉ ra nginx mà đi hầu hết các tiêu đề theo mặc định

2

Tôi không tìm thấy câu trả lời thực sự nhưng có thể giải quyết được. Tôi đã gặp vấn đề tương tự với tiêu đề chuẩn RFC nếu không có kết quả phù hợp và nếu được sửa đổi, vì vậy giải pháp của tôi được kiểm tra cho các tiêu đề đó.

Đã thêm vào cấu hình nginx tôi:

uwsgi_param HTTP_IF_NONE_MATCH $http_if_none_match; 
uwsgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since; 

Tôi không thể giải thích tại sao nginx từ chối để vượt qua các tiêu đề để uwsgi theo mặc định. Cấu hình này buộc nó. Các trang tạo ra 304 giây khi thích hợp.

Đối với câu hỏi ban đầu về phi tiêu chuẩn "token" tiêu đề, điều này sẽ làm các trick:

uwsgi_param HTTP_TOKEN $http_token; 
3

Trong file cấu hình nginx của bạn (fe mysite_nginx.conf) trong máy chủ phần thêm tham số này: uwsgi_pass_request_headers on;.

Ví dụ:

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

    ... 

    underscores_in_headers on; 
} 

Và nếu tiếp cận với Django đi qua uwsgi_pass, bạn cần phải thêm một tham số này uwsgi_pass_request_headers on; trong vị trí phần.

Ví dụ:

location/{ 
    include  /etc/nginx/uwsgi_params; # the uwsgi_params file you installed 
    uwsgi_pass_request_headers on; 
    uwsgi_pass django; 
} 
Các vấn đề liên quan