阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Django服务器部署

398次阅读
没有评论

共计 9871 个字符,预计需要花费 25 分钟才能阅读完成。

Django 在 Python 语言中是最受欢迎的全栈式 web 框架,过去部署 Django 应用一般采用 Apache+mod_wsgi,但是随着 Nginx 出色的性能表现,Django 也有了更先进的部署方式,比较常用的一种部署方案是 Nginx+Gunicorn。接下来我会详细介绍一个完整的符合生产条件的部署过程及组件,这些组件全部属于开源实现。

前提条件

我假设你对 Linux 有基本的了解, 而且拥有一台 root 权限的主机. 我使用的服务器是 Ubuntu12.04. 你也可以选择其他 Linux 发行版 (如:CentOS、Fedora),相应的安装包管理方式分是apt-getyum。

系统更新

$ sudo apt-get update
$ sudo apt-get upgrade

安装 MySQL

$ sudo apt-get install mysql-server

安装过程中会提示输入数据库密码, 安装成功后创建一个 MySQL 新用户, 并赋予权限

# 以管理员身份登录
mysql -uroot -p         

#选择 mysql
use mysql               

#创建用户名和设定密码
create user 'test_user'@'localhost' identified by 'password' 

#创建数据库
create database test_db 

#授予 test_user 操作 test_db 的所有权限
grant all privileges on test_db.* to test_user@localhost identified by 'password'

#使所有操作生效
flush privileges

安装 virtualenv, 为 app 创建一个独立的 python 环境

Virtualenv 可以在系统中创建一个独立的 python 环境, 多个应用彼此不受影响, 这样不同的应用使用的依赖库就不会相互冲突(比如一个应用是基于 Django1.5, 另一个应用可以用 virtualenv 创建新的 python 环境来使用 Django1.6). 当然它的安装也很简单

sudo apt-get install python-virtualenv
为 app 创建并且激活一个 python 环境

我们把应用创建在 /webapps 目录下面,

$ cd /webapps/
$ virtualenv hello_django

New python executable in hello_django/bin/python
Installing Setuptools....................................done.
Installing Pip...........................................done.

$ cd hello_django
$ source bin/activate
(hello_django) $                #注意 `$` 符号前的 hello_django, 此时表明你已经在这个新的 python 执行环境中

现在 python 环境激活了, 你就可以在这个环境中安装 django 等其他库

(hello_django) $ pip install django

Downloading/unpacking django
  Downloading Django-1.6.1.tar.gz (6.6MB): 6.6MB downloaded
  Running setup.py egg_info for package django

    warning: no previously-included files matching '__pycache__' found under directory '*'
    warning: no previously-included files matching '*.py[co]' found under directory '*'
Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    warning: no previously-included files matching '__pycache__' found under directory '*'
    warning: no previously-included files matching '*.py[co]' found under directory '*'
    changing mode of /usr/local/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

接下来就创建一个空的 django 项目

(hello_django) $ django-admin.py startproject hello

用开发模式测试一下项目是否可以正常运行

(hello_django) $ cd hello
(hello_django) $ python manage.py runserver localhost:80

Validating models...

0 errors found
January 17, 2014 - 10:34:13
Django version 1.6.1, using settings 'hello.settings'
Starting development server at http://localhost:80/
Quit the server with CONTROL-C.

此时你应该可以正常访问:http://localhost 了.

配置 MySQL 配合 Django 工作

Django 使用 MySQL 作为后端存储需要使用 MySQL-python 数据库适配器,但是它需要依赖本地扩展库python-devlibmysqlclient-dev,所以先安装依赖库

$ sudo apt-get install python-dev libmysqlclient-dev

安装 MySQL-python

(hello_django) $pip install mysql-python

在 settings.py 中配置数据库信息

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test_db',
        'USER': 'test_user',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',                      # Set to empty string for default.
    }
}

django 初始化数据库,默认 Django 会创建一些数据表

(hello_dango) $ python manage.py syncdb

为应用创建系统用户

虽然 DJango 有完善的安全追踪记录,但是如果应用对服务器资源的访问限制在自己的范围内,可以避免无谓的入侵危害,因此我们的 web 应用应该使用有限制权限的用户来运行这个 web 应用。

为应用创建一个用户,名字叫做hello,附给系统组叫webapps

$ sudo groupadd --system webapps
$ sudo useradd --system --gid webapps --home /webapps/hello_django hello 

Gunicorn

在生产环境下我们就不应该使用 Django 自带的单线程的开发服务器,Gunicorn 就是很好的选择。

(hello_django) $ pip install gunicorn

Downloading/unpacking gunicorn
  Downloading gunicorn-0.17.4.tar.gz (372Kb): 372Kb downloaded
  Running setup.py egg_info for package gunicorn

Installing collected packages: gunicorn
  Running setup.py install for gunicorn

    Installing gunicorn_paster script to /webapps/hello_django/bin
    Installing gunicorn script to /webapps/hello_django/bin
    Installing gunicorn_django script to /webapps/hello_django/bin
