下面我说一下自己的部署。本次部署的服务器环境:centos7.5、Python3.7.5,在Python3.7搭建Django框架项目和Python3.7中,Django配置MySql数据库的基础上进行项目的搭建,不明白的可以去先看一下Python3.7搭建Django框架项目和Python3.7中,Django配置MySql数据库这两个项目。
一.准备工作。
二、相关资料
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、安装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就好。
到这也就搭建完成了,希望能帮助到你,有什么问题大家可以评论或者关注留言,我们相互学习交流。
项目源代码github地址:https://github.com/zhaochan/mysite/tree/dun