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

  • A+
所属分类:安全博客
摘要

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


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

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

  • 服务器准备以后就需要在上面安装所需的一些软件,这里用的是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所在目录下执行)
基于centos的Django+gunicorn+ngixn应用部署
在这目录下执行,一般不建议root用户来部署,我这里主要是图省事了
执行完以后应该会有一个admin目录和一个自己的目录,这些就代表执行成功了~~
基于centos的Django+gunicorn+ngixn应用部署
前面软件安装中我们已经成功安装gunicorn了,这里我们就可以先试一下是否能正常启动:
还是在刚才的目录执行:

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

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

3.启动、配置nginx
假设到现在你的nginx已经安装完毕,我的nginx目录是在/usr/local/nginx/sbin ,看一下这个路径下有什么,
基于centos的Django+gunicorn+ngixn应用部署
我们可以在这里目录下使用:

./nginx

启动nginx,然后使用输入

ps -ef|grep nginx

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

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

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

cp nginx.conf nginx.conf.bak

基于centos的Django+gunicorn+ngixn应用部署
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即可查看当前运行的进程:
基于centos的Django+gunicorn+ngixn应用部署
这里我的gunicorn是运行RUNNING状态,当然如果是第一次启动肯定是stopped的,这时候执行start gunicorn命令即可将gunicorn启动(记得执行之前先将gunicorn停止),如果报 Exited too quickly (process log may have details)错,可以去查看日志或者看看是不是gunicorn.py里的deamon为Flase没有改。

结束

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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: