django常见的部署方式有linux下的uwsgi + nginx 和 gunicorn + nginx ,当然,也有windows下的IIS + Fastcgi 和 Apache + Fastcgi。windows就不提了,除非刚需,不然谁会使用windows server呢?而相比uwsgi,gunicorn更为快捷、简单。
操作系统: ubuntu 18
python: 3.8.12
django: 2.2
详细的就不讲了,其实各个软件都差不多。
准备工作
准备工作往往就令人秃头,如果是CentOS7或以下,系统默认Python2.x,sqlite默认3.7,单纯的环境配置就能让我这样的小白浪费几天时间了。就安装个python3.8就让我吐血。幸好,这次操作系统是ubuntu,这个就容易搞了。
- 安装Pyton3.8
项目指定python3.8,ubuntu上安装也挺容易的,至少不需要编译安装那么苦逼。
1、更新源
apt update
2、安装
apt install python3.8
3、检查python
现在系统上默认的是python3.6,python指向该版本,pip则无任何指向,查了目录,压根就没安装。
4、安装pip
本想直接通过get-pip.py文件为来python3.8安装pip,发现安装不上,一通提示后,通过apt install python3-pip
安装了pip,不过坑爹的,当前Python3指向了python3.6,所以毫无悬念,安装的pip也是python3.6的。
此时,再次通过get-pip.py文件为python3.8安装,安装成功了,pip3.8指向了python3.8,不过pip3的软件不知道为何失效了。
得,干脆,将Python3 和 pip3 都指向python3.8吧,反正也用不上python3.6。
5、设置软链
root@JygPXn4713:~# which python3
/usr/bin/python3
root@JygPXn4713:~# which python3.8
/usr/bin/python3.8
root@JygPXn4713:~#
先拿到Pyton3.8 路径和 软链python3 的路径,此时的python3是指向python3.6的,可以通过 ll
查看。 直接删除/usr/bin/python3
,也可以备份一下比如将python3重命名为python3.bak。最后设置:
ln -s /usr/bin/python3.8 /usr/bin/python3
同样的方法,为pip设置软链
ln -s /usr/local/bin/pip /usr/local/bin/pip3
拉取项目代码
python环境安装好,就在系统上找个地方来放源码吧,拉取后需要注意的是当前账号的权限问题,比如数据库文件夹的权限,static和media的权限问题,非root的账号在这些文件夹上的权限可能是700,并不拥有写入的权限。这是题外话了。虚拟环境、安装库之类的就省略了吧。直接进入到今天的主题。
安装即配置gunicorn
和uwsgi一样,gunicorn是python的库,直接pip安装就好,之后需要进行以下操作
1、在django的settings中添加
2、在项目根目录编写配置文件
测试什么的就算了吧,直接干配置文件,而且也超简单,配置文件命名为gunicorn_conf.py 当然,随便都行,但必须得是py文件。
import os
import multiprocessing
bind = '127.0.0.1:8000'
# 守护进程 后台运行
daemon = 'true'
timeout = 60
workers = multiprocessing.cpu_count() * 2 + 1
threads = 2
loglevel = 'info'
access_log_format = '/home/www/ins_ment/log/gunicorn_access.log'
errorlog = '/home/www/ins_ment/log/gunicorn_error.log'
其实配置和uwsgi差不多,无非在本机什么端口运行,是否守护进程,超时了咋办,进程数和线程数,日志输出等等。
3、启动gunicorn
网上将命令和配置的文章挺多,这里记录以下启动的命令,先cd到配置文件所在目录
gunicorn -c gunicorn_conf.py ins_manager.wsgi:application
解释一下
-c
参数 使用配置文件来启动
gunicorn_conf.py
这是要使用的配置文件
ins_manager.wsgi
项目的wsgi文件
启动后,其实就可以访问了,通过ip或域名 + 8000端口就ok,不过静态资源可能访问不到,gunicorn和uwsgi一样,对静态资源不太感冒,得依赖nginx,接下来有请Nginx。
安装和配置nginx
nginx的基础配置其实更容易,小项目压根用不到nginx牛逼的地方。值得提的是,nginx配置文件的几个地方:
这几个地方,理论上都可以配置,1,也就是nginx.conf应该是主配置文件,它会加载2和3下的配置文件。当然,具体得看nginx.conf里面的设置:
这几行include代码决定了配置文件的工作方式。
作为小白,就选择conf.d
目录下做配置吧,来!创建一个牛逼的名称, django.conf。后缀得是.conf,主配置文件说了只读取后缀是conf的文件。上菜:
server {
charset utf-8;
listen 80;
server_name www.baidu.com 114.114.114.8; # 举个例子而已填写域名或IP就ok,也可以是二级域名,如 niubi.baidu.com,
location /static {
alias /home/ins/ins_ment/online_static;
}
location /media {
alias /home/ins/ins_ment/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}
}
- location /
将server_name 的动态请求转发到127.0.0.1:8000,这个服务是gunicorn启动的。
- location /static
拦截、处理请求中含有static的请求,并/home/ins/ins_ment/online_static中寻找相关静态资源,这个目录是django settings.py中的STATIC_ROOT
- location /media
原理同上。
最后,启动或重启一下nginx
service nginx start
service nginx restart
其他可能存在的问题
如果不使用docker部署,理论上,不管多么简单的部署方式,都会有无数个问题,往往为了解决一个小问题,会捅破天。
1、依赖问题
比如python环境中,有蛮多依赖的,网上都有说,在安装python时,能装的都给装上吧
2、版本问题
比如django2.x对mysql操作库的兼容问题,需要手动修改源码之类的操作,再比如百度编辑器对python3的支持貌似也不是很好,也需要手动修改源码。
3、权限问题
对Linux不熟悉的话,权限问题会很让人秃头,普通用户sudo来sudo去的,最后权限出了问题,导致运行出错。最常见的sqlite3的读写权限、log文件的读写权限等等。
最后
其实,主要自己牛逼了或者搜索用得好,什么问题不是问题啦。