Python3 Django(十一)项目部署
项目部署
当一个项目开发完毕之后就需要将其部署到指定的生产环境上,也就是不是简单的在自己本地运行项目而是在指定的服务器上运行。这里以 linux 系统的服务器为例来演示如何完整的部署 Django 项目。
这里使用的生产环境部署架构为nginx+uwsgi,关于这两个软件的相关知识可以自行查阅。
软件版本信息:
- Django:2.2.6
- nginx:1.14.0
- uwsgi:2.0.18
一、项目准备工作
1.本地项目处理
在进行项目部署之前首先得把项目所需要的包进行记录,在项目的根路径下使用如下的命令来记录项目的用到的包:
$ pip freeze > plist.txt
2.上传项目代码
将项目代码打包压缩之后使用 sftp 上传到服务器的指定路径中。
打包压缩命令:
tar -czvf code/ code.tar.gz
sftp使用:
$ dftp user@server_ip
$ cd 指定路径
$ put code.tar.gz
接下来需要在服务器中进行操作
3.服务器项目配置
首先将上传的代码解压缩
$ tar -xzvf code.tar.gz
在服务器项目路径中创建一个虚拟的运行环境(有时一台服务器上有可能会运行多个 web 项目,而每一个项目所需要的包的版本并不同,因此需要针对每一个 python 项目创建一个单独的运行环境。)
$ python3 -m virtualenv env
进入该虚拟环境
source env/bin/activate
进行项目路径
$ cd code
安装项目所需的包
pip install -r plist.txt
接下来还得修改项目的 settings.py 文件设置为生产模式,更改如下的内容
# 关闭调试模式
DEBUG = False
# 表示可以访问服务器的ip
ALLOW_HOSTS=['*',]
# 静态文件路径
STATIC_ROOT='/var/www/code/static/'
# 静态文件链接
STATIC_URL='/static/'
静态文件路径是之后配置 nginx 之后对项目中静态文件访问的时候用的,对于配置中的静态文件路径需要自己创建,而且还得修改对应的权限,使其支持读写操作。
$ sudo chmod 777 /var/www/code
$ mkdir static
之后将项目中的静态文件拷贝到新建的静态文件路径下:
python manage.py collectstatic
二、uwsgi
1.安装 uwsgi
安装 uwsgi ,由于 uwsgi 是 python 中的一个包,因此安装在项目的虚拟环境中。
pip install uwsgi
2.uwsgi配置
在项目根目录下创建 uwsgi.ini 文件,编写如下配置:
[uwsgi]
socket=外网ip:端口(使用nginx连接时,使用socket)
http=外网ip:端口(直接做web服务器,使用http)
chdir=项目根目录
wsgi-file=项目中wsgi.py文件的目录,相对于项目根目录
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
注意,socket 和 http 只能二选一使用,假如使用 nginx 的话必须使用 socket
3.uwsgi启动
- 启动:uwsgi –ini uwsgi.ini
- 停止:uwsgi –stop uwsgi.pid
- 重启:uwsgi –reload uwsgi.pid
可以启动 uwsgi 来查看下项目的运行情况,可以正常访问项目便证明配置正确。
接下来配置 nginx
二、nginx
1.nginx安装
nginx 安装:
$ sudo apt install nginx
2.nginx配置
在安装好 nginx 之后还得需要对其进行相应的配置。
$ sudo vi /etc/nginx/sites-enabled/default
在文件中的 server 下添加新的 location 项,指向 uwsgi 的 ip 与端口
upstream django {
server #web的socket端口;
}
server {
# 在location下添加
location / {
# 添加如下的内容
root #项目目录;
uwsgi_pass django;
include #uwsgi_params文件的地址;
}
# 在location下添加
location /static {
alias #网站的静态文件地址;
}
}
uwsgi_params 文件需要自己新建,内容如下:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
3.nginx启动
- 启动 nginx
$ service nginx start
- 关闭 nginx
$ service nginx stop
- 重启 nginx
$ service nginx restart
接下来便可以通过 ip 不加端口直接访问网站了。