- 当Django运行在生产环境时,将不再提供静态文件的支持,需要将静态文件交给静态文件服务器。我们需要收集项目中静态文件,并放到静态文件服务器中。我们使用Nginx服务器作为静态文件服务器。
- 基本思路
1.方案:Nginx+uwsgi
这样大体的流程是:nginx作为服务器最前端,负责接收client的所有请求,统一管理。静态请求由Nginx自己处理。非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
2,通信请求
the web client <–> the web server(nginx) <–> the socket <–> uwsgi <–> Django
Nginx部署静态数据
1. 收集项目静态文件
- 1.配置收集静态文件存放的目录
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), ‘static’) - 2.执行收集静态文件命令
$ python manage.py collectstatic
2. 部署Nginx服务器提供静态数据
-
1.打开Nginx服务器配置文件
-
$ sudo vim /usr/local/nginx/conf/nginx.conf
-
2.修改Nginx服务器配置文件
-
`http {
server { # 静态服务
listen 端口号;
server_name 域名;
location /static {
alias /home/python/static;
}
location /detail {
alias /home/python/static/detail;
}
location = / {
root /home/python/static;
index index.html index.htm;
}
location = /index.html { #首页
root /home/python/static;
index index.html index.htm;
}
}
}`
3.启动Nginx服务器
检查配置文件
$ sudo /usr/local/nginx/sbin/nginx -t
首次启动
$ sudo /usr/local/nginx/sbin/nginx
重启
sudo /usr/local/nginx/sbin/nginx -s reload
停止
$ sudo /usr/local/nginx/sbin/nginx -s stop`
- Nginx默认监听80端口
所以安装完毕,访问localhost或者服务器自己的ip地址就可以看到下面的画面。
Nginx反向代理动态业务
配置uwsgi
- 安装uwsgi
pip install --upgrade pip #升级pip
pip install uwsgi`
- 编写测试
写一个test.py测试uwsgi
test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
然后执行shell命令:
uwsgi --http :8001 --wsgi-file test.py
此时访问8001端口,就可以看到Hello World
- 连接uwsgi与Django
测试Django自身,
确保Django自身可以启动运行,在Django应用的目录下:
python manage.py runserver 0.0.0.0:8002
访问8002端口,如果正常,说明Django启动成功!
- 编写wsgi.py文件
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。
import os
import sys
#将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")#mysite替换为自己的项目名
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
- 连接Django和uwsgi
通过Django与uwsgi就已经可以形成一个简单的web服务器了
编写完成django_wsgi.py文件后执行:
uwsgi --http :8000 --chdir path/to/yoursite --module django_wsgi
这样,就可以在浏览器中的8000端口访问Django程序了。
所有的请求都是经过uwsgi传递给Django程序的。