使用 Nginx 和 Gunicorn 部署 Django 博客


参考链接:https://www.zmrenwu.com/post/20/

说明: 本站使用的环境是Python3.6.3Django2.17MySQL5.7.2Ubuntu16.04Nginx,有关Python3.6,MySQL,Nginx的安装,本站其他文章中都有介绍。本站域名是bgods.cn,后面只要是有bgods.cn的地方都换成你自己的域名。如果以上环境都已经准备好了,就可以开始以下内容了....

一、部署代码

1、部署前的项目配置

Django项目中会有一些CSS,JavaScript等静态文件,为了能够方便地让Nginx处理这些静态文件的请求,我们把项目中的全部静态文件收集到一个统一的目录下,这个目录通常位于Django项目的根目录,并且命名为static。为了完成这些任务,需要在项目的配置文件settings.py里做一些必要的配置:

# 加入下面的配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的静文件夹。

为了安全起见,在生产环境下需要关闭 DEBUG 。以及选项对话设置网求允许访问的域名打开的settings.py文件,找到 DEBUG 状语从句: ALLOWED_HOSTS 这两个选项对话,将它们设置成如下的值:

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', 'bgods.cn']

2、设置服务器目录结构

  • 上传项目代码之前,先设置一下服务器的文件结构:
/home/bg/
    sites/
        bgods.cn/
            env/
            mysite/

一台服务器可能部署多个网站,所有网站代码都放在sites /目录下.bgods.cn /这个文件夹以网站的域名命名,便于区分.env /是python虚拟环境目录.mysite /是Django博客项目目录。

注意:目录名替换为你自己的域名,涉及以后到 bgods.cn的地方通常都要替换你自己的域名

  • 创建目录
bg@localhost:~$ mkdir -p ~/sites/bgods.cn
bg@localhost:~$ mkdir -p ~/sites/bgods.cn/mysite
  • 创建虚拟环境
bg@localhost:~$ cd ~/sites/bgods.cn
bg@localhost:~/sites/bgods.cn$ virtualenv --python=python3.6 env
  • 上传Django的项目代码到服务器 方法有多种,我这里使用的是XFTP5上传,方便简单,不懂的自行百度

3、安装项目依赖

在之前先激活虚拟环境,安装项目的全部依赖。

  • 激活虚拟环境
bg@localhost:~/sites/bgods.cn$ source env/bin/activate
(env) bg@localhost:~/sites/bgods.cn$ cd mysite/
  • 进入项目路径,并使用PIP安装项目全部依赖
(env) bg@localhost:~/sites/bgods.cn/mysite$ pip3 install -r requirements.txt

关于以上命令,请查看 requirements.txt

4、收集静态文件

虚拟环境下继续运行python manage.py collectstatic命令收集静态文件到静目录下:

(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py collectstatic

5、生成数据库

虚拟环境下继续运行python manage.py migrate命令创建数据库文件:

(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py migrate
  • 创建超级用户

虚拟环境下继续运行python manage.py createsuperuser命令创建一个超级用户,方便我们进入Django管理后台。这和本地开发时是一样的,具体请参照:在Django Admin后台文章。

(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py createsuperuser

二、配置Nginx

接下来配置Nginx来处理用户请求。先在服务器的/ etc / nginx / sites-available /目录下新建一个配置文件,文件名设置为我的域名:

# /etc/nginx/sites-available/bgods.cn
server {
    charset utf-8;
    listen 80;
    server_name bgods.cn;

    location /static {
        alias /home/bg/sites/bgods.cn/mysite/static; 
    }

    location /media {
        alias /home/bg/sites/bgods.cn/mysite/media;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://unix:/tmp/bgods.cn.socket;
    }
}

我们在 /etc/nginx/sites-available/ 放置了配置文件,接下来需要创建一个符号链接,把这个配置文件加入到启用的网站列表中去,被启用网站的目录在 /etc/nginx/sites-enabled/,你可以理解为从 sites-available/ 目录下发送了一个配置文件的快捷方式到 sites-enabled/ 目录。具体命令如下:

(env) bg@localhost:~/sites/bgods.cn/mysite$ sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/bgods.cn

三、安装 Gunicorn

Gunicorn 一般用来管理多个进程,有进程挂了Gunicorn 可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker 的数量,请求多的时候增加 worker 的数量,请求少的时候减少。

  • 在虚拟环境下,安装 Gunicorn:
(env) bg@localhost:~/sites/bgods.cn/mysite$ pip3 install gunicorn
  • 在 settings.py 文件中添加 gunicorn 应用
# /home/bg/sites/bgods.cn/mysite/mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'ckeditor',
    'ckeditor_uploader',
    'gunicorn', #添加 gunicorn 应用
]
  • 用 Gunicorn 启动服务器进程:
(env) bg@localhost:~/sites/bgods.cn/mysitel$ gunicorn --bind unix:/tmp/bgods.cn.socket mysite.wsgi:application

注意:mysite.wsgi:application这里的mysite对应的是/home/bg/sites/bgods.cn/mysite/mysite,根据自己的修改,在浏览器输入域名,可以看到访问成功了!

四、Ubuntu16.04 自动启动 Gunicorn

现在 Gunicorn 是我们手工启动的,万一哪天服务器崩溃重启了又得重新手工启动。为此我们写一个自动启动脚本,这样当服务器重新启动后,脚本会帮我们重启 Gunicorn。先按 Ctrl + c 停止刚才启动的服务器进程。

这里以Ubuntu16.04为例:

1、创建脚本

首先在/lib/systemd/system/目录下,创建一个脚本 bg.service(后缀是service)

# /lib/systemd/system/bg.service
[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的用户
User=bg
# 你的目录
WorkingDirectory=/home/bg/sites/bgods.cn/mysite
# gunicorn启动命令
ExecStart=/home/bg/sites/bgods.cn/env/bin/gunicorn --bind unix:/tmp/bgods.cn.socket mysite.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target

2、启动脚本

(env) bg@localhost:~/sites/bgods.cn/mysitel$ sudo systemctl start bg.service # 执行脚本
(env) bg@localhost:~/sites/bgods.cn/mysitel$ sudo systemctl enable bg.service   # 设置开机自启动脚本

以后如果更新了代码,只要运行下面的命令重启一下 Nginx 和 Gunicorn 就可以使新的代码生效了:

sudo systemctl restart bg.service nginx.service

3、systemctl常用命令

以下是systemctl的一些命令,以上面创建的bg.service为例(如果是普通用户需要在前面加须藤再执行)

  • 重新加载服务文件:systemctl daemon-reload
  • 启动一个服务:systemctl start bg.service
  • 关闭一个服务:systemctl stop bg.service
  • 重启一个服务:systemctl restart bg.service
  • 显示一个服务的状态:systemctl status bg.service
  • 在开机时启用一个服务:systemctl enable bg.service
  • 在开机时禁用一个服务:systemctl disable bg.service
  • 查看服务是否开机启动:systemctl is-enabled bg.service
  • 查看已启动的服务列表:systemctl list-unit-files | grep enabled
  • 查看启动失败的服务列表:systemctl --failed

 评论