Center OS Django部署
Center OS 部署 Django 程序,使用 Nginx + uWsgi + Supervisor
Python3 环境安装
- 安装可能使用到的依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel
- 从Python官网找到需要的Python版本的下载路径,使用
wget
下载到服务器
这里以Python3.6.7为例:https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
下载到服务器命令:wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
- 解压tgz压缩包
tar -zxvf Python-3.6.7.tgz
解压完可以在当前目录下看到Python-3.6.7的目录 - 把Python移到 /usr/local 下
mv Python-3.6.7 /usr/local
- 进入Python-3.6.7目录
cd /usr/local/Python-3.6.7
- 配置
./configure
- 编译
make
- 安装
make install
- 创建软链接(以便在全局调用)
ln -s /usr/local/bin/python3.6 /usr/bin/python3
- 查看是否安装成功
python3 -V
将项目传到到服务器
这里我们使用Git来操作,我们把项目传到如:Github或Coding等代码仓库,然后使用Git克隆到服务器。这样每次项目更新了只要将代码上传到仓库,在到服务器将代码拉下来就可以实现代码更新了
- 项目配置
记得在项目的settings.py中添加以下配置1
2
3
4
5DEBUG = False
ALLOWED_HOSTS = ['你的公网ip(不带端口号)'] # 如果不配置服务器的IP地址将导致外网无法访问,或者使用['*']代表授权全部
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') - 安装Git
yum install git
- 克隆项目到服务器
git clone http://xxxxxx.com
,将http://xxxxxx.com
换成自己仓库的地址 - 拉取更新的代码
git pull
- 更多
更多的Git命令可以查看我另一篇文章:https://smileorigin.site/2017/10/18/Git/Git/
使用Virtualenv来创建虚拟环境
为每一个Django项目都创建一个虚拟环境可以使每个项目的依赖包都互不影响,也不会污染全局环境,其他使用和信息可以查看我的另一篇文章–https://smileorigin.site/2018/08/06/Python/Virtualenv/
- 更新pip
pip3 install --upgrade pip
- 安装Virtualenv
pip3 install virtualenv
- 进入项目所在文件夹
假设我们项目文件夹在当前目录且名称为server
cd server
- 创建虚拟环境
在当前文件夹下创建一个名为venv的虚拟环境
virtualenv venv
- 激活虚拟环境
source venv/bin/activate
可以看到在root之前多了个**(venv)**,说明激活虚拟环境成功了
- 使用
requirements.txt
文件安装依赖包
如果有使用pip freeze >requirements.txt
在本地项目导出项目的所有依赖包,则可以通过该命令进行快速安装依赖包,没有的话就手动使用pip安装项目需要的依赖包
pip install -r requirements.txt
安装配置uWsgi
- 安装
pip install uwsgi
- 测试uwsgi
vim test.py
填写以下内容保存后,执行指令进行测试:1
2
3def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'Hello world'] # Python3uwsgi --http 127.0.0.1:8000 --wsgi-file test.py
如果执行成功,则会有以下类似信息:
打开另一个命令行窗口,输入以下命令进行测试:curl 127.0.0.1:8000
如果提示以下信息则表示测试页面运行成功:
可以看到截图有显示:Hello world
- 新建uwsgi配置文件
vim uwsgi.ini
可以按照以下模板进行填写1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32[uwsgi]
我的项目目录
chdir = /root/server
指定项目的application
module = imageAnalyze.wsgi
进程个数
workers = 5
pid文件保存路径
pidfile = /root/server/uwsgi/uwsgi.pid
指定IP端口
http = 127.0.0.1:8000
指定静态文件
static-map = /static=/root/server/static
启动uwsgi的用户名和用户组
uid = root
gid = root
启用主进程
master = true
自动移除unix Socket和pid文件当服务停止的时候
vacuum = true
序列化接受的内容,如果可能的话
thunder-lock = true
启用线程
enable-threads = true
设置自中断时间
harakiri = 30
设置缓冲
post-buffering = 4096
设置日志目录
daemonize = /root/server/uwsgi/uwsgi.log
指定sock的文件路径
socket = /root/server/uwsgi/uwsgi.sock - 新建配置文件中的指定文件夹
如果不创建可能导致以配置文件启动uwsgi报文件夹不存在的错误
mkdir uwsgi
- 创建static文件夹
mkdir static
- 收集项目静态文件
python manage.py collectstatic
收集成功会提示收集的文件数 - 以配置文件的形式启动uwsgi
uwsgi --ini uwsgi.ini
如果启动成功,则有以下类似提示
使用netstat -tnlp
命令可以查看在有哪些端口是运行的,可以看到uwsgi运行在127.0.0.1:8000
- 关闭
uwsgi --stop uwsgi/uwsgi.pid
安装配置Nginx
记得在配置Nginx的时候如果使用的是阿里云服务器,要让外部使用的端口要先在阿里云服务器的安全组中打开,否则会不能访问
- 查找要安装的Nginx的包链接
http://nginx.org/packages/centos/7/x86_64/RPMS/ - 安装
rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.14.1-1.el7_4.ngx.x86_64.rpm
- 配置Django项目的Nginx配置文件
cd /etc/nginx/conf.d
vim server.conf
,创建你项目的Nginx的配置文件,把server
换成任意名字(/etc/nginx/nginx.conf
文件的最后一行是include /etc/nginx/conf.d/*.conf;
会加载/etc/nginx/conf.d
文件夹下的所有后缀为.conf
的配置文件,所以只要在这个目录下创建后缀为.conf
的配置文件并配置相关内容,Nginx就会自动帮我们加载了,不需要额外的处理)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18server{
listen 80; # 监听的端口
server_name cookbook.aicircle.site;
server_name www.cookbook.aicircle.site # 使外部可通过www.cookbook.aicircle.site进行访问
当请求这些server name的时候,nginx才会做反向代理,0.0.0.0是指全部
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location 顾名思义,定位,就是当访问 / 的时候,nginx会将请求转给本地的8080>端口,而后面的设置都是>一些基本的配置,可以直接用
location /static {
alias /root/server/static;
}
这个就是配置静态文件的地方,要用绝对地址,对应最开始的目录形式,假设project就在/home下面,那么这>样配置就可以的了,还有个前提是,你在开发的时候,采取了django的建议,每个app的静态文件都用多了一层app_name的文件夹来包住。
} - 查看Nginx状态
systemctl status nginx
,如果Nginx是启动的则会有以下类似提示:
- 测试Nginx配置文件是否有误
nginx -t
,如果有以下类似提示,则配置文件没错
- 启动Nginx
systemctl start nginx
- 测试是否启动成功
curl http://127.0.0.1:80
,如果Nginx启动成功,则会显示以下类似内容
- 设置开机自启
systemctl enable nginx
,如果设置成功则会有类似提示信息
- 关闭Nginx
systemctl stop nginx
- 重启Nginx
systemctl restart nginx
使用Supervisor来管理进程
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去,就可以实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息,可以选择是否重新启动程序或报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
- 安装
安装我们使用Center OS自带的Python2来安装,Supervisor不支持Python3,打开另一个命令窗口使用以下命令安装
pip2 install supervisor
- 设置配置文件
vim supervisord.conf
,在任意你想要的位置创建配置文件,根据说明将以下参数改为自己的配置,保存1
2
3
4
5
6
7
8
9[program:server]
command=/root/server/venv/bin/uwsgi --ini /root/server/uwsgi.ini
directory=/root/server
startsecs=1
stopwaitsecs=1
autostart=true
autorestart=true
[supervisord]
[supervisorctl]program:server
:指定程序名称,server
为自定义程序名称command
:启动程序的命令,这里是调用虚拟环境内的uwsgi根据配置文件/root/server/uwsgi.ini
启动Django程序directory
:项目所在的文件夹startsecs
:启动延迟stopwaitsecs
:关闭延迟autostart
:是否自动启动autorestart
:是否自动重启
- 启动Supervisor
supervisord是服务端,supervisorctl是客户端
supervisord -c supervisord.conf
,如果surpervisord.conf
不在当前文件夹则需要其绝对路径(如:/etc/xx/supervisord.conf
) - 重启supervisor
service supervisord restart
- 启动进程
supervisorctl -c supervisord.conf start server
- 重启进程
supervisorctl -c supervisord.conf restart server
- 关闭进程
supervisorctl -c supervisord.conf stop server
- 启动所有进程
supervisorctl start all
- 关闭所有进程
supervisorctl stop all
- 查看所有进程的状态
supervisorctl status
- 查看Supervisor的进程信息
ps -ef | grep supervisord
错误解决方案
- 如果以上都配置好了,发现进入网站静态文件无法正常加载,请确认你的项目是不是在
/root
文件夹下,如果是的话则在修改root
目录的权限
chmod -R 755 root
修改完后重启Nginx服务器重新访问网站即可 - 无法访问服务器(博主这边用的是阿里云服务器,默认防火墙是关闭的)
- 检查服务器防火墙是否将用到的端口都设为白名单
- 如果是阿里云服务器,检查安全组是否添加用到的端口为入方向白名单
参考文章
- 本文标题:Center OS Django部署
- 本文作者:Thomas Woo
- 发布时间:2018-11-14 14:00
- 最后更新:2020-06-20 15:41
- 本文链接:http://smileorigin.site/python/django-deploy/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!