3.4 Django+Uwsgi部署网站

image0

本文是先前自己使用django写过一个个人博客时的部署过程记录。

涉及的工具有:Django+Nginx+Uwsgi+Supervisor

一、环境准备


1.1 服务器

本文使用的服务器系统是Ubuntu 16.04

之前使用Ubuntu14.04,问题非常之多,使用16.04后避免了很多问题。

  1. 默认预装Python2.7.6Python3.4(主要是软件源太早的版本)

  2. 创建虚拟环境出现无法解决的问题:OSError setuptools pip wheel failed with error code 1

更新软件源

sudo apt-get update
sudo apt-get upgrade

更新时,会让你选择是否安装新版软件,输入Y安装 image1

更新安装完成后,系统就会给我们预装了Python2.7.12和Python3.5.2

1.2 配置虚拟环境

安装pip

sudo apt-get install python-pip

安装pip3

sudo apt-get install python3-pip

配置虚拟环境,先安装两个包

pip install virtualenv
pip install virtualenvwrapper

配置:vim ~/.bashrc,编辑完成后,记得source ~/.bashrc使之生效

# 编辑bashrc文件

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
export VIRTUALENVWRAPPER_SCRIPT=/usr/local/bin/virtualenvwrapper.sh #先find一下具体位置,替换
source /usr/local/bin/virtualenvwrapper_lazy.sh #先find一下具体位置,替换

创建虚拟环境

# Python2
mkvirtualenv myblog

# Python3
mkvirtualenv myspider

1.3 安装依赖包

导入requirements并安装

# 进入虚拟环境安装
pip install -i https://pypi.douban.com/simple -r requirements.txt

如果MySQL安装出错就安装下面两个包

apt-get install python-dev libmysqlclient-dev

二、安装并配置MySQL


2.1 安装MySQL

安装过程,会提示设置密码(默认用户都是root)

sudo apt-get install mysql-server

安装完成后,测试下,是否安装成功

mysql -u root -p

2.2 配置访问权限

IP权限 MySQL默认只能本机127.0.0.1访问 若要从外网连接,必须更改IP绑定

# ubuntu 16.04
vim /etc/mysql/mysql.conf.d/mysqld.cnf

# ubuntu 14.04
vim /etc/mysql/my.cnf

# deepin
vim /etc/mysql/mysql.conf.d/mysqld.cnf

-----------------------------------
#修改IP绑定 127.0.0.1 为 0.0.0.0
bind-address            = 0.0.0.0

权限分配

# 权限分配
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '连接密码' WITH GRANT OPTION;

# 刷新权限
FLUSH PRIVILEGES;

配置完以上,记得重启服务

sudo service mysql restart

外网连接 使用navicat进行测试连接

image2

连接上后就可以新建数据库

image3

如果有备份数据要还原,可以使用数据传输。 数据传输功能,不能确保一次就能将数据传输完整,要多传输几次。 实在无法完整传输,就要导出导入的方式。

image4

三、项目上传


我们的项目在本地开发,现在我们必须将项目迁移到服务器上。

这里有三种方法: 1. 使用linux的 rzsz 工具上传(推荐) 2. 使用SFTP/FTP的方式传输项目文件 3. 将项目上传至GitHub上,然后从GitHub上clone到服务器

3.1 使用 lrzsz

首先在你的服务器上安装这个工具

sudo apt-get install lrzsz

然后就可以通过

  • rz:上传

  • sz:下载

3.2 使用SFTP/FTP

sftp/ftp 软件很多,我用过的有FileZillaFlashFXP FileZilla一开始用的时候,很顺手,自从有一次不知怎么再也连不上,卸载重装也不行。 然后就换FlashFXP了。

使用FTP软件的时候,可以将项目压缩成7z文件。再传输,一来文件少了,二来大小也减少不少。 当然迁移到服务器后,要对其进行解压。

这时候我们就要按7z

# 安装
apt-get install p7zip-full

# 解压(注意-o后没有空格)
7z x myblog.7z -r -o/root

