Django+uwsgi+nginx部署Python web项目

下面我说一下自己的部署。本次部署的服务器环境:centos7.5、Python3.7.5,在Python3.7搭建Django框架项目Python3.7中,Django配置MySql数据库的基础上进行项目的搭建,不明白的可以去先看一下Python3.7搭建Django框架项目Python3.7中,Django配置MySql数据库这两个项目。

一.准备工作。

  • django
    一个基于python的开源web框架,请确保自己熟悉它的框架目录结构。
  • uWSGI
    一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关
  • nginx
    常用高性能代理服务器,作为负载均衡使用

二、相关资料

wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。
uWSGI :一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好
Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

其实网上很多教程,都是关于uwsgi+nginx部署django的,StackOverflow也有一些解决常见错误的方法,但是部署还是容易出问题,新手难解决。
归根到底是自己不了解整个项目的流程。教程都只教方法,但为什么这样部署,这样部署有什么好处,每个组件都起什么作用却只字不提。致使只要部署稍微有那么一点不同,就无可是从了。 所以说,项目流程和每个组件的用途才是此次部署最重要的部分。

首先客户端请求服务资源,
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
wsgi将返回值进行打包,转发给uWSGI,
uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换

作用:

  1. 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
  2. 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
  3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
  4. django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

三、安装与配置
1、安装uwsgi。推荐使用pip安装,命令行输入:

pip3 install uwsgi

测试uWSGI: 新建文件test.py,写入以下内容

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

运行

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

如果端口占用,使用

lsof -i :8000

列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序

sudo kill -9 pid

然后浏览 http://ip:8000查看效果,有”Hello World”输出即安装成功。
在这里插入图片描述
2、安装nginx。直接用sudo apt-get 安装,如果安装不了,应该是软件源的位置,可以修改一下,清华的,豆瓣的,阿里云的都可以,命令行输入:

sudo apt-get install nginx
或
sudo yum install nginx

3.在django项目下的setting.py文件中进行修改,便于下一步部署:
将debug改为False。如下:Debug = False
移植静态文件配置,这个主要是将原项目的静态文件移植出来以便访问。如下,注意括号中第二个参数为移植后的目录,不要和之前的静态文件目录相同就好。setting.py文件中添加,将静态文件转移到static目录中

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

进行静态文件移植,完成上面的步骤 之后,在django项目目录下运行

python3 manage.py collectstatic

在这里插入图片描述
执行python3 manage.py collectstatic命令之后,会生成一个static文件夹,文件夹中包含了css、js等一些静态文件
4、配置uwsgi。对于uwsgi的配置有很多种方式,私以为 ini配置方式最简单,这儿就只说最简单的。在项目目录下新建uwsgi.ini文件(与manage.py同级)内容如下:

# myweb_uwsgi.ini file
[uwsgi]

# Django-related settings

socket = :8000

# the base directory (full path)
chdir           = /home/zck/mysite  #需要修改成为自己的项目地址

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

daemonize=uwsgi.log

其中,需要修改的就是chdir、module两行,第一行的端口可以自己设,尽量设置8000以后的,避免冲突,但是这个端口号一定要记住,因为后面配置nginx时会用到。

5.在项目目录下新建nginx.conf文件(与manage.py同级),复制/etc/nginx/nginx.conf文件中的内容到新建的nginx.conf文件中,用vim打开它,然后在http{}内部加入下面内容。

server {
        listen       80;
        server_name  localhost;
        charset utf-8;
       # root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        #include /etc/nginx/default.d/*.conf;
        #access_log off;
        access_log      nginx_access.log;
        error_log       nginx_error.log;

        location /static {
            alias /home/zck/mysite/static; #要与之前django的setting.py中添加的static静态文件转移目录一致,需要精确到目录,修改为自己的目录
        }
        location / {
            uwsgi_pass  127.0.0.1:8000; #端口与原来的uwsgi中设置的端口一致
            include     /etc/nginx/uwsgi_params;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

其中的 listen 80代表服务器开放80端口;
location [目录名]代表项目路径的引导;
access_log 和error_log是定义nginx访问日志和错误日志的存放路径。
“location /static”中的”/static”是自己定义的项目引用静态文件时,浏览器中显示的静态资源所在的根目录名;这样的话,用户在浏览器中查看到的所有image、css或js资源都是处在http://127.0.0.1/static下的。
django静态文件的绝对路径是根据自己的实际情况来确定的,一般在自己的django的app名/static目录下,或自己python3 manage.py collectstatic后的路径下。像我的是在static根目录下。
“location /”是指访问项目根目录时,nginx要做的事。其中需要指定 uwsgi_params文件的绝对路径,上面已经提到了;如果还有media文件之类的静态目录,仿照static的写法,自己补充。
127.0.0.1:9090是指uWSGI绑定的监听地址,这里使用了9090端口。
需要注意的是,请确认自己django的静态文件目录所有者是www用户,如果不是,请用以下命令更改静态目录权限归属者:sudo chown -R static

注意!注意!注意! 原来nginx.conf配置有两行必须注释掉

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

6.启动项目,完成部署。进入到项目目录下,依次执行以下三个命令:

killall -9 uwsgi
sudo uwsgi --ini uwsgi.ini
killall -9 nginx
sudo nginx -c /home/zck/mysite/nginx.conf  #这里的-c 表示加载配置文件启动,这里精确到目录

第一个是先杀死现有的uwsgi进程,第二句是用ini进行uwsgi配置,第三步是杀死现有uwsgi进程。第四行是启动nginx进程,这里的-c 表示加载配置文件启动,这里精确到目录需要修改为自己的目录;如果有权限问题,加上sudo就好。

好了,现在就可以在外面访问你的django项目了!!!
在这里插入图片描述

到这也就搭建完成了,希望能帮助到你,有什么问题大家可以评论或者关注留言,我们相互学习交流。
项目源代码github地址:https://github.com/zhaochan/mysite/tree/dun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值