3.4 Django+Uwsgi部署网站¶
本文是先前自己使用django写过一个个人博客时的部署过程记录。
涉及的工具有:Django+Nginx+Uwsgi+Supervisor
一、环境准备¶
1.1 服务器¶
本文使用的服务器系统是Ubuntu 16.04
之前使用Ubuntu14.04,问题非常之多,使用16.04后避免了很多问题。
默认预装
Python2.7.6
,Python3.4
(主要是软件源太早的版本)创建虚拟环境出现无法解决的问题:
OSError setuptools pip wheel failed with error code 1
更新软件源
sudo apt-get update
sudo apt-get upgrade
更新时,会让你选择是否安装新版软件,输入Y安装
更新安装完成后,系统就会给我们预装了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进行测试连接
连接上后就可以新建数据库
如果有备份数据要还原,可以使用数据传输。 数据传输功能,不能确保一次就能将数据传输完整,要多传输几次。 实在无法完整传输,就要导出导入的方式。
三、项目上传¶
我们的项目在本地开发,现在我们必须将项目迁移到服务器上。
这里有三种方法: 1. 使用linux的 rzsz 工具上传(推荐) 2. 使用SFTP/FTP的方式传输项目文件 3. 将项目上传至GitHub上,然后从GitHub上clone到服务器
3.2 使用SFTP/FTP¶
sftp/ftp
软件很多,我用过的有FileZilla
、FlashFXP
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¶
这是我一开始使用的方式,但是并不推荐。
原因有三:
上传至GitHub,说明你项目里有些敏感/隐私信息(账号密码等),要处理。多的话就很费事。
不熟悉Git命令的人,还要先去学Git命令。
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.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
直接跳到最后,填入红框内容
5.3 启动项目¶
既然修改了配置,第一步当然要使配置生效。
root@localhost:~# supervisorctl reread
myblog: changed
root@localhost:~# sudo supervisorctl update
myblog: stopped
myblog: updated process group
通过supervisorctl status
查看启动状态
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