Successfully installed gunicorn
Cleaning up...

安装成功后,现在你可以通过一下命令测试下你的 django 应用能否运行在 gunicorn 上面。

(hello_django) $ gunicorn hello.wsgi:application --bind 0.0.0.0:8001

现在你应该可以访问 Gunicorn 服务器从 http://localhost:8001 , Gunicorn 安装好后,接下来再写一个 bash 脚本做一些配置使之用起来更方便。文件保存为bin/gunicorn_start.sh

#!/bin/bash
NAME='hello_app'                                   #应用的名称
DJANGODIR=/webapps/hello_django/hello              #django 项目的目录
SOCKFILE=/webapps/hello_django/run/gunicorn.sock   #使用这个 sock 来通信
USER=hello                                         #运行此应用的用户
GROUP=webapps                                      #运行此应用的组
NUM_WORKERS=3                                      #gunicorn 使用的工作进程数
DJANGO_SETTINGS_MODULE=hello.settings              #django 的配置文件
DJANGO_WSGI_MODULE=hello.wsgi                      #wsgi 模块

echo "starting $NAME as `whoami`"
#激活 python 虚拟运行环境
cd $DJANGODIR
source ../bin/activate
export  DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

#如果 gunicorn.sock 所在目录不存在则创建
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

#启动 Django

exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
    --name $NAME \
    --workers $NUM_WORKERS \
    --user=$USER --GROUP=$GROUP \
    --log-level=debug \
    --bind=unix:$SOCKFILE

用户 hello 将运新这个应用,那么要把这个应用的目录的权限交给hello

$ sudo chown -R hello:users /webapps/hello_django
$ sudo chmod -R g+w /webapps/hello_django
$ sudo chmod u+x bin/gunicorn_start.sh

如果你还不是组 users 的成员,使用下面命令:

$ sudo usermod -a -G users `whoami`

现在就可以切换到用户 hello 来执行这段脚本:

$sudo su - hello
$bin/gunicorn_start.sh

Starting hello_app as hello
2014-01-17 15:59:25 [10724] [INFO] Starting gunicorn 18.0
2014-01-17 15:59:25 [10724] [DEBUG] Arbiter booted
2014-01-17 15:59:25 [10724] [INFO] Listening at: unix:/webapps/hello_django/run/gunicorn.sock (10724)
2014-01-17 15:59:25 [10724] [INFO] Using worker: sync
2014-01-17 15:59:25 [10735] [INFO] Booting worker with pid: 10735
2014-01-17 15:59:25 [10736] [INFO] Booting worker with pid: 10736
2014-01-17 15:59:25 [10737] [INFO] Booting worker with pid: 10737

^C (CONTROL-C to kill Gunicorn)

2014-01-17 15:59:28 [10736] [INFO] Worker exiting (pid: 10736)
2014-01-17 15:59:28 [10735] [INFO] Worker exiting (pid: 10735)
2014-01-17 15:59:28 [10724] [INFO] Handling signal: int
2014-01-17 15:59:28 [10737] [INFO] Worker exiting (pid: 10737)
2014-01-17 15:59:28 [10724] [INFO] Shutting down: Master
$ exit

–workers 设置的个数规则是:2*CPUs+1。因此单核 CPU 机器的进程数设置为 3 个。
–name 默认是 gunicorn,置顶后,可以通过topps查看到,唯一标识其进程。

s 使用 Supervisor 启动、监控

gunicorn_start脚本现在准备就绪,我们需要确保系统能够自动启动或者重启,因为系统可能会由于某些原因导致异常终止,这个任务就交给 supervisor,它的安装也非常简单:

$ sudo apt-get insatll supervisor

安装后,在 /etc/supervisor/conf.d/ 目录下创建配置文件/etc/supervisor/conf.d/hello.conf,用来启动监视应用程序。

[program:hello]
command = /webapps/hello_django/bin/gunicorn_start.sh                 ; Command to start app
user = hello                                                          ; User to run as
stdout_logfile = /webapps/hello_django/logs/gunicorn_supervisor.log   ; Where to write log messages
redirect_stderr = true  

创建文件存储日子:

$ mkdir -p /webapps/hello/logs
$ touch /webapps/hello_django/logs/gunicorn_supervisor.log

配置好了之后,supervisor 重新加载配置文件

$ sudo supervisorctl reread
hello: available
$ sudo supervisorctl update
hello: added process group

同时你还可以检查 app 的状态、启动、停止、重启

$ sudo aupervisorctl status hello
hello                RUNNING
$ sudo supervisorctl stop hello 
hello: stopped
$ sudo supervisorctl start hello 
hello: started
$sudo supervisorctl restart hello 
hello:stoped
hello:started

现在应用可以在系统重启或者某些原因崩溃后自动重启了。

Nginx

配置 Nginx

$ sudo apt-get install nginx
$ sudo /etc/init.d/nginx start
创建一个 Nginx 虚拟服务器服务于 Django

