本项目采用三层架构部署,Nginx 作为反向代理服务器,WSGI 层使用 uWSGI,Web 应用为 Django;同时,使用 Supervisor 进程守护工具守护 uWSGI 进程。
项目地址
准备工作
在开发阶段,调试模式处于打开状态可以方便我们调试,但部署到生产环境显然不能这么做,必须对 Django 项目设置文件settings.py做些修改,提升系统安全性:
|
|
开发阶段,调试模式开启时 Django 会自动找到项目的静态文件来响应请求,关闭后 Django 将不处理对静态文件的请求,对这些请求返回 404 错误;部署到线上时,Nginx 会处理对静态文件的请求,所以必须将项目涉及到的静态文件搜集起来。在settings.py文件中添加STATIC_ROOT字段,设置搜集起来的静态文件的保存目录:
|
|
执行搜集静态文件的命令:
|
|
在项目根目录下将生产一个static文件夹,里面保存了项目用到的所有静态文件。
创建运行环境依赖文件requirements.txt:
|
|
正式部署
创建运行环境
首先,将项目所有的文件导入服务器用户目录 /home/sun/django_blog,创建运行环境:
|
|
创建数据库
原项目里的数据库文件可以保留,跳过这一步也没问题;如果不保留原有数据库,可以按下面步骤重新创建数据库并导入数据结构:
生成数据库文件:
|
|
生成数据结构迁移文件:
|
|
将数据结构写入数据库:
|
|
创建管理员账号:
|
|
运行 Django:
|
|
测试输出是否正常:
|
|
配置uWSGI
安装 uWSGI
|
|
配置 uWSGI
在 Django 项目目录下新建 uWSGI 配置文件 uwsgi_config.ini 并输入
|
|
启动 uWSGI
|
|
配置Nginx
安装 Nginx
|
|
配置 Nginx
配置文件目录:/etc/nginx/conf.d 目录下的 default.conf
即使已经有监听同一个端口的应用,也可以直接添加另一个应用,因为他们的
server_name不同,Nginx 会自动处理好不同站点的转发。
|
|
启动 Nginx:
|
|
Nginx 相关命令:
|
|
配置Supervisor
Supervisor 有两个主要的组成部分:
supervisord
它是 Supervisor 的服务端,运行 Supervisor 时会启动一个 supervisord 进程,负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,将普通的命令行进程变为后台daemon,响应客户端命令、监控进程状态、自动重启 crashed 掉的子进程、记录子进程的 stdout、stderr 等。
supervisorctl
它是 Supervisor 的客户端,提供了 shell-like 接口来调用 supervisord,通过 supervisorctl 用户可以连接到多个 supervisord 进程,获取supervisord 所管理的子进程状态,可以执行 stop、start、restart 等命令来管理这些子进程。
安装完 uWSGI、Nginx 后,Nginx 可以直接设置开机启动,但 uWSGI 还不能直接开机启动,这里我用 Supervisor 来启动并守护 uWSGI 运行,在全局 Python 环境安装 Supervisor:
|
|
配置 Supervisor:
配置文件目录:/etc/supervisord.conf
|
|
设置 supervisord 开机启动
|
|
启动 supervisord
|
|
查看 django_blog 进程是否运行
|
|
supervisord 相关命令
|
|
supervisorctl 相关命令
|
|
Django静态文件处理
根据上面的步骤,一般能成功运行起来 Django,主页面的访问也没问题。
当打开 Django 管理页面 公网IP:端口/admin,发现登录页面的样式丢失了,查看网页源代码,发现点击静态文件会产生 403 错误的返回,说明服务器收到了请求但拒绝处理请求,信息是 Nginx 服务器返回的,接着想到查看 Nginx 日志,打开 /var/log/nginx/error.log 文件,发现有这样的错误:
|
|
说明打开静态文件失败是由于Permission denied产生的,很可能与 Nginx 进程的权限和静态文件的权限有关,打开 Nginx 配置文件 /etc/nginx/nginx.conf :
|
|
发现 Nginx worker process 是以 nginx 用户启动的,将 worker 启动用户改为 django_blog/static/ 目录所有者用户相同:
|
|
重启 Nginx 进程
|
|
Django 管理页面的样式恢复了。
参考:nginx+django+uwsgi static files 403 Forbidden