# 压缩
7z a -t7z -r myblog.7z /root/*

3.3 使用GitHub

这是我一开始使用的方式,但是并不推荐

原因有三

  1. 上传至GitHub,说明你项目里有些敏感/隐私信息(账号密码等),要处理。多的话就很费事。

  2. 不熟悉Git命令的人,还要先去学Git命令。

  3. clone下来后,还要重新对项目里的内容,该改的改。这个也很费事。虽然可以用脚本。

安装Git

sudo apt-get install git

git clone git@github.com:xxx/xxx.git # 替换对应的git地址

三、安装并配置Nginx


3.1 安装Nginx

sudo apt-get install nginx

3.2 配置Nginx

在项目根目录下,新建uc_nginx.conf

vim uc_nginx.conf

内容如下

upstream django {
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}

server {
listen 80;
server_name 你的IP 你的域名;
charset utf-8;

client_max_body_size 75M; # adjust to taste

location /media {
alias /root/myblog/media; # 指向django的media目录
}

location /static {
alias /root/myblog/static; # 指向django的static目录
}

location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}

创建完成后,拷贝或者创建软链接到nginx目录

推荐使用拷贝的方式,因为我有很多次使用软链接的方式,结果就是软链接失效。结果nginx无法启动,找了半天问题,结果发现这个,很蛋疼。

#拷贝
cp uc_nginx.conf /etc/nginx/conf.d/

# 创建软链接
sudo ln -s uc_nginx.conf /etc/nginx/conf.d/

配置完成后,记得重启 nginx

sudo service nginx restart

四、安装并配置uwsgi

4.1 安装uwsgi

若是安装在虚拟环境里,以后启动的时候,就要先进入虚拟环境。

pip install uwsgi

4.2 配置uwsgi

在项目根目录新建uwsgi.ini

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /root/myblog
module          = myblog.wsgi
# the virtualenv (full path)

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = 127.0.0.1:8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
virtualenv = /root/.virtualenvs/myblog

4.3 运行项目

# 必须先cd到项目根目录
uwsgi -i uwsgi.ini

五、使用Supervisor管理进程


5.1 安装supervisor

安装supervisor有两种方式

【不推荐】一种直接使用pip安装

pip install supervisor

【推荐】一种是使用apt安装

apt-get install supervisor

使用apt安装,能够让服务器开机的时候就自动重启supervisor服务。而使用pip安装则需要手动重启。相对麻烦。

5.2 配置supervisor

/etc/supervisor/conf.d/路径下新增myblog.conf

[program:myblog] ; 程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作
autorestart=True      ; 程序异常退出后自动重启
autostart=True        ; 在 supervisord 启动的时候也自动启动
redirect_stderr=True  ; 把 stderr 重定向到 stdout,默认 false
environment=PATH="/root/.virtualenvs/myblog"  ; 虚拟环境路径
command=/usr/local/bin/uwsgi -i /root/myblog/uwsgi.ini  ; 启动命令,与手动在命令行启动的命令是一样的
user=root          ; 用哪个用户启动
directory=/root/myblog  ; 程序的启动目录

然后将myblog.conf写入到supervisor的配置中/etc/supervisord.conf

vim /etc/supervisord.conf

直接跳到最后,填入红框内容 image5

5.3 启动项目

既然修改了配置,第一步当然要使配置生效。

root@localhost:~# supervisorctl reread
myblog: changed
root@localhost:~# sudo supervisorctl update
myblog: stopped
myblog: updated process group

通过supervisorctl status查看启动状态 image6

5.4 supervisor其他命令

# myblog 改成你之前设定的对应的项目名

# 关闭进程
$ sudo supervisorctl stop myblog
myblog: stopped

# 开启进程
$ sudo supervisorctl start myblog
myblog: started

# 重启进程
$ sudo supervisorctl restart myblog
myblog: stopped
myblog: started

{% note success %}# 注意事项{% endnote %}

六、部署项目

6.1 部署配置

在使用 supervisor 拉起项目前,记得确保检查过以下配置settings.py

# 关闭debug
DEBUG = False

# 添加这一行
STATIC_ROOT = os.path.join(BASE_DIR, "static")

#注释掉
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]

# 如果没有设置数据库信息的话
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库名',
        'USER': 'root',
        'PASSWORD': '密码',
        'HOST': '127.0.0.1'
    }
}


# 有必要的话,需要邮箱验证信息
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = '邮箱@163.com'
EMAIL_HOST_PASSWORD = '你的密码'
EMAIL_USER_LTS = False
EMAIL_FROM = '邮箱@163.com'

收集静态文件

python manage.py collectstatic

6.2 调试小技巧

在部署的时候,难免会遇到各自各有的问题。

在排查问题的时候,可以先把debug打开

使用两种方法,运行项目

# 第一种:
python manage.py runserver 0.0.0.0:8000

# 第二种
# 运行后,到外网访问IP/域名,看看能不能运行,如果出错会有错误提示
uwsgi -i uwsgi.ini

在项目运行过程中,如果有错误,会显示详细信息。你可以根据这些信息先解决后,再把debug关闭,重新运行项目。

6.3 Nginx权限问题

如果使用Ubuntu16.04或者CentOS,nginx的www-data是没有权限的,这时候我们要改下,nginx配置,使其以root用户运行。

# 在第一行,将www-data改成root
vim /etc/nginx/nginx.conf

image7