1.前言
- CentOS 7.4 64位(阿里云服务器)
- Python 3.7.1
- Django 2.1
- Mysql 8.0.12
2.软件介绍
- nginx: 反向代理服务器,处理静态资源,负载均衡等。
- gunicorn: Python WSGI HTTP Server for UNIX。
- virtualenv: 创建独立的环境,例如python。
- supervisor: 基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。
3.安装Python3
安装编译相关包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
安装必要工具 yum-utils ,它的功能是管理repository及扩展包的工具 (主要是针对repository)
sudo yum install yum-utils
使用yum-builddep为Python3构建环境,安装缺失的软件依赖,使用下面的命令会自动处理.
sudo yum-builddep python
curl -O https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
最后一步,编译安装Python3,默认的安装目录是 /usr/local 如果你要改成其他目录可以在编译(make)前使用 configure 命令后面追加参数 “–prefix=/usr/local/python3” 来完成修改
tar xf Python-3.7.1.tgz
cd Python-3.7.1
./configure
make
sudo make install
至此你已经在你的CentOS系统中成功安装了python3、pip3、setuptools,查看python版本
python3 -V
pip3 -V
4.安装Virtualenv
终端下输入 sudo pip3 install virtualenv 可以创建一个拥有自己安装目录的环境, 这个环境不与其他虚拟环境共享库, 能够方便的管理python版本和管理python库。
下面是创建python3的虚拟环境
#创建ENV目录
root@dev:/# cd / && mkdir data && cd data && mkdir env && cd env
root@dev:env# ls
#创建python3虚拟环境,实际路径要看自己的python3安装目录
root@dev:env# virtualenv -p /usr/local/bin/python3.7 python3
Running virtualenv with interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /data/env/python3/bin/python3
Also creating executable in /data/env/python3/bin/python
Installing setuptools, pip, wheel...done.
看到类似这样的输出说明虚拟环境我们已经创建成功,下面是使他生效:
root@dev:env# source python3/bin/activate
(python3) root@dev:env#
注意,在虚拟环境生效之后前面会有(python3)的提示,来指示现在所生效的虚拟环境名。 在创建虚拟环境的时候,如果加上--system-site-packages的话会集成系统现有的包。 这样,虚拟环境就生效了,我们就可以使用pip3来安装包而不会和系统的包发生冲突。 关闭可以使用如下命令来退出现在的虚拟环境:
(python3) root@dev:env# deactivate
root@dev:env#
可以看到,在退出之后前面的(python3)就会消失掉。接下来就是安装gunicorn和django等包,直接使用pip3安装即可。注意是在之前创建的虚拟环境生效的前提下来安装。
5.配置gunicorn(安装在虚拟环境下)
安装gunicorn
pip3 install Gunicorn
Gunicorn 是一个高效的Python WSGI Server,通常用它来运行 wsgi application(由我们自己编写遵循WSGI application的编写规范) 或者 wsgi framework(如Django,Paster),地位相当于Java中的Tomcat。 在我们要部署的django(这是在env下创建的django项目根目录)项目中执行如下命令来尝试运行:
gunicorn DjangoBlog.wsgi:application -b 0.0.0.0:6666
DjangoBlog为要运行的Django项目名,如果有类似如下输出则说明成功执行: 上面的命令是一个简单的测试,为了真正在生产环境下使用Gunicorn,我们还需要增加一些配置。我们把这些配置文件写成一个bash脚本,保存为bin/django_start(django的bin文件夹)
#!/bin/bash
NAME="DjangoBlog" # Name of the application
DJANGODIR=/data/env/django # Django project directory
SOCKFILE=/data/env/django/DjangoBlog/run/gunicorn.sock # we will communicte using this unix socket
USER=root # the user to run as
GROUP=root # the group to run as
NUM_WORKERS=1 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name
echo "Starting $NAME as `whoami`"
# Activate the virtual environment
cd $DJANGODIR
source /data/env/python3/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /data/env/python3/bin/gunicorn ${DJANGO_WSGI_MODULE}:application -b 127.0.0.0:8888 \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-
添加可执行权限:
sudo chmod u+x bin/django_start
然后就可以尝试执行这个脚本了:
./bin/django_start
如果看到输出一堆参数没有报错就说明已经成功了: (请注意,项目所需要的所有包与模块,还有刚刚安装的gunicorn,都必须在Virtualenv 虚拟环境下安装一次,否则将提示缺失模块) 如果你在上面的过程中设置了自定义的参数的话,需要将gunicorn_start脚本中对应的参数改过来。
6.安装Supervisor(Supervisor仅支持python2)
Superviosr是一个进程监管的工具。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。通过下面的命令即可安装:
yum install epel-release
yum install supervisor
安装 Supervisor 后,修改 /usr/lib/systemd/system/ 目录下 supervisord.service 文件
[Unit]
Description=Supervisor Daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
启用开机启动
systemctl enable supervisord.service
启动Supervisor
systemctl start supervisord.service
Superviosr通过配置文件来设置被监管的程序。一般配置文件都放置在/etc/supervisord.d路径下面。此处我们创建一个名为djangoblog.conf的配置文件,内容如下:
[program:djangoblog]
command = /data/env/django/bin/django_start
user = root
autostart=true
autorestart=true
redirect_stderr = true
stdout_logfile = /env/logs/blog/robot.log
stderr_logfile = /env/logs/blog/err.log
日志目录还需要手动创建下:
mkdir -p /env/logs/blog
添加配置文件到主配置文件 打开/etc/supervisord.conf 文件,到最后一行可以看到
;[include]
;files = /relative/dictory/*.ini
删除这里的分号,然后添加我们配置文件/etc/supervisor.d/djangoblog.conf,修改后如下
[include]
files = ./supervisord.d/*.ini ./supervisord.d/*.conf
设置好上面的文件以后,启动supervisor:
supervisor有两个命令,supervisord和supervisorctl,通过supervisord管理启动和配置supervisor本身,通过supervisorctl来管理使用supervisor启动和管理的自身的一些应用,如我们的这里的app.py
启动supervisor 用命令
supervisord -c /etc/supervisord.conf
关闭supervisor 用命令
supervisorctl shutdown
如果先建的djangoblog.conf(控制文件),在使用启动命令后这些经过配置的程序也会启动
启动程序
supervisorctl start program_name
这里的program的name是配置文件ini中的[program:name],所以这里的program_name是djangoblog
关闭程序
supervisorctl stop program_name
刷新配置文件 如果启动后,修改了ini文件,可以通过reload命令来刷新
supervisorctl reload
查看programname的具体日志
supervisorctl tail xxxxx(我是djangoblog)
查看supervisor的运行状态
ps -efH|grep supervisor
这里提醒一下如果按以上操作出现以下error:
Error: .ini file does not include supervisorctl section
For help, use /usr/local/bin/supervisorctl -h
切换到/etc/supervisor目录执行以上的命令
执行supervisorctl start APP_NAME 或者执行 supervisorctl 的相关命令,如果出现
unix:///tmp/supervisor.sock no such file
说明 Supervisord 服务还没有启动,检查你的 supervisord.conf 文件最后的注释 ; 取消,files 路径没有问题
[include]
files = ./supervisord.d/*.ini ./supervisord.d/*.conf
最后通过热更新来启用这些设置:
sudo supervisorctl update
sudo supervisorctl reload
注意:完成supervisor配置并启动后,收到监管的Gunicorn会随之启动,并运行Django配置好的Django项目,无需单独启动Gunicorn
7.Nginx配置
安装Nginx
yum install nginx
切换到配置文件目录下
cd /etc/nginx
# 备份配置文件
cp nginx.conf nginx.conf.cp
# 修改配置文件
vim /etc/nginx/nginx.conf
删除http{}中的server{}项,添加如下代码:
upstream djangoblog {
# 自动生成的gunicorn端口文件位置
server unix:/data/env/django/DjangoBlog/run/gunicorn.sock fail_timeout=0;
}
server {
server_name xxx.com;
# 你的django项目主目录
root /data/env/django/DjangoBlog;
# 外网访问端口
listen 8000;
keepalive_timeout 70;
access_log /var/log/nginx/djangoblog_access.log;
error_log /var/log/nginx/djangoblog_error.log;
location /static/ {
expires max;
# static目录
alias /data/env/django/collectedstatic/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if (!-f $request_filename) {
proxy_pass http://djangoblog; # 要与upstream同名
break;
}
}
}
使其生效
sudo ln -s /etc/nginx/sites-available/djangoblog.conf /etc/nginx/sites-enabled/djangoblog.conf
#重启nginx
sudo service nginx restart
设置开机启动
sudo systemctl enable nginx
启动服务
sudo systemctl start nginx
8.完结
参考了几篇文章进行部署,发现没有一篇是可以完整部署的,所以这是本人在CentOS 7.4 64位下亲自部署成功的案例,希望对您有帮助~
9.博客
博客文章地址 Nginx+Gunicorn+Virtualenv+Supervisor 部署Django