Ubuntu下Nginx+gunicorn部署Django

做后台开发,不光需要python的基础知识和Django框架的熟悉,还应该需要知道具体怎么部署一个服务器,包括服务器的性能,处理并发的能力,否则一个项目就算做出来也只能自我安慰。

尽管网上关于这类部署的教程有很多,但是不太详细,所以作为同样是新手的我先踩踩坑,为各位大佬垫垫底。

一、基础知识

nginx

Ngnix是一个轻量级高性能的HTTP和反向代理服务器,工作在HTTP层,具有强大的稳定、丰富的功能集、实例配置文件和低系统资源消耗。当然Apache也是个很好的选择,但我选择了Nginx,因为国内越来越多的服务器网站开始转向Nginx,从某种程度上说明Nginx可能比Apache更高性能和稳定

Gunicornn

Gunicorn 绿色独角兽是一个Python WSGI UNIX的HTTP服务器,这是一个pre-fork-worker的模型,从Ruby的独角兽(Unicorn)项目一职。改Gunicornfuwuqi大致与各种Web款回家兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。
图片源自:http://www.oschina.net/p/gunicorn/
当然,Uwsgi也是一个很好的选择,但从配置过程来看,gunicorn会比uwsgi来得简单,并且gunicorn能更好地嵌套Django。

Supervisor

Supervisor是一个用python写的进程管理工具,可以很方便的用来启动、重启关闭进程(不仅仅是Python进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程。但是这个工具只支持Python2,不支持Python3,这点在安装是就体现出来。如果你使用的是Python3,也可以安装其他类似的工具,如monit

nginx与gunicorn作用

nginx作为反向代理,工作在HTTP层,缓冲请求和响应,然后转发给指定的服务器或进程,这里是转发给gunicorn,,gunicorn将收到的请求分配到指定的具体空闲进程。nginx更强大的功能是直接处理静态文件,提供额外的访问控制,限速,限连接数等等。整个过程实现负载均衡,以及并发处理。

二、部署方法:

这里,我假设各位已经对Django有一定的了解,并且创建过一个project,所以我就直接从创建好Django项目开始!


我所部署的服务器: 腾讯云 1核 1GB内存 20GB(云硬盘) Ubuntu 16.04.1 LTS 64位

1、安装

安装之前,如果你是工作在virtualenv环境下的话,记得先进入到virtualenv环境!

1
$ source /path/to/env/bin/activate

如果没有使用virtualenv的话就没必要进入了。

安装gunicorn:

1
$ pip install gunicorn

安装supervisor:

1
$ pip install supervisor

安装nginx:

1
$ sudo apt install nginx

2、配置Django

首先确保Django项目能正常访问!

然后我们来配置Django的settings.py文件,添加ALLOW_HOSTS使项目能从外网访问。一般申请云服务器都会有两个主IP地址,公网和内网IP,我们只需要添加公网IP就足够了:

settings.py :

1
ALLOWED_HOSTS = ['公网IP']

为了方便nginx可以直接处理静态文件,我们可以预先将项目的静态文件放在一起,在项目目录下创建collectedstatic文件夹:

添加settings.py:

1
2
3
4
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic')

这里的BASE_DIR一般Django会自带有。

然后运行命令:

1
$ python manage.py collectstatic

3、配置gunicorn和supervisor

对于gunicorn需要了解用法即可:
进入virtualenv,输入命令:

1
$ gunicorn -w3 -b0.0.0.0:8080 /path/to/project/project.wsgi
  • -w3: 表示启用3个进程,官方说法 进程数 = 2*CPU个数 + 1
  • -b0.0.0.0:8080: 表示绑定全网IP(即0.0.0.0),占用8080端口,这里端口号可以改其他,但请记得是那个。

如果运行失败,可能是限权不够,提升限权即可,更有可能是8080端口被占用,你可以用一下命令查看:

1
$ netstat -anpl | grep 8080

确实被占用的话要么kill了那个进程,要么选择其他端口。

配置supervisor

首先生成supervisor默认配置文件:

1
$ (sudo) echo_supervisord_conf > /path/to/supervisord.conf

/path/to/supervisord.conf 是存放配置文件的路径

然后打开supervisord.conf, 在最底部添加(每一行前面不要有空格,防止报错):

1
2
3
4
5
6
[program:projectname]
command=/path/to/gunicorn -w3 -b0.0.0.0:8080 /path/to/project/project.wsgi
directory=/path/to/project
user=username
autostart=true
autorestart=true

  • projectname:项目名,也可以其他名字,用于supervisor启动;
  • command:命令行,和gunicorn的命令一样
  • user: 能够使用的用户,即你当前登陆服务器的用户,也可以是root

配置好后,就可以运行:

1
$ supervisord -c /path/to/supervisord.conf

初次使用最好运行上面这条命令,相当于告知配置文件,然后就可以用下面命令方便启动、停止、重启:

1
$ supervisorctl start|stop|restart projectname

启动后可以尝试从外网进行访问!

4、配置nginx

创建配置文件project.conf

1
2
$ cd /etc/nginx/sites-available
$ touch project.conf

一般默认放在 /etc/nginx/sites-available 中
配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name 公网IP;
root /path/to/project;
error_log /path/to/nginx_log.log debug;
location /static {
alias /path/to/project/collectedstatic;
}
location / {
proxy_pass http://0.0.0.0:8080;
include /etc/nginx/proxy_params;
}
}

配置完成后,激活配置文件:

1
$ sudo ln -s /etc/nginx/sites-available/project.conf /etc/nginx/sites-enabled/project.conf

然后检查配置语法问题:

1
$ nginx -t

启动、重启、停止nginx服务器:

1
$ sudo service start|restart|stop

或者

1
$ nginx -s reload|stop

这里有个小bug,nginx停止后再启动比较容易出现错误:

1
nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directort

这个错误是因为nginx不正常关闭导致/run/nginx.pid文件丢失,解决方法:

1
nginx -c /etc/nginx/nginx.conf

到此,整个简单服务器就算部署就好了!

最后附送几个可能会用到的ubuntu命令:

查看gunicorn占用端口:

1
ps -ef | grep gunicorn

查看运行时间,健康状态和平均负载:

1
w

or

1
uptime

vim编辑下只读,无法保存?vim下运行命令

1
:w !sudo tee %


声明:

欢迎转载,转载时请注明出处
JacobYRJ