初次部署django+gunicorn+nginx

 博客详细地址  https://www.cnblogs.com/nanrou/p/7026802.html

写在前面,这只是我所遇到的情况,如果有错请一定要告诉我,转载请注明出处,码字不易,谢谢。
环境 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。。

初次部署django+gunicorn+nginx的更多相关文章

  1. Django + Gunicorn + Nginx 部署 Ubuntu 服务器

    Django + Gunicorn + Nginx 部署服务器 获取腾讯云 root权限 本人的服务器使用的是腾讯云,腾讯云默认是没有开放 root 用户的,我们来创建 root 用户. 创建 roo ...

  2. Django + Gunicorn + Nginx 部署之路

    前言 最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候 Django 中的路由配置使用 正则 来进行的,但是我有 ...

  3. 11: Django + gunicorn + Nginx 的生产环境部署

    1.1 gunicorn介绍   1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...

  4. [linux]centos7.4部署django+Uwsgi+Nginx

    前言:我已经写了几个接口用来部署在服务器上的,首先选择django+Uwsgi+Nginx因为配置简单,比较符合python的简单操作功能强大的特点 然后对于django的一些版本在之前的文章写了 参 ...

  5. 3_主流部署方式介绍-Django+gunicorn+nginx

    下载python wgethttps://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz 报错 Cannot find a valid baseurl ...

  6. Docker部署Django项目+Nginx+Fluend日志收集 和redis、memcached、RabbitMQ、Celery

    前言 一.docker 1.docker是什么? Docker的英文本意是“搬运工”,Docker搬运的是集装箱(Container)可以成为容器,我可以把写的Django的WEB应用以及Python ...

  7. 用docker部署flask+gunicorn+nginx

    说来惭愧,写了好几个flask django项目都是在原型阶段直接python app.py 运行的,涉及到部署用nginx和gunicorn 都是让别人帮我部署的,据说好像说很麻烦的样子,我就没自己 ...

  8. SLAM+语音机器人DIY系列:(八)高阶拓展——2.centos7下部署Django(nginx+uwsgi+django+python3)

    0.安装步骤预览(1)系统默认自带python2.x,所以需要先安装python3.x(2)python2对应pip,python3对应pip3,用源码安装python3后pip3也自动安装了(3)用 ...

  9. 学习项目部署Django+uwsgi+Nginx生产环境部署

    绪论 项目生产环境部署,是很重的一个知识点.第一,Django自带的服务器很简陋,由于测试和开发环境尚可,无法用于生产环境,保障安全性和可靠性.以及性能.此外,学习部署方式,还有利于了解生产部署后的项 ...

随机推荐

  1. 一些C语言基础知识

    位运算 // 按位与&: 2 & 3 = 2: 010 & 011 = 010   两个1才为1 // 按位或|: 2 | 3 = 3: 010 | 011 = 011   只 ...

  2. c语言编译四大步

    -o: 指定生成后的文件名,后面跟指定的名称 四步:-E 预处理 > -S 编译 > -c 汇编 > 链接 -E: 表示预处理,生成文件为.i,会做宏(define)定义的展开.头文 ...

  3. L1-Day11

    1.问问他能不能来.[我的翻译]Ask him wether he can come.[标准答案]Ask him whether/if he can come.[对比分析]天呐 whether都能拼写 ...

  4. mac 安装和使用MongoDB

    安装 尝试一:手动命令安装尝试二:采用Homebrew尝试三:下载安装包使用安装尝试一:手动命令安装按照官网https://docs.mongodb.com/manual/tutorial/insta ...

  5. C++示例

    Linux C++ template使用示例: #include <iostream> #include <cstring> using namespace std; temp ...

  6. ffmypeg 视频处理类库使用方法

    (经常用到ffmpeg 做一些视频数据的处理转换等,用来做测试,今天总结了一下,参考了网上部分朋友的经验,一起在这里汇总了一下,有需要的朋友可以收藏测试一下,有问题欢迎在下面回帖交流,谢谢;by te ...

  7. selenium+python编写自动化脚本时,定位frame中对象操作

    在web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B.switchTo().frame方法可以把当前定位的主题切换到fr ...

  8. Windows安装redis并将redis设置成服务

    Redis 作为一种缓存工具,主要用于解决高并发的问题,在分布式系统中有着极其广泛的应用,Redis 本身是应用于 Linux/Unix 平台的(部署在服务器上边),官方并没有提供 Windows 平 ...

  9. python3+Robot Framework+PyCharm第一个WEB UI自动化用例

    这里只是列举一个很简单的例子,简单介绍工具的使用,编写用例之前,做好WEB UI自动化的准备工作,下载好chrome驱动(这里以chrome为例,不同浏览器有对应的驱动),注意驱动和浏览器版本要对应, ...

  10. 当运行docker run -i -t ubuntu /bin/bash时,提示报错Error response from daemon: EOF?

    可能是下载过程中出现错误,重新执行docker pull ubuntu,在执行docker run -i -t ubuntu /bin/bash就OK了.