Python Django 生产环境部署到 Ucloud

使用 Django 搭建了一个网站,在部署到生产环境 Ucloud 时遇到了神坑无数,花费了4个夜晚才算是解决。这里尽可能记录部署的过程,遇到的问题,以及解决办法,希望能帮助像我一样的后端开发小白,少踩一些坑。

前提条件

  1. 本地可以正常运行的 Django 项目,哪怕是一个 Hello World
  2. Ucloud 云主机 或者其他平台的云主机
  3. 域名(没有也可以)

云主机服务器创建

这个没什么难度,按照第三方给的文档,一步步走下去就可以。关键是云主机创建完成之后,会有一个内网 IP,还有一个外网 IP。这两个 IP 后面做 DNS 解析要用到。我这里创建的服务器的系统是 Ubuntu 12.04。建议使用 Linux 系列的。

有一个技巧是,创建完系统,登陆时,Ubuntu 的默认登陆名是 ubuntu,密码是自己设置的。为什么之前没人告诉我呢,害我找了好久,通过客服才解决这个问题。

默认的系统中,安装的是有 ssh 的,这样就可以通过 ssh 连接到服务器。命令如下

ssh user@ip_address

user 是登陆的用户名,默认是 ubuntu。
ip_address 就是创建云主机指定的外网 ip。之后会让输入密码,就是主机设置的登陆密码。

下面就可以把这个当做本地的一台 Ubuntu 系统的电脑使用,安装必要的软件,唯一不同的是,这个是真的没有 GUI 界面。

Python 相关软件安装

Ubuntu 系统中默认安装 Python 2.7 版本,生产环境中,就使用这个版本。下面会安装 pip

apt-get update
apt-get install python-pip

基本都是傻瓜式的,不用做什么操作。
pip 安装之后,在安装 Python 开发必须使用的两个扩展 virtualenvvirtualenvwrapper

pip install virtualenv

默认安装在 /usr/local/bin 目录下的

安装 virtualenvwrapper 管理 vritualenv

pip install virtualenvwrapper

在 .bashrc 中添加如下代码

export VIRTUALENV_USE_DISTRIBUTE=1        #  总是使用 pip/distribute
export WORKON_HOME=$HOME/Envs       # 所有虚拟环境存储的目录
if [ -e $HOME/Envs/bin/virtualenvwrapper.sh ];then
   source $HOME/Envs/bin/virtualenvwrapper.sh
else if [ -e /usr/local/bin/virtualenvwrapper.sh ];then
         source /usr/local/bin/virtualenvwrapper.sh
    fi
fi
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true

添加后执行下面命令

source .bashrc

这个时候就可以使用 virtualenvwrapper 管理 virtualenv 了。virtualenvwrapper 的常用命令,可以使用 virtualenvwrapper --help 查看。为了使用方便,我配置了几个别名

alias lsenv='lsvirtualenv'
alias mkenv='mkvirtualenv'
alias rmenv='rmvirtualenv'

上面三个命令,再加上一个 workon 基本就够用了。
如果关于 virtualenv 和 virtualenvwrapper 配置有不明白的地方,可以参考这篇文章
python 虚拟环境设置参考1
python 虚拟环境设置参考2

配置完虚拟环境之后,我们就创建一个虚拟环境

mkenv django

创建完之后,默认会切换到 django 环境中。

上传代码到服务端

平常也经常听我们服务端的开发说,发布代码,功能上线,至于怎么发布代码,如何上线却不了解。我这里使用了一个简单的方法,我的代码原本托管在 coding 上 。我就在服务器上把最新的代码拉下来,不久可以了吗,实现了曲线发布。
Ubuntu 上默认安装有 Git ,要想使用 ssh 拉取代码,还需要配置下 ssh key。不然每次输入用户名,密码绝壁要烦死。

ssh key 公钥 配置,可以参考整
下面就是找个目录,把代码拉到服务器上。

安装第三方依赖库

项目中,添加第三方依赖之后,一般都会通过 pip freeze 命令及时的更新依赖列表 requirement.txt

pip freeze -> requirement.txt

这个命令会将依赖的第三方库信息保存在requirement.txt 中。

pip install -r requirement.txt

这个命令会将 requirement.txt 上的所有第三方库全部安装。

Mysql 安装和配置

安装 Mysql 以及相关的依赖工具

apt-get install mysql-server mysql-client libmysqld-dev

Mysql 安装过程中会让设置一个秘密,这里就默认为 root

安装成功之后,登陆 Mysql,命令为

mysql -u root -p

使用 root 账号登陆 mysql
创建个新用户 imeosng

CREATE USER 'imesong'@'%' IDENTIFIED BY 'imesong'

创建一个 用户 imesong,密码为 imesong

GRANT ALL ON *.* TO 'imesong'@'%';

对 imesong 用户授权 完全的读写权限。 ON 后面的 . 表示 所有数据库,所有表 @ 后面的 % 表示所有主机,All 表示所有的权限,包括 SELECT,INSERT等。

数据库用户的创建,还请大家参考这篇文字 MySQL创建用户与授权

