部署Django項目Nginx + uwsgi

記錄一下使用Nginx + uwsgi部署Django項目javascript

關於域名和端口

在這個教程中,咱們將假設你的域名爲 example.com 。用你本身的FQDN或者IP地址來代替。php

從頭至尾,咱們將使用8000端口做爲web服務器的公開端口,就像Django runserver默認的那樣。固然,你可使用任何你想要的端口,可是我已經選了這個,所以,它不會與web服務器可能已經選擇的任何端口衝突。css

基本的uWSGI安裝和配置

 

把uWSGI安裝到你的virtualenv中

pip install uwsgi

固然,有其餘安裝uWSGI的方式,但這種方式如其餘方式同樣棒。記住,你將須要安裝Python開發包。對於Debian,或者Debian衍生系統,例如Ubuntu,你須要安裝的是 pythonX.Y-dev ,其中,X.Y是你Python的版本。html

基礎測試

建立一個名爲 test.py 文件:java

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]             # python3
    # return ["Hello World"]           # python2

運行uWSGI:python

uwsgi --http :8000 --wsgi-file test.py

選項表示:nginx

  • http :8000       -->  使用http協議,端口8000
  • wsgi-file test.py   --> 加載指定的文件,test.py

當瀏覽器訪問8000端口時,這將直接提供一個’hello world’消息。 訪問:git

http://example.com:8000

來看一看。若是是這樣,那麼意味着如下的組件棧正常:github

the web client <-> uWSGI <-> Python


測試你的Django項目

如今,咱們想讓uWSGI作一樣的事,可是返回一個Django站點而不是 test.py 模塊。web

若是你尚未這樣作,那麼請確保你的 mysite 項目實際上正常工做:

python manage.py runserver 0.0.0.0:8000

而若是正常,則使用uWSGI來運行它:

uwsgi --http :8000 --module mysite.wsgi     # mysite.wsgi 就是你項目下的wsgi文件,例如 app01.wsgi

將你的瀏覽器指向該服務器;若是站點出現,那麼意味着uWSGI能夠爲你虛擬環境中的Django應用服務,而這個棧工做正常:

 

如今,一般咱們不會讓瀏覽器直接與uWSGI通訊。那是web服務器的工做,這是個穿針引線的活。

 

使用Nginx

安裝nginx

ubuntu:

sudo apt-get install nginx
sudo /etc/init.d/nginx start    # start nginx
View Code

如今,經過在一個web瀏覽器上經過端口80訪問它,來檢查nginx是否正常 - 你應該會從nginx得到一個消息:」Welcome to nginx!」. 那意味着整個棧的這些模塊都能一塊兒正常工做:

若是有其餘的東東已經提供端口80的服務了,而且你想要在那裏使用nginx,那麼你將必須從新配置nginx來提供另外一個端口的服務。可是,在這個教程中,咱們將使用端口8000。

爲你的站點配置nginx

1、建立uwsgi_params文件

你會須要 uwsgi_params 文件,可用在uWSGI發行版本的 nginx 目錄下,或者從https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 找到。

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;
uwsgi_params

將其拷貝到你的項目目錄中。一下子,咱們將告訴nginx引用它。

 

2、設置nginx.conf配置文件,這裏是自定義配置文件

如今,建立一個名爲mysite_nginx.conf的文件,而後將這個寫入到它裏面:

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock;   # 這裏是經過socket方式訪問django項目,也是咱們的最終目的。mysite.sock文件會自動建立,咱們只須要指定前面的路徑到咱們項目便可
    server 127.0.0.1:8001;          # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name .example.com;      # IP地址或者域名
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /path/to/your/mysite/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;     # 指定django
        include     /path/to/your/mysite/uwsgi_params;   # 這裏是咱們剛剛第一步建立的uwsgi_params文件,指定路徑
    }
}
mysite_nginx.conf

這個配置文件告訴nginx提供來自文件系統的媒體和靜態文件。

將這個文件連接到/etc/nginx/sites-enabled,而後告訴Nginx使用咱們建立的配置文件:

sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

配置完後重啓nginx

/usr/local/nginx/sbin/nginx -t             # 檢查配置
/usr/local/nginx/sbin/nginx -s reload  # 從新加載重啓

 

3、使用Unix socket而不是端口

目前,咱們使用了一個TCP端口socket,由於它簡單些,但事實上,使用Unix socket會比端口更好 - 開銷更少。

編輯 mysite_nginx.conf, 修改它以匹配:

