將django項目部署到nginx


簡介

這個文檔是將django的項目移植到nginx上面,網上總結的也很多。
但是為什么要做這個工作呢?
1. django只是一個快速搭建web的框架,具體部署還得放到HTTP server上面
2. nginx網傳性能很好,而且幾家大公司也開始用這個,因此最近它比apache的httpserver要火

雖然django項目部署到nginx有很多方法,這里介紹使用uWSGI。

對於static文件(html,css,image等)可以直接訪問文件系統將內容顯示到httpserver中,但是對於django的項目卻不行,server需要一些東西來跑django的應用,通過請求反饋響應。這就需要使用 WSGI(Web Server Gateway Interface),它是一種python的協議,解釋web server如何和web應用(如django應用)溝通。

uWSGI是WSGI協議的實現。

最終我們要實現的是如下結構:

the web client <-> the web server <-> the socket <-> uwsgi <-> Django

具體步驟

假設你已經知道

  1. 這里假設已經會使用django創建應用
  2. 並且已經基本熟悉nginx的配置
  3. 熟悉pip安裝python庫

安裝uwsgi

$ sudo apt-get install python2.7-dev
$ sudo pip install uwsgi

配置uwsgi隨系統啟動

你也可以選擇不隨系統啟動,然后需要使用時啟動

# mysite.wsgi  是django應用中的wsgi
$ uwsgi --http :8000  --module mysite.wsgi

隨系統啟動(使用upstart方式)

添加文件/etc/init/uwsgi.conf
使用命令`sudo service uwsgi [start | stop | restart]`管理

# uwsgi.conf
description "uWSGI"
start on runlevel [2345] stop on runlevel [06] respawn exec uwsgi --master --processes 4 --die-on-term \ --socket /tmp/uwsgi.sock --chmod-socket 660 \ --vhost --logto /var/log/uwsgi.log \ --plugins python

配置nginx

demo.conf 文件放入conf.d中,然后將sites-enable中default先刪掉

#demo.conf

upstream django {

    server unix:///tmp/uwsgi.sock; # for a file socket

    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)

}

server {
    listen          80;
    server_name     $hostname;
location / { include uwsgi_params; uwsgi_pass unix:/tmp/uwsgi.sock; uwsgi_param UWSGI_CHDIR /var/www/<app-name>/project; uwsgi_param UWSGI_MODULE <project-name>.wsgi:application; } }

  

配置static文件

前面已經基本的業務都可以實現,但是還不能顯示css等靜態文件效果
1. admin的static文件 在django項目中的settings文件中將STATIC_ROOT指向你的static絕對路徑(如:/var/www/project/app/static)

$python manage.py collectstatic

2.在demo.conf文件添加static指向

#demo.conf

upstream django {

    server unix:///path/to/your/mysite/mysite.sock; # for a file socket

    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)

}

server {
    listen          80;
    server_name     $hostname;
 
    location /static {
        alias /var/www/<app-name>/static;
    }

    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/tmp/uwsgi.sock;
        uwsgi_param UWSGI_CHDIR /var/www/<app-name>/project;
        uwsgi_param UWSGI_MODULE <project-name>.wsgi:application;
    }
}

 以上部分已經完成了全部的部署,可以通過http://localhost查看了。

 

 

下面是一些總結

權限問題

web項目中,當前用戶可以有權限編輯項目文件

因為一般我們把項目放到/var/www之類的文件中
但是這個www文件root的,而且對組外只有r/x的權限

$ ll /var/www
drwxr-xr-x  2 root root   ./

解決辦法,將文件所有權給當前用戶,就可以在創建文件等。

$ sudo mkdir myproject
$ sudo chown -R $USER:$USER myproject

對於nginx程序創建的文件,當前用戶該如何讀寫

說的簡單點,就是放到nginx跑的web程序自身創建的文件,當前用戶如何讀寫,因為nginx是以root權限啟動daemon進程的。以/etc/nginx/nginx.conf中的user啟動worker process。

暫時還沒想好。。。只能通過別的方法繞過它

 

參考

  1. Setting up Django and your web server with uWSGI and nginx
  2. How to Setup a Linux, Nginx, uWSGI, Python, Django Server
  3. upstart


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM