Python 关于在ubuntu部署Django项目

  Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

  在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。

  可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。

  Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在Ubuntu下完成。

 

一、安装Nginx

  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

   Nginx同样为当前非常流行的web服务器。利用其部署Django,我们在此也做简单的介绍。

wuzlxadmin@WUZLX004:/$ sudo apt-get install nginx  # 安装nginx

 

  启动nginx:

wuzlxadmin@WUZLX004:~$ /etc/init.d/nginx start 

wuzlxadmin@WUZLX004:~$ /etc/init.d/nginx stop

wuzlxadmin@WUZLX004:~$ /etc/init.d/nginx restart 

 

  配置nginx

nginx默认会读取/etc/nginx/sites-enabled/default文件中的配置:

server {
        listen 8080 default_server;
        listen [::]:8080 default_server;
        ...........

 

输入你的ubuntu ip即可访问, 正常是127.0.0.1:80 

如果出现上图,则说明Nginx已经安装配置成功。

 

二、安装uwsgi

wuzlxadmin@WUZLX004:~$ pip3 install uwsgi

测试uwsgi,创建test.py文件:

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

通过uwsgi运行该文件

wuzlxadmin@WUZLX004:~$ uwsgi --http:8001 --wsgi-file test.py

 

接下来配置Django与uswgi连接。我的Django项目位置为:

 

uwsgi支持通过配置文件的方式启动,可以接受更多的参数,高度可定制。我们在Django项目下新建ini文件default_app_uwsgi.ini(注意:不是django目录下的同名子文件夹)

# Django-related settings

socket = :8001

# the base directory (full path)
chdir           = /usr/app/DataAnalysis

# Django s wsgi file
module          = DataAnalysis.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

 其中chdir是django项目的根目录、module是相对路径指向项目同名目录下的wsgi.py文件

 接下来,切换到Django项目目录下,通过uwsgi命令读取default_app_uwsgi.ini文件启动项目。

 

wuzlxadmin@WUZLX004:/usr/app/DataAnalysis$ uwsgi --ini default_app_uwsgi.ini
[uWSGI] getting INI configuration from default_app_uwsgi.ini
*** Starting uWSGI 2.0.17 (64bit) on [Tue Jun  5 13:42:55 2018] ***
compiled with version: 5.4.0 20160609 on 24 May 2018 07:57:22
os: Linux-4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017
nodename: WUZLX004
machine: x86_64
clock source: unix
detected number of CPU cores: 8
current working directory: /usr/app/DataAnalysis/DataAnalysis
detected binary path: /home/wuzlxadmin/.local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /usr/app/DataAnalysis
your processes number limit is 15706
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8001 fd 3
Python version: 3.5.2 (default, Nov 23 2017, 16:37:01)  [GCC 5.4.0 20160609]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1d6b0d0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 364520 bytes (355 KB) for 4 cores
*** Operational MODE: preforking ***
ImportError: No module named '/DataAnalysis'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 29756)
spawned uWSGI worker 1 (pid: 29757, cores: 1)
spawned uWSGI worker 2 (pid: 29758, cores: 1)
spawned uWSGI worker 3 (pid: 29759, cores: 1)
spawned uWSGI worker 4 (pid: 29760, cores: 1)

 

再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,如下内容,添加在http花括号里面。 

server {
    listen         8081; 
    server_name    10.202.143.240 
    charset UTF-8;
    access_log      /var/log/nginx/DataAnalysis_access.log;
    error_log       /var/log/nginx/DataAnalysis_error.log;

    client_max_body_size 75M;

    location / { 
        include /etc/nginx/uwsgi_params;
        uwsgi_pass 10.202.143.240:8001;
        uwsgi_read_timeout 2;
    }   
    location /static {
        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias /usr/app/DataAnalysis/static/;
     }
 }

listen 指定的是nginx代理uwsgi对外的端口号。

uwsgi_pass 10.202.143.240:8001;指的本机IP的端口号与ini文件配置中的必须一致。

/static 是配置静态文件的地方。可以直接通过10.202.143.240:8081/static访问此文件夹了。

重启nginx。

 

PS:

操作/etc/nginx/nginx.conf文件的时候,将下面这一句的注释去掉。

server_names_hash_bucket_size 64;

另外注意一下  新加的server的位置问题:

http{
    server{}      
}

测试nginx的configuration是否ok

nginx -t -c /etc/nginx/nginx.conf

有时候我们会遇到报错说host不存在、那是因为没有把host加入到django项目的settings.py文件中。

ALLOWED_HOSTS = ['*']

改一下settings设置如上即可。记得重新运行一下。

 

Django admin css问题

1、修改django项目的settings.py文件

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

2、执行语句将文件整体从django default路径copy到static文件中

python manage.py collectstatic

现在你会发现static文件夹下面多了一个子文件夹admin。

重启下uwsgi。

这里没找到什么好的方法,只能通过杀死进程、重新开启来执行。

killall -9 uwsgi

uwsgi --ini /usr/app/DataAnalysis/default_app_uwsgi.ini

 

posted @ 2018-06-05 14:09  dandyzhang  阅读(359)  评论(0编辑  收藏  举报