Nginx+Gunicorn+Supervisor部署Django项目

Nginx+Gunicorn+Supervisor部署Django项目

  • 准备工作
    • 1.更新系统
    • 2.安装sqlite库
    • 3.下载zlib
    • 4.下载新版ssl
  • 安装python
    • 1.安装
    • 2.软链接
  • 创建虚拟环境
    • 1.虚拟环境
    • 2.数据迁移
  • 安装Gunicorn
  • 安装Superviosr
    • 安装Supervisor
  • 配置Nginx
    • 配置Nginx
    • 关闭Debug模式,收集静态文件
  • 安装Supervisor
    • 安装
    • 配置

部署环境 版本号
python 3.10.9
Django 2.2.3
Gunicorn 20.1.0
Supervisor 4.1

本篇基于 追梦人物 博客改编
须知本篇部分指令在root身份下运行,如果你是非root身份,可能需要在命令前加sudo

准备工作

1.更新系统

$yum update
$yum upgrade

yum update 升级所有包,会保留旧版本的 package,更新系统内核根据 obsoletes 配置而定
yum upgrade 升级所有包,会删除旧版本的 package,更新系统内核

yum来源:在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
转自小峰同学

2.安装sqlite库

$wgt https://sqlite.org/2022/sqlite-autoconf-3400100.tar.gz
$tar -zxvf sqlite-autoconf-3400100.tar.gz
$cd sqlite-autoconf-3400100
$./configure 
$make && make install
#还有一条指令,安装开发者包,我看不出个所以然,自行选择
$yum install sqlite-devel

[sqlite address] 可以从 sqlite官网获得,这里有个坑,新人(至少是我)可能不知道,要安装tar包(源码)而不是zip

python安装依赖sqlite包

与其说是依赖,我的理解是python会绑定sqlite包,如果不指定新版本的sqlite,会自动绑定系统自带的低版本,后面pipenv会报错。

wget命令是Linux系统用于从Web下载文件的命令行工具,支持 HTTP、HTTPS及FTP协议下载文件,而且wget还提供了很多选项,例如下载多个文件、后台下载,使用代理等等,使用非常方便。

tar是解压文件
./configure做一些安装编译前的准备工作(比如指定安装位置)
make安装
make install编译
习惯上写成make && make install

3.下载zlib

$yum install zlib zlib-devel

这个包是后面下python要用的,(python的依赖)如果不安装python对应版本的pip就下不到。
如果你那么好奇为什么可以去看这个家伙

4.下载新版ssl

$yum https://www.openssl.org/source/openssl1.1.1n.tar.gz
tar -zxvf openssl1.1.1n.tar.gz
cd openssl1.1.1n
./config --prefix=/usr/local/bin/openssl1.1.1
#prefix用来指定安装位置,我习惯放在/usr/local下,你可以随便
#指定位置,只要你找的到
make && make install

centOS自带的ssl版本太低了,好像是3.8以上的python都要更新ssl,不然后面某一步会报错。

安装python

1.安装

去 python官网下载对应你的python版本的源码

$wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz
$tar -zxvf Python-3.10.9.tgz
$./configure --prefix=/usr/local/python3.10 --with-openssl=/usr/local/openssl1.1.1 --with-openssl-rpath=auto LD_RUN_PATH=/usr/local/lib
$make LD_RUN_PATH=/usr/local/lib
$make install
#--with-openssl用来指定对应的ssl
#--with-openssl不知道干嘛的加上就对了
#可能有些教程会加上--enable-optimizations这个加上后会报gcc版本
#过低的错误,不加会报一些warning,忽略它们
#LD_RUN_PATH用来指定数据库,这里指定我们之前安装的新版sqlite

2.软链接

软链接类似于创建一个快捷方式在/usr/bin目录下,/usr/bin 是你在后期安装的一些软件的运行脚本,以便调用。

#格式 ln -s 源文件地址 链接地址
ln -s /usr/local/python3.10/bin/python3.10 /usr/bin/python3.10

我们在/usr/bin目录下新建了一个名为python3.10的文件,它实际上是/usr/local/python3.10/bin/python3.10的快捷方式(python的可执行程序放在bin目录下)
如果这里报错可能是你的usr/bin目录下以及存在了一个python3.10的目录(如果你指定版本3.x应该不会发生)它指向的是系统自带的python,我们只需到/usr/bin目录下,先备份一份旧文件