每个 Nginx 虚拟服务器应该是通过一个在 /etc/nginx/sites-available 目录下的文件描述的,为了使之生效需要在 /etc/nginx/sites-enbled 做一个符号连接
创建配置文件/etc/nginx/sites-available/hello,内容如下:

upstream hello_app_server {
  # fail_timeout=0 means we always retry an upstream even if it failed
  # to return a good HTTP response (in case the Unicorn master nukes a
  # single worker for timing out).

  server unix:/webapps/hello_django/run/gunicorn.sock fail_timeout=0;
}

server {

    listen   80;
    server_name localhost;

    client_max_body_size 4G;

    access_log /webapps/hello_django/logs/nginx-access.log;
    error_log /webapps/hello_django/logs/nginx-error.log;

    location /static/ {alias   /webapps/hello_django/static/;}

    location /media/ {alias   /webapps/hello_django/media/;}

    location / {
        # an HTTP header important enough to have its own Wikipedia entry:
        #   http://en.wikipedia.org/wiki/X-Forwarded-For
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # enable this if and only if you use HTTPS, this helps Rack
        # set the proper protocol for doing redirects:
        # proxy_set_header X-Forwarded-Proto https;

        # pass the Host: header from the client right along so redirects
        # can be set properly within the Rack application
        proxy_set_header Host $http_host;

        # we don't want nginx trying to do something clever with
        # redirects, we set the Host: header above already.
        proxy_redirect off;

        # set "proxy_buffering off" *only* for Rainbows! when doing
        # Comet/long-poll stuff.  It's also safe to set if you're
        # using only serving fast clients with Unicorn + nginx.
        # Otherwise you _want_ nginx to buffer responses to slow
        # clients, really.
        # proxy_buffering off;

        # Try to serve static files from nginx, no point in making an
        # *application* server like Unicorn/Rainbows! serve static files.
        if (!-f $request_filename) {
            proxy_pass http://hello_app_server;
            break;
        }
    }

    # Error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {root /webapps/hello_django/static/;}
}

创建符号链接:

$ sudo ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello

重启 Nginx:

$ sudo /etc/init.d/nginx restart

所有配置基本完成了,现在你就可以看到 django 的欢迎界面了。

卸载 Django 应用

如果你需要卸载这个项目,那么可以按照如下步骤彻底清除

移除虚拟服务器从 Nginx 的 sites-enabled 目录:

$ sudo rm /etc/nginx/sites-enabled/hello_django

重启 Nginx:

$ sudo /etc/init.d/nginx restart

如果以后都不打算使用这个项目了,那么可以从 site-available 目录删除配置文件

$ sudo rm /etc/nginx/sites-available/hello_django

用 Supervisor 停掉应用:

$ sudo supervisorctl stop hello 

从 supervisor 的控制脚本目录中移除配置:

$ sudo rm /etc/supervisor/conf.d/hello.conf

最后可以把整个应用的目录删除:

$ sudo rm -r  /webapps/hello_django

总结

如果你是一步一步根据这个教程来操作的话,那么整个目录结构应该是如下:

/webapps/hello_django/
├── bin                          <= virtualenv 创建的目录
│   ├── activate                 <= Environment activation script
│   ├── django-admin.py
│   ├── gunicorn
│   ├── gunicorn_django
│   ├── gunicorn_start.sh           <= 用 Gunicorn 启动应用的脚本
│   └── python
├── hello                        <= 项目的根目录, 把他添加到 PYTHONPATH
│   ├── manage.py
│   ├── project_application_1
│   ├── project_application_2
│   └── hello                    <= 项目的配置目录
│       ├── __init__.py
│       ├── settings.py          <= hello.settings - settings 模块,Gunicorn 需要使用
│       ├── urls.py
│       └── wsgi.py              <= hello.wsgi - WSGI module,Gunicorn 使用
├── include
│   └── python2.7 -> /usr/include/python2.7
├── lib
│   └── python2.7
├── lib64 -> /webapps/hello_django/lib
├── logs                         <= 项目的日子目录
│   ├── gunicorn_supervisor.log
│   ├── nginx-access.log
│   └── nginx-error.log
├── media                        <= 用户文件上传目录
├── run
│   └── gunicorn.sock 
└── static                       <= 项目的静态资源目录

所有步骤经过自己操作验证通过,如果你在配置过程中有任何疑问,毫不犹豫给我留言。

Django1.8 返回 json 字符串和接收 post 的 json 字符串内容  http://www.linuxidc.com/Linux/2015-07/120226.htm

如何使用 Docker 组件开发 Django 项目?http://www.linuxidc.com/Linux/2015-07/119961.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm 

Django+Nginx+uWSGI 部署 http://www.linuxidc.com/Linux/2013-02/79862.htm 

Django 实战教程 http://www.linuxidc.com/Linux/2013-09/90277.htm 

Django Python MySQL Linux 开发环境搭建 http://www.linuxidc.com/Linux/2013-09/90638.htm 

Django 的详细介绍:请点这里
Django 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121377.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计9871字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7982163
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...