Django 笔记7 – 服务器部署(Nginx + uWSGI + supervisor)
Django 系列笔记是笔者学习、实践使用 Django 的相关笔记,大量参考了知了课堂的《Django零基础到项目实战》教程。
参考文档:
Django官方文档(英文)
Django 中文文档
1、概述
使用 Nginx + uWSGI + supervisor 模式来部署 Django 项目到服务器。
Nginx:
- Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器。
- 静态资源服务:直接响应静态资源文件(css、js、图片),不需经过web应用服务器。
- 反向代理服务:缓存加速、负载均衡。接收所有的 http 请求,分配到web应用服务器集群。
- API服务:利用 nginx 强大的并发性能去访问数据库服务器等的 API 服务
uwsgi:
- uWSGI是实现了 WSGI 、uwsgi、http 等协议的 Web 服务器。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种。
- uwsgi 是一种线路协议而不是通信协议,用于其他网络服务器(Ngnix)与 uWSGI 服务器的数据通信。
- WSGI(Web服务器网关接口:Web Server Gateway Interface)是一种通信协议。Web服务器(nginx,uWSGI)与 web 应用(Flask、Django)通信的一种规范。
supervisor:
- supervisor是 Linux/Unix 系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。
- 用 supervisor 管理的进程,当进程意外被杀死,supervisor监听到进程死后,会自动将它重启。在 uwsgi 异常退出时,supervisor 可以马上重启它,即作为守护进程使用。让网站运行更加稳定。
Web服务器、应用服务器和Web应用框架:
- Web 服务器:处理浏览器发来的 HTTP 请求(request),返回一个 HTTP 响应(response)。Web 服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的传递给相应的应用程序服务器。常见的有Apache,Nginx以及微软的IIS.
- 应用服务器:处理具体的业务逻辑。比如php、python的代码,是不能直接通过nginx这种web服务器来处理的,只能通过应用服务器来处理,常见的应用服务器有uwsgi、tomcat等。
- web应用框架:一般使用某种语言,封装了常用的web功能(eg. 查询数据库然后返回查询结果给 Web 服务器)的框架,常用的 python 应用框架有Django、flask。
2、Nginx 使用
ubuntu下的安装 nginx:
# 安装
sudo apt-get install nginx
常用命令:
# 启动
sudo service nginx start
# 重启
sudo service nginx restart
# 停止
sudo service nginx stop
测试 Nginx 是否可用:
- 启动 Nginx
- 在浏览器中输入ip地址。如果出现欢迎界面,说明成功,否则失败。
编写和添加配置文件:
配置文件默认放在/etc/nginx/conf.d文件夹下。
3、uWSGI 使用
ubuntu下的安装 uwsgi:
# 安装
sudo pip install uwsgi
常用命令:
# 运行 Django 项目,项目名称 mysite。
uwsgi --http :8000 --wsgi-file /opt/mysite/mysite.py -callable app -H /home/xiaotuo/py2-env
编写和添加配置文件:
nginx 接收用户的请求,然后 nginx 通过 http 或者 socket 的方式与 uWSGI 进程间通信,把请求转发给 uWSGI 进行处理,需要进行以下配置。
- 来到/etc/nginx/conf.d目录下,在这个目录下创建一个配置文件,名字随便取,跟你项目名保持一致即可。比如 mysite.conf,然后在里面添加如下配置信息:
# 配置nginx与uwsgi的通信方式和名称,mysite就是名称
upstream mysite {
# nginx使用socket的方式与uwsgi进行通信
# 这里指向你项目的目录下的socket文件,
# 这个socket文件不需要单独创建,在运行的时候会自动创建。
server unix:///opt/mysite/mysite.sock;
}
# 配置服务器
server {
# 监听的端口号
listen 80;
# 域名或者本机的ip地址
server_name .example.com;
charset utf-8;
# 最大的上传大小
client_max_body_size 75M; # adjust to taste
# 访问根目录下的任何url的配置
location / {
# 指定访问哪个upstream
uwsgi_pass mysite;
# 包括uwsgi参数的文件
include /path/to/your/mysite/uwsgi_params;
}
}
- 写完配置文件后,使用以下命令测试配置文件语法是否正确:
sudo service nginx configtest
- 然后cd到项目目录中,使用以下命令运行uWSGI,uWSGI将会把该项目运行起来:
uwsgi --socket mysite.sock --wsgi-file /opt/mysite/mysite.py --callable app -H /home/xiaotuo/py2-env --chmod-socket=666
uWSGI 提供了一种使用配置文件的方式运行 uWSGI,配置文件(假如名字是:mysite_uwsgi.ini)如下:
[uwsgi]
# 当前这个项目的路径
chdir = /opt/mysite
# 模块
module = mysite
# python的虚拟环境
home = /home/xiaotuo/py2-env
# 是否启用mater模式
master = true
# 进程数
processes = 10
# socket文件地址
socket = /opt/mysite/xt_site.sock
# wsgi文件
wsgi-file = /opt/mysite/wsgi.py
# wsgi文件中的app变量
callable = app
# socket文件的权限
chmod-socket = 666
# 示例:
[uwsgi]
chdir = /opt/mysite
home = /home/xiaotuo/py2-env
module = mysite
master = true
processes = 10
socket = /opt/mysite/mysite.sock
wsgi-file = /opt/mysite/mysite.py
callable = app
chmod-socket = 666
# 以后运行uwsgi项目,就只需要运行以下命令即可:
uwsgi --ini mysite_uwsgi.ini
4、supervisor 使用
ubuntu下的安装 uwsgi:
# 安装
sudo pip install supervisor
编写和添加配置文件:
在当前目录下,创建一个 supervisor 的配置文件,比如取名 supervisor.conf,配置信息如下:
# supervisor的程序名字
[program:mysite]
# supervisor执行的命令
command=uwsgi --ini mysite_uwsgi.ini
# 项目的目录
directory = /opt/mysite
# 开始的时候等待多少秒
startsecs=0
# 停止的时候等待多少秒
stopwaitsecs=0# 自动开始
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件
stdout_logfile=/opt/mysite/log/supervisord.log
# 输出的错误文件
stderr_logfile=/opt/mysite/log/supervisord.err
[supervisord]
# log的级别
loglevel=info
# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登录的地址和端口号
serverurl = http://127.0.0.1:9001
# 登录supervisorctl的用户名和密码
username = admin
password = 123
[inet_http_server]
# supervisor的服务器
port = :9001
# 用户名和密码
username = admin
password = 123
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
使用 supervisor 运行 uwsgi:
supervisord -c supervisor.conf
使用 supervisorctl 管理 supervisor:
supervisor是一个C/S模型,有一个服务器,也有一个客户端命令用来管理服务
# 进入到命令界面:
supervisorctl -c supervisor.conf
# 常用的命令。指定的文件必须和 supervisor 服务端保持一致
supervisorctl -c supervisor.conf
> status # 查看状态
> start program_name # 启动程序
> restart program_name # 重新启动程序
> stop program_name # 停止程序
> reload # 重新加载配置文件
> quit # 退出当前的客户端
GOOD LUCK!