django+nginx+gunicorn+ubuntu18.4实现django项目部署

本篇博客是在

https://www.jianshu.com/p/b5ad77206e04?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq

的基础之上自己将自己的项目在虚拟机Ubuntu18.4.0上部署的,已经部署成功之后写下这篇博客,在这之间出现的问题及找到的解决办法已经在该博客中记录,欢迎大家提出指点及补充。

项目准备

首先需要创建项目的依赖文件requirements.txt,在项目所在的根目录下通过以下命令即可完成创建。

pip freeze # 查看当前项目的所有包
pip freeze > requirements.txt  # 将当前项目的所有包及版本写入到requirements.txt文件中

克隆项目tendcode为原作者的项目名(克隆方式可以复制,使用scp、也可以使用git克隆,具体方式的选择视情况而定)

选择一个放置项目的文件夹,比如我把项目统一放在了自己的一个用户的根目录下面,这个目录的路径是 /home/alex

于是可以切换到当前用户的目录下克隆项目(作者将该项目使用git来实现克隆的,我个人使用的scp,视情况而定):

~$ git clone [email protected]:Hopetree/izone.git tendcode

上面这句 git 的命令是意思是将 izone.git 这个项目克隆到本地并命名为 tendcode,当然,项目的名称你可以按照自己的喜欢去命名。

安装并配置虚拟环境

项目移植成功了,我们还需要来移植一个单独给项目使用的环境,所以需要使用虚拟环境。虚拟环境的安装和配置操作方式这里也不做说明,这里只介绍创建虚拟环境的过程。

我虽然在本地的 Windows 上面一直使用的 virtualenvwrapper 来操作虚拟环境,但是在服务器上面还是比较喜欢直接使用 virtualenv,这里就来以这种创建虚拟环境的方式说明。

在当前用户根目录(跟刚才克隆项目同目录)下创建一个虚拟环境 izone_env,使用如下命令:

~$  virtualenv --no-site-packages izone_env -p /usr/bin/python3.6


# 其中/usr/bin/python3.6  为虚拟环境运行的python环境  ,可以通过which python3.6 来找到
# izone_env 为创建的虚拟环境的目录名,执行该命令后会在当前目录出现名为izone_venv的目录

此时当前目录的结构是这样的:

/home/alex/tendcode
/home/alex/izone_env

复制虚拟环境

虚拟环境虽然已经创建,但是环境中还没有安装项目的依赖,所以现在要根据项目的依赖文件去安装依赖。

首先在当前用户目录下使用如下命令进入虚拟环境:

~$ source izone_env/bin/activate

然后将当前目录切换到你的项目的依赖文件 requirements.txt 的目录下,比如我的项目的依赖文件就在项目的一级目录下面,比如它的地址是这样的:

/home/alex/tendcode/requirements.txt

那么此时应该切换到这样:

(izone_env) ~$ cd tendcode

然后使用如下命令安装依赖:

(izone_env) ~$ pip install -r requirements.txt

安装完成后,有必要通过以下命令来确定需要安装的包是否已经安装完成(必须在虚拟环境下执行该命令)

pip list  # 可以查看该环境下都安装了哪些依赖包

如果存在没安装到的依赖包可以通过以下命令来安装缺少的包(必须在虚拟环境下执行该命令)

pip install celery  #比如celery包

在虚拟环境下执行python manage.py runserver 来运行项目,如果报导入不了某包的错误,则通过以上命令安装,并通过上上个命令查看即可,如果运行成功,则表示依赖包已经安装完毕

此时,项目的基本运行条件已经准备好了,下面开始运行项目。

项目运行

在部署项目之前,先要保证项目在服务器上面能够正常运行,这是最起码的条件。

补充项目缺少的文件

这一步骤并不是一定需要的,这取决于你的项目。由于我的项目上传到 Github 上之前有忽略掉一个个人信息项目的配置文件,所以需要在克隆项目之后在服务器自行创建一份。比如我的博客项目中需要单独创建的是跟 settings.py 同级目录下面的一个 base_settings.py 文件,文件的具体内容可以查看我 Github 项目中的说明。如果你的项目不需要补充文件,可以跳过这一步。

创建数据库

如果项目同样适用的是 MySQL 数据库的话,在项目运行之前需要先创建数据库,比如我的项目中指定了数据库的基本信息,我创建数据库(进入mysql命令行下)的命令如下:

mysql > CREATE DATABASE `tendcode` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

这句命令的意思是创建一个名称为 tendcode 的数据库,并且将数据库的编码设定为 utf8mb4,这个按照自己的项目需求去创建即可。

迁移数据库

现在可以按照 Django 项目的数据库迁移步骤来操作了,当然,下面的操作都是在虚拟环境中进行的。

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

(izone_env) ~/tendcode$ python manage.py makemigrations
(izone_env) ~/tendcode$ python manage.py migrate

2、创建管理员账号:

(izone_env) ~/tendcode$ python manage.py createsuperuser

3、静态文件的收集:

(izone_env) ~/tendcode$ python manage.py collectstatic

启动项目

(izone_env) ~/tendcode$ 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

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 文件的地址,直接写在项目的根目录即可,执行完会在该目录下生成一个tendcode.sock文件
  • izone.wsgi 表示的是项目中 wsgi.py 的地址,我的项目中就是在 izone 文件夹下的

启动配置文件

文件配置完成之后,使用下面的命令启动服务:(gunicorn_tendcode即为上面2步骤中配置的文件名)

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

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

~$ sudo systemctl status gunicorn_tendcode

如果启动成功,则会出现以下图,状态点会变为绿色,如果失败,信号点会变为红色,Active会变为Fail,此时需要检查上述配置文件,按照上面的格式仔细检查是否有拼写错误或者大小格式错误,修改直至出现绿色为止。

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

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

~$ sudo systemctl daemon-reload

然后再使用重启命令:

~$ sudo systemctl restart gunicorn_tendcode

配置 Nginx(务必保证/etc/nginx/下存在sites-available和sites-enabled的文件,因为配置需要用到这两个文件)

在配置nginx之前有必要先检查是否已经安装了nginx,如果安装了,请检查/etc/nginx/sites-available 和 /etc/nginx/sites-enabled 是否存在,如果不存在,有必要卸载并删除nginx重新安装,可以执行下面的命令来重新安装。

sudo apt-get update  # 我自己在执行完该命令,之后执行安装nginx的命令,/etc/nginx/sites-available  和 /etc/nginx/sites_enabled 存在

sudo apt-get install nginx

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

~$ sudo nano /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是否已经正常启动:

sudo systemctl status nginx

如果启动正常,会出现以下的图片所示情况

测试部署是否成功

测试方式视情况而定:

重启 Nginx 之后:

① 如果是在虚拟机下的Linux或者安装的Linux系统下做的线下部署,则可以在同一局域网下通过部署所在系统的ip+nginx配置的端口号来实现。

例如:我是在虚拟机ubuntu18.4.0上部署的项目,本人ubuntu的ip地址是192.168.3.13,nginx中设置的端口号是:80,则在同一局域网下连接的手机或者电脑均可以通过在浏览器中输入192.168.3.13:80/ 来访问部署的项目,如果进入成功,则表示部署成功,如果出现静态文件加载失败,查看nginx中静态文件的路径是否正确(该路径指static所在的目录,不包含static文件)

②如果是在线上部署的项目,重启 Nginx 之后可以登录自己配置的域名,看看自己的项目是不是已经成功的运行了呢!

后续维护

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_16069927/article/details/82079259