#格式 mv 旧地址 新地址
$mv python3.10 /usr/bin/old_python

我们把当前文件夹下的python3.10文件移到了当前文件夹,但是换了一个名字。现在来重新创建软链接。同上。
pip也需要创建软链接,操作同上。

#格式 ln -s 源文件地址 链接地址
ln -s /usr/local/python3.10/bin/pip3.10 /usr/bin/pip3.10
#如果你不习惯可以改成pip3

创建虚拟环境

1.虚拟环境

用上面创建的pip来下载pipenv。这里是pip3.10。如果你没有进行软链接,会报错no command(大概这个意思)这就看出软链接的作用了,让我们随时随地调用程序。(小白理解,我是小白)

pip3.10 install pipenv

然后pipenv也要创建软链接。。。对就是那么无语!
pipenv在/usr/local/python3.10/bin里,和python3.10和pip3.10一个位置。你自己看着办吧。

部署文件详见追梦的博客

然后进入项目文件根目录通过pipfile下载对应的依赖

$ pipenv install --deploy --ignore-pipfile

这里指定 --deploy 参数,Pipenv 将只会安装 Pipfile 中 [packages] 下指定的依赖。因为我们现在是在线上环境进行部署,仅用于开发环境的相关依赖我们并不需要。

–ignore-pipfile 将会使 Pipenv 从 Pipfile.lock 文件中安装项目依赖。Pipfile.lock 记录了项目依赖的精确信息,从这里读取依赖信息能够确保依赖信息被无意中修改或者破坏而使得运行环境因为依赖包的缘故出现不可预料的问题。

