写在前面,这只是我所遇到的状况,若是有错请必定要告诉我,转载请注明出处,码字不易,谢谢。
环境 ubuntu16.04 python3.6 django1.11 gunicorn19.7.1 nginx1.10.3css
其实不管是在部署,仍是在其余方面,咱们总会遇到一些问题。建议当感受本身被卡住的时候,试着退出局部,从更高一层去观察问题,由于这个事情不管是多复杂,它仍是由人设计出来的,它身上多多少少带着一些人类思考模式的通性(这个表达有点问题,可是我暂时想不出更好的了),尝试透过现象看本质,好比这个东西它为何跑不起来,为何我打开网页永远是404,若是这个时候你直接去问度娘,问逼乎,(我相信能看google的都不会看到这篇东西 :-) )我以为你很难找到本身想要的答案。个人建议是尽可能让问题细化,网页打不开,那每每只表明80端口不能访问,那你能够看看本身服务器的防火墙是否是进制了相关端口,又或者是服务器商帮你设置的安全组是否是把端口都关了;能够尝试ping一下,看服务器在不在线;看一下咱们的代理服务器是否是监听了对的端口,诸如此类。python
最后,我认为在绝大多数状况下,咱们踩过的坑,都是有前人踩过,并且还帮咱们填掉了,因此用心找,总能找到答案的。nginx
先确认在开发环境下可以正常访问docker
而后通常状况下,在执行python manager.py startproject project
以后,目录应该是这个样子的django
project/ --project/ --__init__.py --setting.py --urls.py --wsgi.py --templates/ --your app/ --manage.py
设置project/setting.py
ubuntu
要更改的几个点安全
1.DEBUG改为False
,只有关闭了调试模式,后面才能让nginx来寻找静态文件。服务器
2.ALLOW_HOSTS,加入你的域名,(或,和)服务器ip。我还加了127.0.0.1
方便本地观察。网络
3.设置STATIC_ROOT,建议能够直接设为os.path.join(BASE_DIR, 'static/')
,也就把文件夹在manage.py
的根目录里。app
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/
一开始能够先试着运行一下,进入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
,应该是环境变量没有设置好,但我如今还没解决这个问题,因此就只用了&
。
我先尝试讲一下我对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已经运行,那么访问本地应该就能够看到你的网页了。
错误分析