初次部署django+gunicorn+nginx的方法步骤


Posted in Python onSeptember 11, 2019

环境 ubuntu16.04 python3.6 django1.11 gunicorn19.7.1 nginx1.10.3

写在前面

其实无论是在部署,还是在其他方面,我们总会遇到一些问题。建议当感觉自己被卡住的时候,试着退出局部,从更高一层去观察问题,因为这个事情无论是多复杂,它还是由人设计出来的,它身上多多少少带着一些人类思考模式的通性(这个表达有点问题,但是我暂时想不出更好的了),尝试透过现象看本质,比如这个东西它为什么跑不起来,为什么我打开网页永远是404,如果这个时候你直接去问度娘,问逼乎,(我相信能看google的都不会看到这篇东西 :-) )我觉得你很难找到自己想要的答案。我的建议是尽量让问题细化,网页打不开,那往往只代表80端口不能访问,那你可以看看自己服务器的防火墙是不是进制了相关端口,又或者是服务器商帮你设置的安全组是不是把端口都关了;可以尝试ping一下,看服务器在不在线;看一下我们的代理服务器是不是监听了对的端口,诸如此类。

最后,我认为在绝大多数情况下,我们踩过的坑,都是有前人踩过,而且还帮我们填掉了,所以用心找,总能找到答案的。

关于Django

先确认在开发环境下能够正常访问

然后一般情况下,在执行python manager.py startproject project之后,目录应该是这个样子的

project/
  --project/
    --__init__.py
    --setting.py
    --urls.py
    --wsgi.py
  --templates/
  --your app/
  --manage.py

设置project/setting.py

要更改的几个点

1.DEBUG改成False,只有关闭了调试模式,后面才能让nginx来寻找静态文件。

2.ALLOW_HOSTS,加入你的域名,(或,和)服务器ip。我还加了127.0.0.1方便本地观察。

3.设置STATIC_ROOT,建议可以直接设为os.path.join(BASE_DIR, 'static/'),也就把文件夹在manage.py的根目录里。

4.执行python manager.py collectstatic,就会将所有静态文件都放到第三步中设置的文件地址中。

执行完第四步后,目录结构应该是这样

project/
  --project/
    --__init__.py
    --setting.py
    --urls.py
    --wsgi.py
  --templates/
  --your app/
  --manage.py
  --static/
    --auth/
    --your app/
      --css/
      --js/
      --images/

关于Gunicorn

一开始可以先试着运行一下,进入project这个根目录,然后

gunicorn -w 3 -b 127.0.0.1:8080 project.wsgi:application

不出意外,就应该可以跑起来了。

关于project.wsgi:application的解释,前半截很容易理解,就是调用了project下的wsgi.py,而后面的application,我一开始以为这个application是要改成自己app的名字,后来才发现,这个实际上是wsgi.py中的变量,所以是固定的,不用改。

试着运行没问题之后,可以直接在根目录下创建gunicorn.conf.py

来配置位置,以后运行就用

gunicorn -c gunicorn.conf.py project.wsgi:appliction

因为每次都在命令行输参数好累。

我是在docker下面跑的,用nohup来执行的时候,会有问题,报import error,应该是环境变量没有设置好,但我现在还没解决这个问题,所以就只用了&。

关于Nginx

我先尝试讲一下我对django + gunicorn + nginx 这三兄弟的理解。首先我们知道,我们访问网站,就是去网络上的一台电脑里访问某个路径下的某个文件,那django的作用主要是做(生产)这个文件,拿一家餐馆来讲,我认为django就是这个餐馆的厨师,他负责做菜,当规模很小的时候,比如路边卖鸡蛋饼的大妈,因为客人不多,所以可以自己问客人要什么,然后再自己做,这就是django和自带的runserver所做的事情;那当规模变大了,比如普通餐馆,客人很多,厨师做菜都来不急了,根本没时间去问客人要什么,所以这个时候我们就需要服务员了,服务员去记录客人要什么,然后跟厨房讲,接着从厨房拿菜给客人,而在这里,gunicorn就是这个服务员;当规模更大一些的时候,每分钟都有几百个人(现实中来讲这已经是多到爆炸了吧)要进餐馆吃饭,你在餐馆里安排再多的服务员也不能处理完这么多客人的请求,而且餐馆的空间是有限的,服务员也占空间,多了放不下,所以这个时候怎么办呢,答案是在餐馆门口安排咨客,有序地引导客人进入餐馆,也可以在门口就帮客人点好菜,提高整体效率,Nginx就扮演了咨客这个角色。

先来试运行一下nginx,只要启动nginx这个服务,访问本地应该就可以看到nginx的欢迎页了。

因为现在阶段知识最简单的配置,只用到同步worker,所以只需要配置一下监听端口和静态文件的地址就可以了。

server{
  listen 80;监听的端口
  server_name 127.0.0.1;
  server_name 111.111.111.111;
  server_name your_www;
  #当请求这些server name的时候,nginx才会做反向代理,0.0.0.0是指全部
  location / {
   proxy_pass http://127.0.0.1:8080;
   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 /home/project/static;
  }
  # 这个就是配置静态文件的地方,要用绝对地址,对应最开始的目录形式,假设project就在/home下面,那么这样配置就可以的了,还有个前提是,你在开发的时候,采取了django的建议,每个app的静态文件都用多了一层app_name的文件夹来包住。
}

在配置静态文件的时候,alias /path/to/static的意思就是直接在这个地址上面找,而root /path/to/static则是在/path/to/static/static找,就是说root会自动加一个static。

更改完conf后,就可以nginx -t检查一下,ok之后就

service nginx restart,这样配置就生效了。

确认gunicorn已经运行,那么访问本地应该就可以看到你的网页了。

错误分析

  • 还是看到nginx的欢迎页。去检查gunicorn的监听端口,和nginx转发的端口是否一致;检查是否启用了多个gunicorn;如果gunicorn没有开reload功能,那么在改django代码之后要手动重启gunicorn。
  • 显示了网站内容,但是静态文件都是404,那就是静态文件地址配错了;静态文件显示403,那就是权限问题,在nginx的配置头部更改user信息,改成你的用户,要注意,你用户有nginx的权限才行,最简单就是把用户加到nginx这个组里面去,当然如果是想立刻看到,直接改成 user root。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python常见数制转换实例分析
May 09 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Python中模块与包有相同名字的处理方法
May 05 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
Python解析并读取PDF文件内容的方法
May 08 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
python selenium xpath定位操作
Sep 01 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 #Python
学习Django知识点分享
Sep 11 #Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 #Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 #Python
python破解bilibili滑动验证码登录功能
Sep 11 #Python
python修改FTP服务器上的文件名
Sep 11 #Python
解析python实现Lasso回归
Sep 11 #Python
You might like
php设计模式 Singleton(单例模式)
2011/06/26 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
python保存字符串到文件的方法
2015/07/01 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Python线程指南分享
2019/11/19 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
如何写你的创业计划书
2014/01/07 职场文书
安全生产实施方案
2014/02/23 职场文书
财务总监岗位职责
2014/03/07 职场文书
质量标语大全
2014/06/12 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
校长个人总结
2015/03/03 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
月考总结与反思
2015/10/22 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL