Ubuntu服务器配置Python+Django的部署环境

一、环境安装

root下新用户创建
useradd -m -s /bin/bash zhangxiaodong
usermod -a -G sudo zhangxiaodong
passwd zhagnxiaodong
su - zhangxiaodong
更新服务器
sudo apt-get update
sudo apt-get upgrade
安装软件
sudo apt-get install nginx
sudo apt-get install git python3 python3-pip
sudo pip3 install virtualenv
sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev libmysqld-dev python-dev python-setuptools
sudo easy_install mysql-python
启动 Nginx 服务
sudo service nginx start

二、部署代码

部署前的项目配置
(1)STATIC_ROOT 指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的 static 文件夹。
blogproject/settings.py 里面 STATIC_URL = '/static/' # 加入下面的配置 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
(2)为了安全起见,在生产环境下需要关闭 DEBUG 选项以及设置允许访问的域名
blogproject/settings.py DEBUG = False ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.zmrenwu.com']
(3)requirements.txt
(blogproject_env) C:\\Users\\zhangxiaodong\\Workspace\\blogproject>
pip freeze > requirements.txt
(4) 数据库Mysql配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'store', #数据库名称
'USER': 'yuan', #连接用户名
'PASSWORD': 'yuan',#连接密码
'HOST': 'localhost',
'PORT': '3306'
}
}
项目目录下:init.py
配置如下:
import pymysql pymysql.install_as_MySQLdb()
将代码上传到 GitHub

注意数据库文件不要上传!
设置服务器目录结构

接下来需要把代码上传到服务器了。我服务器上存放代码的目录结构一般是这样的:
/home/yangxg/ sites/ demo.zmrenwu.com/ env/ django-blog-tutorial/
一台服务器可能部署多个网站,所有网站代码都放在 sites/ 目录下。demo.zmrenwu.com/ 这个文件夹以网站的域名命名,便于区分。env/ 是 python 虚拟环境目录。django-blog-tutorial/ 是 Django 博客项目目录。
因此先来创建这个目录结构,注意目录名替换为你自己的域名,以后涉及到 demo.zmrenwu.com 的地方通常都要替换你自己的域名,后面就不再一一指出了,运行下面的命令,
yangxg@localhost:~$ mkdir -p ~/sites/demo.zmrenwu.com
这里 ~ 代表当前用户的 home 目录,即 /home/yangxg/。
创建虚拟环境

先进入到 demo.zmrenwu.com 目录下,然后运行 virtualenv 命令创建虚拟环境:
yangxg@localhost:~$ cd ~/sites/demo.zmrenwu.com yangxg@localhost:~/sites/demo.zmrenwu.com$ virtualenv --python=python3 env
注意这里使用 --python=python3 来指定克隆 Python3 的环境。因为 ubuntu 系统默认安装了 Python2,如果不特别指定的话 Virtualenv 默认克隆的是 Python2 的环境。
拉代码

从代码仓库把项目代码拉取过来
git clone ***
安装项目依赖

source env/bin/activate
cd django-blog-tutorial/
pip install -r requirements.txt
收集静态文件

python manage.py collectstatic
生成数据库
python manage.py makemigrations
python manage.py migrate
创建超级用户
python manage.py createsuperuser

三、配置 Nginx

先在服务器的 /etc/nginx/sites-available/ 目录下新建一个配置文件,文件名我一般就设置为域名。写上下面的配置内容:
/etc/nginx/sites-available/demo.zmrenwu.com server { charset utf-8; listen 80; server_name demo.zmrenwu.com; ① location /static { ② alias /home/yangxg/sites/demo.zmrenwu.com/django-blog-tutorial/static; } location / { ③ proxy_set_header Host $host; proxy_pass http://unix:/tmp/demo.zmrenwu.com.socket; } }
创建软链接:从 sites-available/ 目录下发送了一个配置文件的快捷方式到 sites-enabled/ 目录
sudo ln -s /etc/nginx/sites-available/demo.zmrenwu.com /etc/nginx/sites-enabled/demo.zmrenwu.com

四、使用 Gunicorn

Gunicorn 一般用来管理多个进程,有进程挂了Gunicorn 可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker 的数量,请求多的时候增加 worker 的数量,请求少的时候减少。
在虚拟环境下,安装 Gunicorn:
(env) yangxg@localhost:~/sites/demo.zmrenwu.com/django-blog-tutorial$
pip install gunicorn
用 Gunicorn 启动服务器进程:
(env) yangxg@localhost:~/sites/demo.zmrenwu.com/django-blog-tutorial$
gunicorn --bind unix:/tmp/demo.zmrenwu.com.socket blogproject.wsgi:application
浏览器输入域名,可以看到访问成功了!

gunicorn --bind unix:/tmp/blog.yixueshengtid.com.socket blogproject.wsgi:application
gunicorn --bind unix:/tmp/zhentuix.com.socket zhentuix.wsgi:application
gunicorn --bind unix:/tmp/zhongyix.com.socket zhongyi.wsgi:application
gunicorn --bind unix:/tmp/actorgogo.com.socket actorgogo.wsgi:application
gunicorn --bind unix:/tmp/ititgogo.com.socket ititgogo.wsgi:application
gunicorn --bind unix:/tmp/xuexiaoup.com.socket xuexiaoup.wsgi:application
gunicorn --bind unix:/tmp/uyunbaobao.com.socket jiehaoyun.wsgi:application

【这里会遇到问题,访问成功后只是nginx页面,这时候去阿里云后台重启实例,然后进服务器重启nginx,即可,再不行,执行命令删除sites-enabled 下面重复的default】

自动启动 Gunicorn

先按 Ctrl + c 停止刚才启动的服务器进程。
写一个启动脚本,这样当服务器重启后能自动引导 Gunicorn 的启动。脚本位于 /etc/init/ 目录下,且脚本文件名必须以 .conf 结尾:
/etc/init/gunicorn-demo.zmrenwu.com.conf start on net-device-up ① stop on shutdown respawn ② setuid yangxg ③ chdir /home/yangxg/sites/demo.zmrenwu.com/django-blog-tutorial ④ exec ../env/bin/gunicorn --bind unix:/tmp/demo.zmrenwu.com.socket blogproject.wsgi:application ⑤
① start on net-device-up 确保只在服务器联网时才启动 Gunicorn。
② 如果进程崩溃了(比如服务器重启或者进程因为某些以外情况被 kill),respawn 将自动重启 Gunicorn。
③ setuid 确保以 yangxg 用户的身份(换成你自己的用户名)运行 Gunicorn 进程。
④ chdir 进入到指定目录,这里进入项目的根目录。
⑤ exec 执行进程,即开启服务器进程。
现在可以用 start 命令启动 Gunicorn 了:
sudo start gunicorn-demo.zmrenwu.com
以后如果更新了代码,只要运行下面的命令重启一下 Nginx 和 Gunicorn 就可以使新的代码生效了:
sudo service nginx reload sudo restart gunicorn-demo.zmrenwu.com

滚动至顶部