記錄一下使用Nginx + uwsgi部署Django項目javascript
在這個教程中,咱們將假設你的域名爲 example.com
。用你本身的FQDN或者IP地址來代替。php
從頭至尾,咱們將使用8000端口做爲web服務器的公開端口,就像Django runserver默認的那樣。固然,你可使用任何你想要的端口,可是我已經選了這個,所以,它不會與web服務器可能已經選擇的任何端口衝突。css
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協議,端口8000wsgi-file test.py -->
加載指定的文件,test.py當瀏覽器訪問8000端口時,這將直接提供一個’hello world’消息。 訪問:git
http://example.com:8000
來看一看。若是是這樣,那麼意味着如下的組件棧正常:github
the web client <-> uWSGI <-> Python
如今,咱們想讓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服務器的工做,這是個穿針引線的活。
ubuntu:
sudo apt-get install nginx sudo /etc/init.d/nginx start # start nginx
如今,經過在一個web瀏覽器上經過端口80訪問它,來檢查nginx是否正常 - 你應該會從nginx得到一個消息:」Welcome to nginx!」. 那意味着整個棧的這些模塊都能一塊兒正常工做:
若是有其餘的東東已經提供端口80的服務了,而且你想要在那裏使用nginx,那麼你將必須從新配置nginx來提供另外一個端口的服務。可是,在這個教程中,咱們將使用端口8000。
你會須要 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;
將其拷貝到你的項目目錄中。一下子,咱們將告訴nginx引用它。
如今,建立一個名爲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文件,指定路徑 } }
這個配置文件告訴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 # 從新加載重啓
目前,咱們使用了一個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/。
在配置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
這裏特定於Django的選項是:
chdir
:須要在Python的導入路徑上的目錄的路徑 - 即包含該mysite
包的目錄。module
:要使用的WSGI模塊 - 可能mysite.wsgi
是startproject
建立的模塊。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
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; }