基于centos的Django+gunicorn+ngixn应用部署

准备工作—-所需软件安装

  • 准备服务器,可以购买腾讯云、百度云、华为云等,本次部署采用了百度云,具体购买可以到官网去看看,很简单,这步就略过了;

  • 服务器准备以后就需要在上面安装所需的一些软件,这里用的是centos的,首先自带的python环境是2.7的,不满足本次部署需要,如果使用django2.0以上,建议安装python3; mysql、python3、virualen、superviosr将单独列一篇安装教程,下列非必须的为不一定要安装的;

  • 安装mysql 参考 基于docker快速安装mysql教程

  • 安装python3

  • 安装Virtualen(非必须)

  • nginx

  • superviosr

  • git(非必须)

    yum -y install git 
  • gevent(非必须)

    pip install gevent  
  • 安装gunicorn

    pip install gunicorn

上传与下载代码

通常来说我们可以使用ftp、sftp等方式将代码上传到Linux上,但是这样做不太有利于版本的控制,只适用于自己玩玩的小项目,在此使用git进行代码管理,借此机会也在此温习一下git的一些命令。

部署与配置

1.确保django setting里的必要设置都已完成

DEBUG = False# 生产部署必须设置为False

#这里请设置为自己的域名,没有域名暂时设置为自己服务器ip
ALLOWED_HOSTS = ['www.happyhong.cn',"127.0.0.1"]
STATIC_URL = '/static/'
#STATIC_ROOT=os.path.join(BASE_DIR,"static/")#错误
#如果不设置STATIC_ROOT,当你在执行python manage.py collectstatic会遇到以下报错
#django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the #STATIC_ROOT setting to a filesystem path.
STATIC_ROOT=os.path.join(BASE_DIR,"/static/")#正确
STATICFILES_DIRS  = (
    os.path.join(BASE_DIR,"static"),
                )
再提一下,必须设置STATIC_ROOT,否则会报:

django.core.exceptions.ImproperlyConfigured: You’re using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.

2.设置好以后就可以执行python manage.py collectstatic命令(请在manag.py所在目录下执行)
在这里插入图片描述
在这目录下执行,一般不建议root用户来部署,我这里主要是图省事了
执行完以后应该会有一个admin目录和一个自己的目录,这些就代表执行成功了~~
在这里插入图片描述
前面软件安装中我们已经成功安装gunicorn了,这里我们就可以先试一下是否能正常启动:
还是在刚才的目录执行:

gunicorn -w 3 -b 127.0.0.1:8080 blog.wsgi:application
这里要说明一下**blog.wsgi:application**,blog需要改为你的项目名称,application是固定参数不用变。

在这里插入图片描述
如果有这样的输出则证明启动成功,其中有个gevent不用管,这是我后来安装的。可以在浏览器中输入你的ip访问一下应该是能成功的,但是css和js样式应该是没有的,接下来就要依靠nginx进行处理了;

3.启动、配置nginx
假设到现在你的nginx已经安装完毕,我的nginx目录是在/usr/local/nginx/sbin ,看一下这个路径下有什么,
在这里插入图片描述
我们可以在这里目录下使用:

./nginx

启动nginx,然后使用输入

ps -ef|grep nginx

命令进行查看nginx进程:
如果看到这样的进程说明可以正常启动。在这里插入图片描述
或者也可以直接在浏览器输入 你的域名(或者ip):80,如果页面上有nginx关键字就说明启动成功,这里不再贴图。
接下来我们开始配置nginx配置文件:

cd /usr/local/nginx/conf
ls -l

然后使用ls -l命令查看,应该有一个nginx.conf的文件,我们再使用命令将原来默认配置文件进行备份。

cp nginx.conf nginx.conf.bak

在这里插入图片描述
vi nginx.conf

user root;#如果使用的root用户一定要加,否则会报没有权限的错误,其它用户可加

#event也必须加上
events {
    worker_connections  1024;
}
http{
    #下面两行看情况加上,如果前端console报Resource interpreted as Stylesheet but transferred with MIME type text/plain;
    #则需要加上才能避免
    include       mime.types;
    default_type  application/octet-stream;

server{
    listen 80;#监听的端口不需要改
    server_name www.happyhong.cn;#这里可换成你的域名或者ip
    location / {
      proxy_pass http://127.0.0.1:8080;#不用改
      proxy_set_header Host $host;#
      proxy_set_header X-Real-IP $remote_addr;#获取远程ip
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
    location /static {
      alias /root/www/blog/static/;#要有最后的斜杆
    }
}
}

接下来让nginx重新载入配置文件:

/usr/local/nginx/sbin/nginx -s reload 

nginx配置结束。

4.配置gunicorn
gunicorn最好还是以配置文件的形式进行启动,因为gunicorn是python进行开发的,所以我们可以在项目根目录下(也就是与menage.py同级的)创建一个gunicorn.py的文件,vi gunicorn.py

#!/usr/bin/env python
#导入库
import multiprocessing
#得到cpu个数
cpu_count = multiprocessing.cpu_count()
#必须,绑定等于gunicorn -w 3 -b 127.0.0.1:8080 blog.wsgi:application中的 -b
bind="127.0.0.1:8080"

backlog=64
#必须,进程个数等于gunicorn -w 3 -b 127.0.0.1:8080 blog.wsgi:application中的 -w
worker=cpu_count*2+1

#这里我采用了“gevent”,可以实现更高的并发,安装也很简单,pip install  gevent即可
worker_class="gevent"

#线程数,可选
threads=3

worker_connections=500

#超时时间,建议加上,一般我们个人用的服务器配置都一般,响应时间可能会比正常得要高
timeout=60

keepalive=2

#启动之前切换到的目录,改为你自己的项目目录
chdir="/root/www/blog"

#这个建议设为False,因为我们后面要用superviosr进行管理,如果这项为True会导致superviosr启动gunicorn报错
daemon=False

#日志目录,可有可无,因为nginx的日志已经差不多满足了
accesslog="/var/log/gunicorn/access.log"
#日志格式h:远程ip l:- m:请求方法....
access_log_format = '%(h)s %(l)s %(m)s %(u)s %(t)s %(l)s %(s)s %(a)s'
#可有可无
errorlog="/var/log/gunicorn/error.log"
#日志等级,可有可无
loglevel="info"

如果你不想手动敲只需将上面的内容复制然后目录改为自己的就行。
这样我们就可以将gunicorn用配置文件启动,再尝试启动之前我们先将原本的gunicorn进程杀掉,使用命令

pkill -f gunicorn

,可以用ps -ef|grep gunicorn确认是否杀掉,如果有没有杀掉的可用:

kill -9 进程id

,然后我们可以使用这个命令尝试使用配置文件启动gunicorn(依然是在项目根目录下进行执行),

gunicorn -c gunicorn.py blog.wsgi:application

更加安全的方法是加上gunicorn的路径,例如:

/root/virtlen/py3/bin/gunicorn -c gunicorn.py blog.wsgi:application

我的是装在virtlen中的,强烈建议使用virtualen进行管理,如果你跟我一样使用了virtualen,那还需要加上虚拟环境的python路径:

/root/virtlen/py3/bin/python   /root/virtlen/py3/bin/gunicorn -c gunicorn.py blog.wsgi:application
命令分为三部分:
/root/virtlen/py3/bin/python:python路径   
 /root/virtlen/py3/bin/gunicorn:gunicorn路径
 -c gunicorn.py:参数

注意python路径和gunicorn路径中的空格,这样做能避免很多不必要的报错,例如找不到路径等等。至此,gunicorn配置部分结束。

5.supervisor管理gunicorn
假设你的superviosr已经按照步骤安装完毕,接下来需要在supervisor配置文件路径下新建一个gunicorn.ini的文件,我的路径是在 /var/local/super/conf,这个路径下专门存放supervisor的应用配置文件。

vi gunicorn.ini
#program是固定的,gunicorn是你取得名字,我们一会需要利用这个名字启动应用
[program:gunicorn]
#这个命令刚才上面解释过了
command=/root/virtlen/py3/bin/python /root/virtlen/py3/bin/gunicorn -c gunicorn.py blog.wsgi:application
#启动应用的目录
directory=/root/www/blog
#启动应用的用户
user=root
#自动重启
autorestart=true
#重启次数
startretires=3
redirect_stderr=true
stderr_logfile=/var/local/super/log/error.log
stdout_logfile=/var/local/super/log/out.log                                         

接下来查看superviosr是否正常启动了,如果启动了则使用命令进行配置文件更新,

supervisorctl update

这个命令对配置没有更新的进程并没有影响;然后使用

supervisorctl

进入superviosr客户端,输入status即可查看当前运行的进程:
在这里插入图片描述
这里我的gunicorn是运行RUNNING状态,当然如果是第一次启动肯定是stopped的,这时候执行start gunicorn命令即可将gunicorn启动(记得执行之前先将gunicorn停止),如果报 Exited too quickly (process log may have details)错,可以去查看日志或者看看是不是gunicorn.py里的deamon为Flase没有改。

结束

到此你可以在浏览器中输入你的域名或者ip:port访问你的网址了,如果还有错误请将错误贴在评论里,最后再厚颜无耻的替自己网站打个广告:从今天开始种树,欢迎大家批评指正,软件安装稍后会更新。。


   转载规则


《基于centos的Django+gunicorn+ngixn应用部署》 罗华 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Centos下python3和virtualenv的安装 Centos下python3和virtualenv的安装
前言最近买了个云服务器,Linux自带python2.7,都快出python4了,这至少怎么说也得换个python3.6以上的玩玩啊,刚好记录一下安装过程,顺便安装了极其好用的virtualenv,希望对正在安装的人也有帮助。 安装步骤py
2020-05-25
下一篇 
深入浅出图神经网络:GNN原理解析(一) 深入浅出图神经网络:GNN原理解析(一)
前言最近在学习图神经网络相关知识,一起来拆书:《深入浅出图神经网络:GNN原理解析》,这本书从原理、算法、实现、应用四个维度详细讲解了图神经网络。接下来打算结合书本内容和相关知识做个专题记录分享,今天先跟大家聊聊关于图的一些基础知识。 ==
2020-04-11
  目录