抄代码它不香吗
如果你一步步按照教程来的话,不出意外就要出意外了,上报错
python3.x can not found(大概这个意思
字面意思,系统找不到你的python,哎,奇了个怪了,我不是刚刚创建了软链接了吗?对不起,系统是根据pipfile来的,比较笨,看不懂你起的软链接的名字。
比如我的python是3.10,如果我的软链接名字叫python3.10就不会报错。
解决方法也很简单,根据提示

格式 pipenv --python 你的python软链接地址
pipenv3.10 --python /usr/bin/python3.10 
#假设它识别不出来python3.10

然后就正常了,pipenv顺手帮你把虚拟环境创建了。

2.数据迁移

pipenv3.10 run python manage.py migrate
#你应该很熟悉了,只是pipenv名字换成你的软链接名字

至此恭喜你的python至少能跑了!即使可能是裸奔
试试看pipenv3.10 run python manage.py runserver 0.0.0.0:8000,
这将允许通过公网 ip 的 8000 端口访问我们的博客,登录网站输入
ip:8000就可以看到你的网站了(估计

如果你发现你的文章都不见了,不要慌,这是因为你的数据库没有上传服务器。正常情况下你需要重新createsuperuser,再进行创作
2023.1.18先写到这了明天再写


安装Gunicorn

$pipenv3.10 install gunicornS
#用你的pipenv安装gunicorn

启动服务器

$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0.0.0:8000

`-w 2 表示启动 2 个 worker 用于处理请求(一个 worker 可以理解为一个进程)
-k gthread 指定每个 worker 处理请求的方式 (异步
-b 0.0.0.0:8000,将服务绑定到 8000 端口,运行通过公网 ip 和 8000 端口访问应用

安装Superviosr

安装Supervisor

用 django 去获取静态文件是很耗时的,但 Nginx 可以很高效地处理,这就是我们要使用 Nginx 的原因。

yum install epel-release -y

-y(当安装过程提示选择全部为 “yes”)
epel-release 提供高质量软件包的项目,第三方软件源,帮助下载Nginx

$yum install nginx -y

启动Nginx服务

$systemctl start nginx

在浏览器输入 ip(不输入端口则默认为 80 端口,Nginx 默认在 80 端口监听请求),看到 Nginx 的欢迎界面说明 Nginx 启动成功了。

配置Nginx

配置Nginx

Nginx 的配置位于 /etc/nginx/nginx.conf 文件中

接下来我们需要在centOS系统中对文件进行操作,在此之前,我希望你去简单了解centOS文件操作方法

user nobody nobody;
...
http {
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }
    }
}

为了防止可能的权限问题,我们改成当前系统用户。
如果你是root用户

user root

else

#假设你叫pig
user pig pig
#第一个 pig 是你所在的组

我们会在/etc/nginx/conf.d/ 目录下创建我们的配置文件,
因为server 下的 include 会将指定路径中配置文件包含进来,这样便于配置的模块化管理。
创建你想要的文件名,但是记得在后面加上 .conf
配置文件如下 来自追梦人物博客

server {
    charset utf-8;
    listen 80;
    server_name hellodjango-blog-tutorial-demo.zmrenwu.com;

    location /static {
        alias /home/yangxg/apps/HelloDjango-blog-tutorial/static;
        #/apps/HelloDjango-blog-tutorial/static是我的静态文件存放地址
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8000;
    }
}
#charset编码方式
#listen 监听端口
#server_name 域名(如果没有域名用ip地址
#alias 静态文件存放地址(root用户地址/root/后面跟上你的静态文件存放地址

重启使得配置文件生效

systemctl restart nginx

关闭Debug模式,收集静态文件

/settings

DEBUG=False
#注意这时候pipenv run python manage.py runserver命令可能失效了

收集静态文件

$pipenv3.10 run python manage.py collectstatic
#系统会自动帮你在根目录下生成一个static的文件用来储存静态文件

collectstatic通过使用 启用的查找器 搜索文件。默认情况是在 STATICFILES_DIRS 中定义的所有位置和 INSTALLED_APPS 配置指定的应用程序的 ‘static’ 目录中查找。
——详见Django官网

通过gunicorn命令访问你的网站

$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000

访问成功!(估计

安装Supervisor

安装

由于supervisor3.x不支持pip3.x版本
截至到博文发布时间 2013/1/19 supervisor最新的4.0版本已经可以适应python3.x的版本了,但是官方推荐supervisor最好不要用于生产环境,但在这方面已经有人开创先例且似乎平稳运行。
接下来会使用pip2.x搭配supervisor4.1 版本。。。
所以说有什么必要用2.x呢。。。因为pip2.x不指定supervisor版本下的也是最新版的supervisor,然后博主就懒得换了。。。

去/usr/bin目录下查看可以用的软链接

#查看所有以pip开头的文件的链接关系
ll pip*

找到和你的pip2.x关联的文件。
注意看,有时候默认的软链接会我套你你套我一个能用的都没有

浅蓝色是链接文件
绿色是可执行文件,这是我们想要的

Nginx+Gunicorn+Supervisor部署Django项目_第1张图片

转自锤哥123*
如果没有的话也不要慌
可以试试

$cd ///bin
$ls pip*
#///bin我也不知道是哪里,反正什么找不到的好像在这里都可以找到了
#ls查找pip开头的文件

然后是在/usr/bin下创建你的pip2.x的软链接,我的是pip2.6
安装supervisor

$pip2.5 install supervisor

配置

然后是配置。。。我懒得写了你们自己去追梦人物博客看吧。
讲一下博客应用的配置
因为supervisor[include] 版块,将 /home/yangxg/etc/supervisor/conf.d/ 目录下所有以 .ini 结尾的文件内容包含到配置中来,因此我们的配置文件 必须以.ini结尾,不要像我一样傻傻调试一个下午。

[program:hellodjango-blog-tutorial]
command=pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
directory=/home/yangxg/apps/HelloDjango-blog-tutorial
autostart=true
autorestart=unexpected
user=yangxg
stdout_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.log
stderr_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stderr.log

-[program:hellodjango-blog-tutorial] 指明运行应用的进程,名为 hellodjango-blog-tutorial。
#应用进程名可随意,后面使用指令supervisorctl status查看进程时显示的就是这里写的程序名
-command 为进程启动时执行的命令。
-directory 指定执行命令时所在的目录。
-autostart 随 Supervisor 启动自动启动进程。
-autorestart 进程意外退出时重启。
-user 进程运行的用户,防止权限问题。
-stdout_logfile,stderr_logfile 日志输出文件。
#用来调试错误的利器!但是如果你没把配置文件命名 .int它们也救不了你

结构目录

~/etc
├── supervisor
│ ├── conf.d
│ └── var
│ ├── log
└── supervisord.conf

完结撒花

										    2023.1.19
										——by三号航班旅客

你可能感兴趣的:(django,nginx,gunicorn)