Django的部署能夠有不少方式,採用nginx+uwsgi的方式是其中比較常見的一種方式。今天在Ubuntu上使用Nginx部署Django服務,雖然不是第一次搞這個了,可是發現仍是跳進了好多坑,google了很久才搞定。想一想仍是把這個過程記錄下來,省得下次再來踩一樣的坑。html
apt-get install nginx
ubantu安裝完Nginx後,文件結構大體爲:
全部的配置文件都在 /etc/nginx下;
啓動程序文件在 /usr/sbin/nginx下;
日誌文件在 /var/log/nginx/下,分別是access.log和error.log;
而且在 /etc/init.d下建立了啓動腳本nginx。前端
sudo /etc/init.d/nginx start # 啓動 sudo /etc/init.d/nginx stop # 中止 sudo /etc/init.d/nginx restart # 重啓
apt-get install python-dev pip install uwsgi
至於爲何要使用uwsgi,能夠參見這邊博客:快速部署Python應用:Nginx+uWSGI配置詳解(1)。
這樣大致的流程是:nginx做爲服務器最前端,負責接收client的全部請求,統一管理。靜態請求由Nginx本身處理。非靜態請求經過uwsgi傳遞給Django,由Django來進行處理,從而完成一次WEB請求。
通訊原理是:
the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django
python
在Django項目下新建test.py文件,nginx
# test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return ["Hello World"] # python2 #return [b"Hello World"] # python3
而後執行shell命令:web
uwsgi --http :8001 --plugin python --wsgi-file test.py
加上--plugin python是告訴uWSGI在使用python插件,否則頗有可能會出現相似這樣的錯誤:shell
uwsgi: unrecognized option '--wsgi-file' getopt_long() error
執行成功在瀏覽器中打開:http://localhost:8001顯示Hello World說明uwsgi正常運行。django
首先得保證Django項目沒有問題ubuntu
python manage.py runserver 0.0.0.0:8001
訪問http://localhost:8001,項目運行正常。
而後連接Django和uwsgi,實現簡單的web服務器,到Django項目目錄下執行shell:segmentfault
uwsgi --http :8001 --plugin python --module blog.wsgi
blog爲你的項目名。訪問http://localhost:8001,項目正常。注意這時項目的靜態文件是不會被加載的,須要用nginx作靜態文件代理。瀏覽器
uwsgi支持經過配置文件的方式啓動,能夠接受更多的參數,高度可定製。咱們在Django項目目錄下新建uwsgi.ini
# Django-related settings socket = :8001 # the base directory (full path) chdir = /home/ubuntu/blog # Django s wsgi file module = blog.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
在shell中執行:
sudo uwsgi --ini uwsgi.ini
ps:若是實在不想配置nginx的話,單uwsgi就已經能完成部署了(把socket換成http),你能夠把Django中的靜態文件放到雲平臺中如七牛等等,這樣你的Web也能被正常訪問。
nginx默認會讀取/etc/nginx/sites-enabled/default
文件中的配置,修改其配置以下:
server { # the port your site will be served on listen 80; # the domain name it will serve for server_name 127.0.0.1; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /home/ubuntu/blog/media; # your Django project's media files - amend as required } location /static { alias /home/ubuntu/blog/static; # your Django project's static files - amend as required } # Finally, send all non-media requests to the Django server. location / { include uwsgi_params; # the uwsgi_params file you installed uwsgi_pass 127.0.0.1:8001; } }
把Django自帶的靜態文件收集到同一個static中,否則訪問Django的admin頁面會找不到靜態文件。在django的setting文件中,添加下面一行內容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
而後到項目目錄下執行:
python manage.py collectstatic
修改配置文件
DEBUG = False ALLOWED_HOSTS = ['*']
一切配置好後直接重啓nginx便可。更加詳細的說明請參見官方文檔
若是監聽80端口,部署後訪問localhost自動跳轉到nginx默認的歡迎界面
uwsgi: option ‘--http‘ is ambiguous