Gunicorn部署部分的翻譯

部署Gunicorn

文檔建議Gunicorn最好是用在代理服務器後面。(等於前面最好加一個反向代理)html

Nginx Configuration

文檔建議用Nginx,固然用其餘也能夠,可是要確保當你用Gunicorn默認的worker時,那個代理可以減緩(安排好)客戶端的訪問,否則頗有可能會致使拒絕服務。文檔建議用Hey(由GO編寫的一個庫)來檢驗這個代理是否有用。python

文檔提供了一個關於Nginx的配置例子:nginx

worker_processes 1;  # 設置worker進程數量

user nobody nogroup;  # 設置了運行用戶,和運行用戶組
# 這個必定要設置好,否則讀取靜態文件的時候會報403
# 'user nobody nobody;' for systems with 'nobody' as a group instead
pid /tmp/nginx.pid;  # 設置pid文件地址
error_log /tmp/nginx.error.log;  # 設置錯誤日誌的地址

events {
  worker_connections 1024; # increase if you have lots of clients
  accept_mutex off; # set to 'on' if nginx worker_processes > 1
  # 'use epoll;' to enable for Linux 2.6+
  # 'use kqueue;' to enable for FreeBSD, OSX
}

http {
  include mime.types;# mime 多用途因特網郵件擴展類型?
  # fallback in case we can't determine a type
  default_type application/octet-stream;
  access_log /tmp/nginx.access.log combined;
  sendfile on;

  upstream app_server {
    # fail_timeout=0 means we always retry an upstream even if it failed
    # to return a good HTTP response

    # for UNIX domain socket setups
    server unix:/tmp/gunicorn.sock fail_timeout=0;

    # for a TCP configuration
    # server 192.168.0.7:8000 fail_timeout=0;
  }

  server {
    # if no Host match, close the connection to prevent host spoofing
    listen 80 default_server;
    return 444;
  }

  server {
    # use 'listen 80 deferred;' for Linux
    # use 'listen 80 accept_filter=httpready;' for FreeBSD
    listen 80;
    client_max_body_size 4G;

    # set the correct host(s) for your site
    server_name example.com www.example.com;

    keepalive_timeout 5;

    # path for static files
    root /path/to/app/current/public;

    location / {
      # checks for static file, if not found proxy to app
      try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # enable this if and only if you use HTTPS
      # proxy_set_header X-Forwarded-Proto https;
      proxy_set_header Host $http_host;
      # we don't want nginx trying to do something clever with
      # redirects, we set the Host: header above already.
      proxy_redirect off;
      proxy_pass http://app_server;
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /path/to/app/current/public;
    }
  }
}

若是須要處理stream(流)請求/響應,或者其餘特別的,如comet(服務器推),long polling(長輪詢),web sockets(網絡套接字),則須要關閉代理緩存功能。固然要執行這些的話,是須要用異步worker的。web

設置的方法爲,能夠相似在在上面的配置的66行左右插入shell

proxy_buffering off;緩存

當Nginx去處理ssl請求的時候,是須要把相應協議的信息傳給Gunicorn。不少web框架是須要用到相關的信息來生成對應的URL,若是沒有這些信息,則有可能在一個https的響應裏 生成一個http的URL,這極可能會致使很差的事情發送,因此要對Nginx進行設置,讓它能夠傳遞適當的頭部信息。安全

設置的方法,相似在上面的66行左右插入bash

proxy_set_header X-Forwarded-Proto $scheme;服務器

若是Nginx和Gunicorn不在同一臺機器上,則須要告訴Gunicorn要相信從Nginx傳過來的一些頭部信息,由於在默認配置下,爲了防止惡意的攻擊者僞造請求,Gunicorn只相信那些本地鏈接傳過來的頭部信息。網絡

設置信賴的安全地址

gunicorn --forwarded-allow-ips="10.170.3.217, 10.170.3.220" test:app

若是Gunicorn主機的端口徹底在防火牆後面,那就能夠將上面這個值設爲*,就是表明相信全部。但若是這樣設置的話,也是會有安全風險的。

Gunicorn v19版本在REMOTE_ADDR的處理方法方面有了重大突破,在此以前,Gunicorn設置X-Forwarded-For的值是靠代理傳過來的。然而這並不符合RFC3875的要求,REMOTE_ADDR如今是代理的ip地址,而不是真實用戶的ip地址。文檔建議配置Nginx經過X-Forwarded-For頭部來傳遞用戶真實的ip地址。

設置的方法,相似在上面的66行左右插入

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

要注意的是,若是將Gunicorn綁到UNIX的socket或者不是TCP的端口,那麼REMOTE_ADDR就是一個空值。

(因爲翻譯水平有限,我本身看回去也感受有點問題。。總結一下,反正就是最好在Nginx的配置文件加上proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Using Virtualenv

介紹了在虛擬環境下安裝Gunicorn,pass pass

Monitoring


注意事項

使用如下的監控服務時是不能開啓Gunicorn的守護進程模式。這些監控程序******。守護進程會

Gaffer

Using Gafferd and gaffer

能夠用Gaffer來監控Gunicorn,簡單的配置例子以下:

[process:gunicorn]
cmd = gunicorn -w 3 test:app
cwd =/path/to/project

Using a Procfile

在project中建立一個Procfile

gunicorn = gunicron -w 3 test:app

這樣的話就能夠同時運行其餘應用

經過gaffer start來啓動應用

也能夠經過gaffer load來直接熱載入Procfile

Runit

也能夠用runit這個執行監控

#! /bin/sh

GUNICORN = /usr/local/bin/gunicorn
ROOT = /path/to/project
PID = /var/run/gunicorn.pid

app = main:application

if [-f $PID ]; then rm $PID; fi

cd $ROOT
exec $GUNICORN -c $ROOT/gunicorn.conf.py --pid=$PID $APP

把這個配置文件保存爲/etc/sv/[app_name]/run,而後chmod u+x /etc/sv/[app_name]/run更改權限,接着建立軟接連到ln -s /etc/sv[app_name] /etc/service/[app_name]。若是已經好安裝runit,那麼Gunicorn就會在建立好鏈接後自動運行。

若是Gunicorn沒有自動啓動,那麼就要去用troubleshoot來檢查了。

Supervisor

Supervisor也是一個很是好的監控,是用python寫的,不過不支持python3。

簡單的配置文件例子以下:

[program:gunicorn]
command = /path/to/gunicorn main:application -c /path/to/gunicorn.conf.py
directory = /path/to/project
user = nobody
autostart = true
autorestart = true
redirect_stderr = true

Upstart

/etc/init/myapp.conf:

description `myapp`

start on (filesystem)
stop on runlevel [016]

respawn 
setuid nobody
setgid nogroup
chdir /path/to/app/directory

exec /path/to/virtualenv/bin/gunicorn myapp:app

這個配置例子裏,咱們運行了myapp這個在虛擬環境中的應用,而後全部錯誤日誌會輸出到var/log/upstart/myapp.log(何時指定的。。。)

相關文章
相關標籤/搜索