Nginx + Gunicorn 部署 Django 项目

发布时间 2023-04-20 17:26:49作者: ldx-wsj

参考 :http://www.manongjc.com/detail/64-ccxvhixakfeoawn.html

一、先将项目运行起来

  (一)将项目代码复制(或从 Github 上克隆)到要部署主机的项目目录中;

  以下在部署主机上完成

  (二)建立虚拟环境

服务器使用 virtualenv

  创建虚拟环境 virtual_env。在哪个目录下创建不重要,我是在项目目录下(有利有弊)。

python3 -m venv virtual_env

激活虚拟环境

source virtual_env/bin/activate 或 source /path/virtual_env/bin/activate(使用绝对路径)

将当前目录切换到项目的依赖文件 requirements.txt 的目录,如:c4es

(virtual_env) ./c4es$ cd c4es

安装依赖:

(virtual_env) ./c4es$ pip install -r requirements.txt
(三)创建数据库

项目使用 MySQL 数据库,创建数据库(进入mysql命令行下)的命令如下:

mysql > CREATE DATABASE `c4es` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

创建一个名称为c4es的数据库,编码设定为 utf8。

在项目 的settings设置好 数据库有关设置 。

1、创建数据迁移,命令如下:

(virtual_env) ./c4es$ python manage.py makemigrations
(virtual_env) ./c4es$ python manage.py migrate

2、创建管理员账号:

(virtual_env) ./c4es$ python manage.py createsuperuser

3、静态文件的收集:

(virtual_env) ./c4ese$ python manage.py collectstatic

启动项目

(izone_env) ~/tendcod$ python manage.py runserver 0.0.0.1:8000

如果你的服务器上面的8000端口开启了,那么可以访问你的服务器 IP 地址的8000端口看看项目是否正常运行:

http://server_domain_or_IP:8000

到这里顺便说一下,由于我的项目是有域名的,所以在项目中要先添加自己的域名,就像这样:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '.tendcode.com']

开始部署

安装和配置 Gunicorn (用于启动Django)

1、首先需要在虚拟环境中安装 Gunicorn:

(izone_env) ~/tendcode$ pip install gunicorn

2、创建项目的 Gunicorn 配置文件(退出虚拟环境):

~$ sudo vim /etc/systemd/system/gunicorn_tendcode.service

3、配置信息如下:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=alex
Group=www-data
WorkingDirectory=/home/alex/tendcode
ExecStart=/home/alex/izone_env/bin/gunicorn --access-logfile - --workers 2 --bind unix:/home/alex/tendcode/tendcode.sock izone.wsgi:application

[Install]
WantedBy=multi-user.target

上面的配置信息中需要根据自己的项目改的有以下几个地方:

  • User 填写自己当前用户名称
  • WorkingDirectory 填写项目的地址
  • ExecStart 中第一个地址是虚拟环境中 gunicorn 的目录,所以只需要改前半部分虚拟环境的地址即可
  • workers 2 这里是表示2个进程,可以自己改
  • unix 这里的地址是生成一个 sock 文件的地址,直接写在项目的根目录即可
  • izone.wsgi 表示的是项目中 wsgi.py 的地址,我的项目中就是在 izone 文件夹下的

启动配置文件

文件配置完成之后,使用下面的命令启动服务:

~$ sudo systemctl start gunicorn_tendcode
~$ sudo systemctl enable gunicorn_tendcode

查看服务的状态可以使用命令:

~$ sudo systemctl status gunicorn_tendcode

上面的命令启动没有问题可以看看自己的项目的跟目录下面,应该会多一个 tendcod.sock 文件的。

后续如果对 gunicorn 配置文件做了修改,那么应该先使用这个命令之后重启:

~$ sudo systemctl daemon-reload

然后再使用重启命令:

~$ sudo systemctl restart gunicorn_tendcode

配置 Nginx

首先创建一个 Nginx 配置文件,不要使用默认的那个:

~$ sudo vi /etc/nginx/sites-available/mynginx

配置信息如下:

server {
    # 端口和域名
    listen 80;
    server_name www.tendcode.com;

    # 日志
    access_log /home/alex/tendcode/logs/nginx.access.log;
    error_log /home/alex/tendcode/logs/nginx.error.log;

    # 不记录访问不到 favicon.ico 的报错日志
    location = /favicon.ico { access_log off; log_not_found off; }
    # static 和 media 的地址
    location /static/ {
        root /home/alex/tendcode;
    }
    location /media/ {
        root /home/alex/tendcode;
    }
    # gunicorn 中生成的文件的地址
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/alex/tendcode/tendcode.sock;
    }
}

server {
    listen 80;
    server_name tendcode.com;
    rewrite ^(.*) http://www.tendcode.com$1 permanent;
}

第一个 server 是主要的配置,第二 server 是实现301跳转,即让不带 www 的域名跳转到带有 www 的域名上面。

连接 Nginx 配置

上面的配置检查好之后,使用下面的命令来将这个配置跟 Nginx 建立连接,使用命令:

~$ sudo ln -s /etc/nginx/sites-available/mynginx /etc/nginx/sites-enabled

运行完毕之后可以查看一下 Nginx 的运营情况,看看会不会报错:

~$ sudo nginx -t

如果上面这句没有报错,那么恭喜你,你的配置文件没有问题,可以继续下一步,如果报错了,需要按照报错的信息去更改配置文件中对应行的代码,好好检查一下吧!

没报错的话,重启一下 Nginx:

~$ sudo systemctl restart nginx

好了,重启 Nginx 之后可以登录自己配置的域名,看看自己的项目是不是已经成功的运行了呢!(ip:80/admin)

后续维护

之后的项目维护中,如果更改了 gunicorn 的配置文件,那么需要依次执行下面两条语句去重启服务,如果只是修改了 Django 项目的内容,只需要单独执行第二条重启命令即可:

~$ sudo systemctl daemon-reload
~$ sudo systemctl restart gunicorn_tendcode

如果修改了 Nginx 的配置文件,那么需要依次执行下面两条语句去重启服务:

~$ sudo nginx -t
~$ sudo systemctl restart nginx

以上就是我的项目部署的全部过程,希望看到这篇文章的人如果想要使用同样的方式部署 Django 项目的话,可以参考一下,有问题也可以指出。