1.关于Django
执行python manager.py startproject project
之后,目录应该是这个样子的---->
project/
--project/
--__init__.py
--setting.py
--urls.py
--wsgi.py
--templates/
--your app/
--manage.py
设置project/setting.py
要更改的几个点:
0.在INSTALLED_APPS
加入'gunicorn'
。
1.DEBUG
改成False
,只有关闭了调试模式,后面才能让nginx来寻找静态文件。
2.ALLOWED_HOSTS
,加入你的域名,(或,和)服务器ip。我还加了127.0.0.1
方便本地观察。或者ALLOWED_HOSTS=['*']
3.设置STATIC_ROOT
,建议可以直接设为os.path.join(BASE_DIR, 'static/')
,也就把文件夹在manage.py的根目录里。
4.执行python manager.py collectstatic
,就会将所有静态文件都放到第三步中设置的文件地址中。
2.关于Gunicorn
一开始可以先试着运行一下,进入project这个根目录,然后
gunicorn -w 3 -b 127.0.0.1:8080 project.wsgi:application
gunicorn -w 3 -b 127.0.0.1:8080 --worker-class=gevent project.wsgi:application
这里需要安装gevent模块
。
不出意外,就应该可以跑起来了。
关于project.wsgi:application
的解释,前半截很容易理解,就是调用了project下的wsgi.py,而后面的application,我一开始以为这个application是要改成自己app的名字,后来才发现,这个实际上是wsgi.py中的变量,所以是固定的,不用改。
试着运行没问题之后,可以直接在根目录下创建gunicorn.conf.py
来配置位置,以后运行就用
gunicorn -c gunicorn.conf.py project.wsgi:appliction
因为每次都在命令行输参数好累。
3.关于Nginx
我先尝试讲一下我对django + gunicorn + nginx 这三兄弟的理解。首先我们知道,我们访问网站,就是去网络上的一台电脑里访问某个路径下的某个文件,那django的作用主要是做(生产)这个文件,拿一家餐馆来讲,我认为django就是这个餐馆的厨师,他负责做菜,当规模很小的时候,比如路边卖鸡蛋饼的大妈,因为客人不多,所以可以自己问客人要什么,然后再自己做,这就是django和自带的runserver所做的事情;那当规模变大了,比如普通餐馆,客人很多,厨师做菜都来不急了,根本没时间去问客人要什么,所以这个时候我们就需要服务员了,服务员去记录客人要什么,然后跟厨房讲,接着从厨房拿菜给客人,而在这里,gunicorn就是这个服务员;当规模更大一些的时候,每分钟都有几百个人(现实中来讲这已经是多到爆炸了吧)要进餐馆吃饭,你在餐馆里安排再多的服务员也不能处理完这么多客人的请求,而且餐馆的空间是有限的,服务员也占空间,多了放不下,所以这个时候怎么办呢,答案是在餐馆门口安排咨客,有序地引导客人进入餐馆,也可以在门口就帮客人点好菜,提高整体效率,Nginx就扮演了咨客这个角色。
先来试运行一下nginx,只要启动nginx这个服务,访问本地应该就可以看到nginx的欢迎页了。
因为现在阶段知识最简单的配置,只用到同步worker,所以只需要配置一下监听端口和静态文件的地址就可以了。
server{
listen 80;监听的端口
server_name lilied.com; #测试需要修改/etc/hosts,对应本地IP
#当请求这些server_name的时候,nginx才会做反向代理,0.0.0.0是指全部
location / {
proxy_pass http://127.0.0.1:8080; #这里与gunicorn绑定端口一致
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 {
autoindex on;
alias /home/project/static;
}
# 这个就是配置静态文件的地方,要用绝对地址,对应最开始的目录形式,假设project就在/home下面,那么这样配置就可以的了,还有个前提是,你在开发的时候,采取了django的建议,每个app的静态文件都用多了一层app_name的文件夹来包住。
}
在配置静态文件的时候,alias /xxx/xx/static
的意思就是直接在这个地址上面找,而root /xxx/xx/static
则是在/xxx/xx/static/static
找,就是说root会自动加一个static。
更改完nginx.conf
后,就可以nginx -t
检查一下,ok之后就
service nginx restart
,这样配置就生效了。
确认gunicorn已经运行,那么访问本地应该就可以看到你的网页了。
错误分析:
1.还是看到nginx的欢迎页。去检查gunicorn的监听端口,和nginx转发的端口是否一致;检查是否启用了多个gunicorn;如果gunicorn没有开reload功能,那么在改django代码之后要手动重启gunicorn。
..
2.显示了网站内容,但是静态文件都是404,那就是静态文件地址配错了;静态文件显示403,那就是权限问题,在nginx的配置头部更改user信息,改成你的用户,要注意,你用户有nginx的权限才行,最简单就是把用户加到nginx这个组里面去,当然如果是想立刻看到,直接改成user root
。执行chmod -R 755 /root