在linux(ubantu)上部署django工程

门槛

文章是在默认你已经掌握以下基础知识编写,如果在阅读过程中发现对以下基础知识不太了解,可以先查看相关资料

1.基本的linux命令行,如基本的cdcatvisudo操作

2.懂得使用git进行代码管理,如基本的git pullgit pushgit clone操作

服务器会通过git来同步代码

3.会使用ssh连接服务器,如ssh root@[hostname]

服务器都连不上的话,还谈什么部署...

4.有一个能运行django框架,能使用python manage.py runserver运行

那怕是输出一个hello world也够了,因为目的是部署,不是实现服务器的功能

前言

先介绍用到的几个术语

pip             python包管理工具
django          多功能python框架
git             代码管理神器
gunicorn        高性能python服务器
gevent          python并发框架
supervisor      管理python服务器的开启、关闭、查看状态
nginx           高性能的 HTTP 和 反向代理
fabric          自动化部署框架

这里只是简单说明一下用到的术语,更多深入详细的了解读者可以自行google

快速上手

我的服务器环境是Ubantu 64位,Django1.6.6,python2.7,给各位参照下,如果版本不同的话或许会出现其他异常情况

1.前期准备

如果你已经准备了一个可执行的django, 用git管理代码了,可以跳过这一步了

准备一个可以运行的django项目

python manage.py runserver

用git管理代码,初始化git

git init

添加远程仓库

git remote add origin [remote git url]

代码加入git管理git add .

提交更新git commit -am '[change log]'

推上服务器git push

好,在开发机器的工作完成了,下面进入服务器部分。

1.配置服务器环境

首先用ssh连接服务器

ssh root@[hostname]

安装需要用到环境

`apt-get install pip`

`apt-get install nginx`

`apt-get install git`

`apt-get install supervisor`

`pip install gunicorn`

`pip install django`

如果apt-get install xxx出现无法下载的情况,可以试下先apt-get update刷新一下

安装环境后把代码同步下来

git clone [git url]

或者

git pull

在项目路径下,尝试运行django

gunicorn [project name].wsgi

如果运行成功,说明django项目和gunicron都没有问题

如果需要root权限的在命令前面加上sudo,如 sudo apt-get install pip

python库用pip安装,其他库用apt-get安装

2.写配置文件

编写nginx配置文件nginx.conf,保存到/etc/nginx/

user www-data;
worker_processes 2;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
}

http {
    server {
        listen       80;
        #server_name  localhost;

        #access_log  logs/host.access.log  main;

        location ~ ^\/static\/.*$ {
            root /home/ScraperService;
        }

        location / {
            proxy_pass http://127.0.0.1:9000;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

PS:如果发现nginx访问static没有权限,可以把user改为root,或者给static添加权限。

检测一下配置有没有问题

/etc/init.d/nginx configtest

nginx配置详细请移步nginx官网文档

编写supervisor配置文件[project name].conf,保存到/etc/supervisor/conf.d/

[program:[project name]]
command     = gunicorn_django [project path]/[project name]/settings.py -b 0.0.0.0:9000 -w 2 -k gevent
directory   = [project path]
user        = www-data
startsecs   = 3

redirect_stderr         = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups  = 10
stdout_logfile          = [log path]

其中[project name]、[project path]、[log path]要改成对应的路径

gunicorn参数 -w 线程数 -b 127.0.0.1:8000 监听的端口 -k gevent 运行方式,详细配置请移步gunicorn官网文档

supervisor详细配置请移步supervisor官网

3.启动服务

更新nginx配置

nginx reload

重启nginx

nginx restart

更新supervisor配置

supervisorctl reread

重启supervisor

supervisorctl update

停止已经开启的项目

supervisorctl stop [project name]

重新启动项目

supervisorctl start [project name]

没有报错就启动成功了,报错的可以去[log path]查看log

supervisor默认log在/var/log/supervisor,nginx默认log在/var/log/nginx

启动以后可以随时查看项目状态

supervisorctl status

流程 用supervisor负责管理监控gunicorn 用gunicorn启动web service 启动nginx做反向代理和静态服务

4.自动部署

通过以上步骤已经可以部署成功,但是每次修改代码后,都重新登录服务更新代码、重启supervisor服务、重启nginx服务,非常麻烦。就没有更加geek的方法吗?当然有! 在开发机器安装fabric

pip install fabric

编写fabfile.py放在项目里

# -*- coding:utf-8 -*-

from fabric.api import *

# 服务器登录用户名:
env.user = 'root'
# 服务器地址,可以有多个,依次部署:
env.hosts = ['hostname', ]

env.passwords = {
    'root@[hostname]': '[password]',
}

#不用密码也可以用ssh登录
# env.key_filename = '~/.ssh/id_rsa'

_REMOTE_BASE_DIR = '[project path]'

def deploy():
    # 切换到项目目录
    with cd(_REMOTE_BASE_DIR):
        run('git pull origin dev')

    # 重启supervisor服务和nginx服务器:
    with settings(warn_only=True):
        run('supervisorctl stop ScraperService')
        run('supervisorctl start ScraperService')
        run('/etc/init.d/nginx reload')

以后更改代码后,不需要再登录服务器,直接运行fab命令,就可以自动部署了

fab deploy

fabric会自动帮你登录服务器,并执行预先设定的命令

什么?每次更改后都要执行fab deploy,还是觉得不够geek?还有更懒(shuǎng)的方法,git hook

5.git hook自动部署

git hook web hook 待续...

还可以用linux软链接的方式来管理部署路径,主要作用是方便切换版本,这里只是给个引子,主页菌也还没有详细研究,有兴趣的读者们可以自行了解。

常见问题

1.使用gunicorn -k gevent时出现You need gevent installed to use this worker

pip install greenlet
pip install gevent

2.pip install xxx出现 command 'x86_64-linux-gnu-gcc' failed with exit status 1

sudo apt-get install python-dev

最近访问

    Table of Contents