创建数据库

CREATE databases 11it

创建一个名称为 11it 的数据库。
使用 show databases可以查看当前有哪些数据库
使用 use 11it 使用 11it 数据库
show tables 查看当前的数据库表

uwsgi 安装配置

uwsgi 使用 pip 安装

apt-get install uwsgi uwsgi-plugin-python

配置 uwsgi

vim /etc/uwsgi/apps-available/11it.ini

创建 11it.ini 配置文件,文件名可以自己任意修改,只有符合命名规范

文件内容如下

[uwsgi]
# Django 项目的 project name
project = mxonline
# project 的目录地址,这个目录要修改为自己的项目对应的目录
base = /home/ubuntu/coding
# 代码根目录
chdir = %(base)/%(project)
# Model 名称
module = MxOnline.wsgi
vhost = true
plugins = python
# socket 连接文件地址,这个很重要
socket = /tmp/11it.sock
master = true
vacuum = true
enable-threads = true
#开启4个进程
process = 4
#socket 文件连接的权限
chmod-socket = 666
# 虚拟环境目录
virtualenv = /home/ubuntu/Envs/11it
# 这个不知道做什么的,会在指定目录下创建一个文件,这个目录要保证有读写权限
touch-reload = %(base)/%(project)/reload

然后将 apps-available 中的配置文件 ln 到 apps-enabled 文件夹中

ln -s /etc/uwsgi/apps-available/11it.ini /etc/uwsgi/apps-enabled/

nginx 安装配置

安装 Nginx

apt-get install nginx

配置 Nginx

vim /etc/nginx/sites-available/11it

配置文件如下

server {
    # 监听的端口
    listen 80;
    #解析的域名
    server_name www.xxx.com xxx.com;
    #访问日志存放路径
    access_log  /var/log/nginx/11it.access.log;
    #错误日志存放路径
    error_log  /var/log/nginx/11it.error.log;
    location / {
    # uwsgi 连接 nginx
    include  uwsgi_params;
        # 通过 socket 连接 uwsgi 。后面对应的就是在 uwsgi 配置文件中创建的 sock 文件 ,添加 上 unix:/ 。
        uwsgi_pass unix:///tmp/11it.sock;
    }
    location /media/ {
        # 解析 media 目录。这个目录在 Django 项目中用于用户上传的媒体文件,具体的路径,以自己的项目中路径为准
        alias /home/ubuntu/coding/mxonline/media/;
    }
    location /static/ {
        # static 文件路径。这个目录也是在Django 项目中生成的,并且配置的这个目录,还要在 Django 的 setting.py 文件中保持一致,不然会出现无法加载静态文件,导致 css,js 文件无法加载。
        alias /home/ubuntu/coding/mxonline/static/;
    }
}

接下来将 sites-available 文件夹中刚才添加的文件 ln 到 sites-enabled 文件夹中

ln -s /etc/nginx/sites-available/11it /etc/nginx/sites-enabled/

配置完成之后,我们验证下 nginx 的配置是否成功

sudo service nginx configtest

如果显示 ok ,证明配置没有问题。
启动 nginx 和 uwsgi

sudo service nginx restart
sudo service uwsgi restart

在浏览器中,使用云主机的 外网 ip 访问下,可以看到 nginx 的欢迎页面。

静态文件代理

nginx 主要做静态文件的处理,我们在配置文件中指定了静态文件的路径,但是我们并不是所有的文件都在static 目录中。开发环境和生产环境中 ,对静态文件的路径配置还不同。
生产环境中做如下修改
setting.py 中

# 新增 static 目录,存放项目所有的静态资源
STATIC_ROOT = os.path.join(BASE_DIR, "static")
# 这个注释掉
#STATICFILES_DIRS = (
#    os.path.join(BASE_DIR, "static"),
#)

在项目根目录运行命令

python manage.py collectstatic

Django 会将所有用到的静态文件,包括第三方库中的,copy 一份放在 setting.py 中配置的 STATIC_ROOT 中。

启动 uwsgi

uwsgi --ini /etc/uwsgi/apps-available/11it.ini

域名解析配置

域名解析看自己的域名服务商,主要配置 A 记录和 www 记录

dns.png

以上,基本上完成了我们 Django 生产环境的部署,当然还有很多细节问题没有记录。
下面是一些参考链接

https://foofish.net/django-deploy.html
http://www.jianshu.com/p/d7b9c468f20d
https://www.doraemonext.com/archives/552.html
http://stackoverflow.com/questions/21820444/nginx-error-13-permission-denied-while-connecting-to-upstream
http://pengjunjie.com/blog/single/83/
http://projectsedu.com/2017/02/07/centos7-%E4%B8%8B%E9%80%9A%E8%BF%87nginx-uwsgi%E9%83%A8%E7%BD%B2django%E5%BA%94%E7%94%A8/
http://www.cnblogs.com/jhao/p/6071790.html
https://zhuanlan.zhihu.com/p/25080236

看到这么多参考链接,你就该想到,我在部署时遇到了多少坑吧。

祝大家部署顺利!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容