# the upstream component nginx needs to connect to
upstream django {
    server unix:///var/www/project/project/mysite.sock;    # 指定到咱們的項目目錄下便可,mysite.sock會自動建立
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

而後重啓nginx

/usr/local/nginx/sbin/nginx -s stop     # 中止
/usr/local/nginx/sbin/nginx                # 開啓

 

再次運行uWSGI:

uwsgi --socket mysite.sock --wsgi-file test.py

在瀏覽器中嘗試訪問http://example.com:8000/。

 

4、使用uwsgi和nginx運行Django應用

在配置nginx.conf配置文件後,咱們就能夠進行下一步對django項目的操做了:

在項目目錄下建立一個uwsgi.ini文件,這裏主要是經過ini運行uwsgi,裏面就是一些配置參數,爲了方便咱們這裏把參數都寫到了uwsgi.ini文件下而後添加下面配置:

[uwsgi]

# Django-related settings ,
chdir           = /var/www/progect/

# Django's wsgi file,application 對象的模塊
module          = application .wsgi        

# process-related settings
master          = true

# maximum number of worker processes
processes       = 10

# the socket (use the full path to be safe
socket          = /var/www/project/WeChatPM/mysite.sock
chmod-socket    = 666

# clear environment on exit
master          = true
vacuum          = true
max-requests    = 5000
processes       = 4

# 設置日誌目錄,後臺運行
daemonize=/var/www/project/logs/uwsgi/uwsgi.log

#配置存放主進程的進程號文件和狀態文件
pidfile= /var/www/project/logs/uwsgi/uwsgi.pid
stats= /var/www/project/logs/uwsgi/uwsgi.stats
View Code

 這裏特定於Django的選項是:

  • chdir:須要在Python的導入路徑上的目錄的路徑 - 即包含該mysite的目錄
  • module:要使用的WSGI模塊 - 可能mysite.wsgistartproject建立模塊
  • env:至少應該包含DJANGO_SETTINGS_MODULE
  • home:項目virtualenv的可選路徑。

而後使用這個文件運行uswgi:

uwsgi --ini uwsgi.ini       # 指定到uwsgi.ini的路徑

 

啓動uwsgi:uwsgi --ini uwsgi.ini
中止uwsgi:uwsgi --stop uwsgi.pid
從新加載配置:uwsgi --reload uwsgi.pid

再次,測試Django站點是否如預期工做。

 

如何設置uwsgi後臺運行:
須要在mysite_uwsgi.ini配置文件中添加

daemonize = /var/www/project/hello/uwsgi.log

這樣就會吧日誌打印到uwsgi.log中。

經過查 nginx 的access_log 和 error_log 進行調試錯誤

 

配置參數說明:

[uwsgi]
# 項目目錄
chdir=/opt/project_teacher/teacher/
# 指定項目的application
module=teacher.wsgi:application
# 進程個數
workers=5
pidfile=/opt/project_teacher/script/uwsgi.pid
# 指定IP端口
http=192.168.31.123:8080
# 指定靜態文件
static-map=/static=/opt/test_project/teacher/static
# 啓動uwsgi的用戶名和用戶組
uid=root
gid=root
# 啓用主進程
master=true
# 自動移除unix Socket和pid文件當服務中止的時候
vacuum=true
# 序列化接受的內容,若是可能的話
thunder-lock=true
# 啓用線程
enable-threads=true
# 設置自中斷時間
harakiri=30
# 設置緩衝
post-buffering=4096
# 設置日誌目錄
daemonize=/opt/project_teacher/script/uwsgi.log
# 指定sock的文件路徑
socket=/opt/project_teacher/script/uwsgi.sock
uwsgi.ini

 

server {   # 這個server標識我要配置了
        listen 80;  # 我要監聽那個端口
        server_name 127.0.0.1 域名;  # 你訪問的路徑,IP或域名
        access_log  /var/log/nginx/access.log  main;  # Nginx日誌配置
        charset  utf-8; # Nginx編碼
        gzip on;  # 啓用壓縮,這個的做用就是給用戶一個網頁,好比3M壓縮後1M這樣傳輸速度就會提升不少
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;  # 支持壓縮的類型

        error_page  404           /404.html;  # 錯誤頁面
        error_page   500 502 503 504  /50x.html;  # 錯誤頁面

        # 指定項目路徑uwsgi
        location / {        # 這個location就和我們Django的url(r'^admin/', admin.site.urls),
            include uwsgi_params;  # 導入一個Nginx模塊他是用來和uWSGI進行通信的
            uwsgi_connect_timeout 30;  # 設置鏈接uWSGI超時時間
            uwsgi_pass unix:/opt/project_teacher/script/uwsgi.sock;  # 指定uwsgi的sock文件全部動態請求就會直接丟給他
        }

        # 指定靜態文件路徑
        location /static/ {
            alias  /opt/project_teacher/teacher/static/;
            index  index.html index.htm;
        }
nginx.conf
相關文章
相關標籤/搜索