ubuntu 通过Nginx部署Django

https://www.cnblogs.com/fnng/p/5268633.html

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

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

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

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

一、静态文件的部署

当Django运行在生产模式时,将不再提供静态文件的支持,需要将静态文件交给静态文件服务器。

我们先收集所有静态文件。项目中的静态文件除了我们使用的front_end_pc中之外,django本身还有自己的静态文件,如果rest_framework、xadmin、admin、ckeditor等。我们需要收集这些静态文件,集中一起放到静态文件服务器中。
假如我们的项目的静态文件在front_end_pc目录中,我们需要首先在front_end_pc中创建static文件夹
Django提供了收集静态文件的方法。先在配置文件中配置收集之后存放的目录

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

然后执行收集命令

python manage.py collectstatic
使用Nginx服务器作为静态文件服务器

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

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

Nginx官网:http://nginx.org/
Ngnix的安装
  打开ubuntu控制台安装

 sudo apt-get install nginx  #安装

启动Nginx:

 sudo /etc/init.d/nginx start  #启动
 sudo /etc/init.d/nginx stop  #关闭
 sudo /etc/init.d/nginx restart  #重启

修改Nginx默认端口号,打开/etc/nginx/nginx.conf 文件,修改端口号。(由于版本问题,有的版本中http中没有下面的server内容,直接在http中添加即可)

 server {
    listen       8066;    # 修改端口号
    server_name  localhost;  # localhost也可以改为输入你绑定的域名即可(如:www.haodou.site)

    #charset koi8-r; 

    #access_log  logs/host.access.log  main;

    location / {
        root   html;   # 静态文件所在目录(如:/home/python/Desktop/front_end_pc)
        index  index.html index.htm;
    }
}

大概在文件36行的位置,将默认的80端口号改成其它端口号,如 8066。因为默认的80端口号很容易被其它应用程序占用。

然后,通过上面命令重启nginx。访问:http://127.0.0.1:8066/ 或者访问www.haodou.site:8066
 
  即能看到我们的项目了。

二、动态文件的部署

安装uwsgi

通过pip安装uwsgi。(在虚拟环境中)

 pip install uwsgi

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

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

通过uwsgi运行该文件。

python@ubuntu:~/pydj$ uwsgi --http :8001 --wsgi-file test.py

接下来配置Django与uwsgi连接。此处,假定的我的django项目位置为:/home/python/pydj/myweb

python@ubuntu:~/pydj$ uwsgi --http :8001 --chdir /home/python/pydj/myweb/ --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

常用选项:

http : 协议类型和端口号

processes : 开启的进程数量

workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)

chdir : 指定运行目录(chdir to specified directory before apps loading)

wsgi-file : 载入wsgi-file(load .wsgi file)

stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)

threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)

master : 允许主进程存在(enable master process)

daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

pidfile : 指定pid文件的位置,记录主进程的pid号。

vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

三、关联操作(Nginx+uwsgi+Django)

接下来,我们要将三者结合起来。首先罗列一下项目的所需要的文件:

myweb/

├── manage.py

├── myweb/

│ ├── init.py

│ ├── settings.py

│ ├── urls.py

│ └── wsgi.py

└── myweb_uwsgi.ini

在我们通过Django创建myweb项目时,在子目录myweb下已经帮我们生成的 wsgi.py文件。所以,我们只需要再创建myweb_uwsgi.ini配置文件即可,当然,uwsgi支持多种类型的配置文件,如xml,ini等。此处,使用ini类型的配置。

# myweb_uwsgi.ini file
[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址
socket=127.0.0.1:8001
#直接做web服务器使用,Django程序所在服务器地址
#http=127.0.0.1:8000
#项目目录  (后端项目目录)
chdir=/home/python/pydj/myweb
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=myweb/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=uwsgi.log
# 指定依赖的虚拟环境
virtualenv=/home/python/.virtualenvs/haodou

socket 指定项目执行的端口号。

chdir 指定项目的目录。

module myweb.wsgi ,可以这么来理解,对于myweb_uwsgi.ini文件来说,与它的平级的有一个myweb目录,这个目录下有一个wsgi.py文件。

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

python@ubuntu:~$ cd /home/python/pydj/myweb/
python@ubuntu:~/python/myweb$ uwsgi --ini myweb_uwsgi.ini   # 启动uwsgi
python@ubuntu:~/python/myweb$ uwsgi --ini myweb_uwsgi.ini  #停止uwsgi  也可以通过kill -9 命令进行杀死进程
python@ubuntu:~/python/myweb$  ps aux | grep uwsgi   # 查看uwsgi运行进程

注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。

再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容(在http中)。

……
 upstream haodou {
        server 127.0.0.1:8001;  # 此处为uwsgi运行的ip地址和端口号
         # 如果有多台服务器,可以在此处继续添加服务器地址
 	}

    
       server {
         	listen  8000;
         	server_name api.haodou.site;

       location / {
             include uwsgi_params;
             uwsgi_pass haodou;
         }

    		}    

    server {
         listen       8066;
         server_name  www.haodou.site;
        
       location /xadmin {
             include uwsgi_params;
             uwsgi_pass haodou;
        }

       location /ckeditor {
             include uwsgi_params;
             uwsgi_pass haodou;
       }

        location / {
             root   /home/python/Desktop/front_end_pc;
             index  index.html index.htm;
         }
    }
……

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

include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口号与myweb_uwsgi.ini配置中的文件中的必须一致。

现在重新启动nginx,翻看上面重启动nginx的命令。然后,访问:http://haodou.site:8066/

通过这个IP和端口号的指向,请求应该是先到nginx的。如果你在页面上执行一些请求,就会看到,这些请求最终会转到uwsgi来处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值