[英]NGINX Reverse Proxy for upstream Django/Gunicorn Backend
我將其發布在nginx郵件列表上,但沒有人回音,所以我想我可以在stackoverflow上對其進行破解:)
我目前在Amazon EC2上托管了Django應用。 我的所有數據都通過Gunicorn的8000端口提供(用於UNIX的Python WSGI HTTP Server。這是從Ruby的Unicorn項目移植來的前叉工作模型)。 我不必擔心將靜態內容(圖像)傳遞給客戶端,因為所有這些內容都由Amazon的S3服務為我處理。 Django通過Gunicorn通過json將內容的網址傳遞給客戶端。 客戶端然后可以下載它。
我的Django應用托管在t1.micro實例上。 這是Amazon Web Services提供的規范:
處理器:最多2個EC2計算單元(用於短周期突發)。 虛擬內核:1個內存:615 MiB平台:32位和64位
在此實例上,我有3個Gunicorn工人與我的Django應用程序一起運行。
對於我的Nginx反向代理服務器,我還使用了t1.micro實例。 我已經設置好了,一切工作都很好。 這是我的etc / nginx / sites-enabled / default配置,如下所示:
# Gunicorn server
upstream django {
server 10.0.10.0:8000;
}
# Serve static files and redirect any other request to Gunicorn
server {
listen 80;
server_name 23.0.23.23/;
#root /var/www/domain.com/;
#access_log /var/log/nginx/domain.com.access.log;
#error_log /var/log/nginx/domain.com.error.log;
# Check if a file exists at /var/www/domain/ for the incoming request.
# If it doesn't proxy to Gunicorn/Django.
#try_files $uri @django;
# Setup named location for Django requests and handle proxy details
location @django {
proxy_pass http://django;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
此設置很好,但不能解決低速客戶端的代理緩沖問題。 它也沒有考慮緩存,也沒有考慮我需要的nginx worker的數量。 如何配置壓縮? 我發現指出存在所謂的gzip的資源,這支持json嗎? 如何根據我的t1.micro實例規格微調我的Nginx配置?
如果您在我的情況下,將使用哪些設置? 非常感謝您的回答和示例。 謝謝 :)
通常,只有在生成非常大的網頁或發送大文件時,代理緩沖才有幫助。 無論如何,設置起來都非常容易,但是您需要將緩沖區大小調整為最大頁面的大小+ 20%(任何不適合緩沖區的頁面都寫入磁盤),或者有選擇地啟用代理緩沖區您最大的頁面。
docs: http : //wiki.nginx.org/HttpProxyModule#proxy_buffering
我對您的應用程序及其內容的動態性了解不多,但是在您的應用程序上設置正確的Cache Control / ETAG標頭生成將是您要做的第一件事。 這就是讓Nginx知道可以安全代理的內容。 另外,您可能希望設置多個緩存區域來管理緩存在磁盤上占用的空間量。
proxy_cache one;
proxy_cache_path /data/nginx/cache/one levels=1:2 max_size=1G keys_zone=one:1000m;
您將需要允許您繞過緩存的規則(用於調試或以編程方式)
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;
您還希望在應用程序引發錯誤時讓應用程序無條件地從緩存中提供服務:
proxy_cache_use_stale error timeout invalid_header;
docs:
在您的站點上啟用gzip總是在CPU時間和帶寬之間進行權衡。 的確,如果對內容進行gzip處理,則可以減少通過網絡發送的數據量,但是如果您在T1 Micro上運行,則由於CPU使用率的原因,將嚴重限制代理請求的能力。 通常,對於靜態內容,gzip是一個更好的主意,您可以將其預壓縮,然后一遍又一遍地投放。
(是的,gzip支持json,但這是因為gzip成為有線格式,並且被客戶端透明地解壓縮。您應該閱讀Content-Encoding: gzip
)
docs: http : //betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/
您還需要設置一些其他設置:
# Directives turn off 404 error logging.
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
log_not_found off;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.