如何將django項目用Nginx部署到伺服器?

剛開始學,百度找了好幾個教程,跟著做但卻都不行。


Ubuntu上通過nginx部署Django筆記 - j_hao104 - 博客園
我前兩天剛搞過,遇到很多坑。把過程寫了下來,希望對你有用吧


這裡有一個 step by step 的教程,http://zmrenwu.com/post/20/
儘管如此,部署環節是 django 開發最複雜的環節,即使嚴格按照教程來,依然有可能操作失敗,如果遇到問題,可以參考一下文章下面的評論,很多熱心的網友把他們遇到的問題和解決方案都分享了出來。


看官方文檔
Deploying Django
最權威!


之前也是頭疼這件事情,現在再不頭疼了

Liunx之Ubuntu下Django+uWSGI+nginx部署_Linux_陳新明

本文採用uwsgi+nginx來部署Django。

這種方式是將nginx作為伺服器前端,將接受web所有的請求,統一管理。Nginx把所有的靜態請求自己處理(靜態文件處理是ngInx強項),然後把所有非靜態請求通過uwsgi傳遞給Django,由Django來處理,從而完成一次web請求。

一、uWSGI

1. 安裝

pip install uwsgi

2. 測試uWSGI是否安裝成功

在終端中輸入以下命令查看uwsgi的版本號,如果輸出正常,說明uswgi已安裝成功

$ uwsgi --version
2.0.15

3. 編寫一個簡單的wsgi應用測試uwsgi是否能正常使用

首先創建一個test.py文件(命令:vim test.py)

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

4.運行uwsgi:

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

參數解釋:

http :8000表示使用http協議,埠號為8000,

wigi-file則表示要運行的wsgi應用程序文件。

uwsgi運行後打開瀏覽器,訪問http://127.0.0.1:8000/ ,或者是相應伺服器地址的8000埠,就可以看到hello world 頁面了。

運行截圖:

如果想要運行項目來測試

# uwsgi --http :8000 --chdir 項目路徑 -w 項目.wsg --static-map=/static=static

uwsgi --http :8000 --chdir /home/teacher/ -w teacher.wsgi --static-map=/static=static

uWSGI常用命令:

uwsgi --chdir=/path/to/your/project
--module=mysite.wsgi:application
--env DJANGO_SETTINGS_MODULE=mysite.settings
--master --pidfile=/tmp/project-master.pid
--socket=127.0.0.1:49152 # 可以ip地址,也可以是文件
--processes=5 # 進程數量
--uid=1000 --gid=2000 # 如果是root用戶,uwsgi可以有刪除許可權
--harakiri=20 # 一個請求超時時間
--max-requests=5000 # 一個工作進程最大請求數
--vacuum # 退出時清楚環境
--home=/path/to/virtual/env # virtualenv的路徑
-- static # 做一個映射,指定靜態文件
--http # 這個就和runserver一樣指定IP 埠
--daemonize=/var/log/uwsgi/yourproject.log # 日誌 

Liunx之Ubuntu下Django+uWSGI+nginx部署_Linux_陳新明


##### 安裝nginx,django

##### 在項目下創建mysite_uwsgi.ini:
添加下面的內容:

```
# myweb_uwsgi.ini file
[uwsgi]
# Django-related settings
socket = :8000

# the base directory (full path)
chdir = /home/www/mysite # Django s wsgi file
module = myweb.wsgi # process-related settings # master
master = true # maximum number of worker processes
processes = 4

# ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit
vacuum = true
```

#### 配置/etc/nginx/nginx.conf:

```
http{
server
{
listen 80;
server_name blog.nothing.ml
charset UTF-8;
access_log /var/log/nginx/mysite_access.log;
error_log /var/log/nginx/mysite_error.log;

client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/www/mysite/static;
}
}
....
```

##### 重啟nginx:

&>/etc/init.d/nginx restart

##### 運行,在mysite_uwsgi.ini所在文件下輸入:

&>uwsgi --ini mysite_uwsgi.ini

##### 參考:
(通過Nginx部署Django(基於ubuntu))
(NGINX配置多域名)


最好的教程在這裡,一次成功

Nginx + uWsgi 部署 Django生產伺服器

http://www.bilibili.com/video/av10247256
http://www.bilibili.com/video/av10244432

最精彩的部分就在於,作者將背後的工作流程和原理用下面的兩張圖講明白,這是其他教程沒有的。


下面是視頻作者參考的文章(文章裡面有詳細的步驟和代碼,官方的教程很靠譜)

Setting up Django and your web server with uWSGI and nginx

http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html?highlight=django


比較主流的方法是使用 WSGI (或者 FastCGI),比如 django + uwsgi django + gunicorn

你可以搜索一下上面兩種配置方式,很多的, 還有,記得用 Google

部署的時候確實會遇到很多問題,這些問題還是要靠自己調查調試。

也可以通過 tornado 的 WSGI 模塊將 django 封裝一下然後跑在 tornado server 上,但是由於靜態文件的處理和對 tornado 進程監控的需求還需要搭配 supervisord,還有 gevent 聽說也很不錯。

如果是 windows server 的話比較常用的好像是 nginx + flup +django, 這個我沒有用過。


一步步來,首先你需要學習nginx如何做反向代理,比如利用proxy_pass來綁定一個UNIX套接字都是可以的。讓assest走Nginx其他的交給uwsgi。


uwsgi
實在不行,直接proxy_pass


看官方文檔
之前部署也遇到很多坑
強烈要求注意部署工具版本和django版本!
遇到和教程有出入的命令善用 help


這個教程是work的,我試過了,最好再加個supervisor來守護進程。
Django Nginx+uwsgi 安裝配置


Nginx+uwsgi+Django伺服器部署


為什麼要查教程?
uwsgi的官方文檔不好嗎?


推薦閱讀:

PHP 比 Python 牛在哪?
requests 和 scrapy 在不同的爬蟲應用中,各自有什麼優勢?
Python 寫的爬蟲爬久了就假死怎麼回事?

TAG:Python | Django框架 | Nginx | Python框架 | uwsgi |