在linux上Nginx+Gunicorn+Supervisor部署django

# 介绍

Gunicorn

Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(比如 Django 或者 Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,即支持eventlet也支持greenlet。 如果对Flask框架还有不清楚的地方,可以查看本文一分钟学会Flask框架的安装与快速使用 Gunicorn启动项目之后一定会有一个主进程Master和一个或者多个工作进程。工作进程的数量可以指定。工作进程是实际处理请求的进程。主进程是维护服务器的运行。

nginx

Nginx是一个高性能的HTTP和反向代理web服务器,所谓的方向代理即使将访问用户a地址,nginx将a地址指向了b地址,即使用户通过a地址访问b地址。

supervisor

Supervisor(Supervisor: A Process Control System)是用Python开发的一个client/server服务,,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。我们在shells上运行gunicorn时候或者其他,只要我们一退出shell,这个进程就会杀死。所以需要这个框架来守护我们运行的gunicorn.保证网站系统不被关闭。

前期准备

在搭建前我们需要准备项目所要的环境,首先在开始这前我们需要创建新的用户来搭建环境,因为使用root不安全,一般不使用root.

# 添加用户
adduser 新用户名
# 为创建的新用户设置密码
passwd  新用户名
# 将新用户添加超级权限组
usermod -aG wheel 新用户名
# 切换新用户
su 新用户名
# 安装wget便于下载软件
sudo yum install -y wget

在创建密码的时候输入密码不显示,将用户添加到wheel用户组下,wheel用户组为管理组,

python环境搭建

首先下载python包到我们新用户目录下的src文件下,这个目录需要我们先创建

# 创建/home/新用户名/src目录
mkdir ~/src
# 进入目录
cd ~/src
# 下载python文件
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
#安装可能需要的依赖
sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
# 解压文件且进入目录
tar -zxvf Python-3.6.9.tgz
cd Python-3.6.9
# 编辑配置文件--prefix是python的安装目录
./configure --prefix=/usr/local/python3
make
make install
# 建立软连接,(Python与pip都建立软连接,分别为python3、pip3与系统自带的Python2区分)可以使用命令`ls -l /usr/bin/查看软连接是否已创建成功`
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# 配置环境变量,打开配置文件,添加配置
 vi ~/.bash_profile
#添加以下配置信息(第一个是python安装路径)
export PYTHON_HOME=/usr/local/python3
export PATH=$PYTHON_HOME/bin:$PATH
#最后执行以下命令使配置生效
source ~/.bash_profile
#可以使用以下命令查看配置是否成功,输出python安装路径即是成功
echo $PYTHON_HOME

配置SFTP

在将本地项目部署到云服务器的时候,我们需要将文件项目进行上传到云服务器
,这里我选择简单的上传方式,采用软件FileZilla Client进行上传,也可以使用xFTP软件。以FileZilla Client这个软件为例,新建站点且配置参数

  1. 协议选择sftp或者ftp
  2. 主机为服务器地址,端口默认为sftp:22,ftp:21
  3. 登录类型可以选择密码或者密钥文件
  4. 用户为服务器用户名
    配置完成连接成功后可以直接将项目拉到服务器
     

    lli1pi1e.png


    这里将项目拉到用户apps目录下,需要我们自己创建

    mkdir -p ~/apps

    创建虚拟环境

    但我们将项目上传的服务器部署是,我们需要配置虚拟环境,因为一个服务器不止一个项目,以免环境冲突。

    # 进入项目目录
    cd ~/apps/djangoproject/
    # 安装虚拟配置工具
    pip3 install virtualenv
    # 创建虚拟环境,venv为虚拟环境名,在这下会创建同名的目录
    virtualenv venv
    # 激活虚拟环境
    source venv/bin/activate

    使用 Gunicorn进行生产环境的服务部署

    进入项目根目录下安装Gunicorn,这个安装在虚拟环境下的

    pipenv install gunicorn
    # 通过gunicorn运行django,这个可以不运行,因为我们推出shell后这杀死这个进程了
    gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000

    启动 Nginx 服务器进行服务代理

# 安装Nginx
sudo yum install epel-release -y
sudo yum install nginx -y
# 启动Nginx服务:
sudo systemctl start nginx

可能遇到的问题
nginx启动成功后输入ip,无法访问默认的主页(80端口)。
原因:
云服务器未对外开启80端口

配置nginx的服务信息

位于 /etc/nginx/nginx.conf 的nginx.conf文件是nginx服务器的配置信息,包括 Nginx 进程运行时的用户和组(分别为第一个和第二个参数)以及代理的虚拟服务的配置情况等。

/etc/nginx/nginx.conf

# 进程运行的用户和组,这里粗暴地设为root用户和组
user root root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

......

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # 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  _;                   # 服务域名/ip
        root         /usr/share/nginx/html;

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

        location / {                  # 访问路径
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    
  ......
  

配置 项目代理服务信息

# 进入/etc/nginx/conf.d目录
cd /etc/nginx/conf.d
# 新建myBlog.conf配置文件
vim myBlog.conf

配置信息如下:

server {
    charset utf-8;
    listen 80;
    server_name 139.196.xxx.xx;

    location /static {
        alias /home/wwb/apps/myDjango/blogproject/static;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8000;
    }
}

监听80端口(访问ip时的默认端口),server_name为公网ip或域名,访问静态文件路径static_url时,nginx自动到static_root指定的路径下获取文件。访问其他路径时,将请求转发给本机的8000端口,那里运行的是Gunicorn 服务中的 django程序。

#重启nginx让配置生效
sudo systemctl restart nginx 

使用Supervisor守护Gunicorn 进程

当前的Gunicorn服务是我们手工启动的,一旦我们退出 shell,服务器就关闭了,博客无法访问。就算在后台启动 Gunicorn,万一哪天服务器崩溃重启了又得重新登录服务器去启动,非常麻烦。为此使用 Supervisor 来管理 Gunicorn 进程,这样当服务器重新启动或者 Gunicorn 进程意外崩溃后,Supervisor 会帮我们自动重启 Gunicorn。

# 安装supervisor
pip3 instal supervisor
# 在用户目录下创建相关文件目录
cd ~/etc
mkdir supervisor
cd supervisor
mkdir var
mkdir log
mkdir conf.d
# 在~/etc目录下生成Supervisor的配置文件
echo_supervisord_conf > supervisord.conf

目录说明

supervisor目录手动创建,其中var 目录下用于存放一些经常变动的文件,例如 socket 文件,pid 文件,log 下则存放日志文件。

可将supervisord.conf文件内容全部替换为以下内容

# [unix_http_server] 版块,设置file的值。
# 即让 socket 文件生成在 ~/etc/supervisor/var/ 目录下。注意 supervisor 不支持将 ~ 展开为用户 home 目录,所以要用绝对路径指定。
[unix_http_server]
file=/home/新用户名/etc/supervisor/var/supervisor.sock   ; the path to the socket file


# [supervisord] 板块下的 logfile 和 pidfile 文件的路径,还有 user 改为系统用户,这样 supervisor 启动的进程将以系统用户运行,避免可能的权限问题:

[supervisord]
logfile=/home/新用户名/etc/supervisor/log/supervisord.log ; main log file; default $CWD/supervisord.log
pidfile=/home/新用户名/etc/supervisor/var/supervisord.pid ; supervisord pidfile; default supervisord.pid
user=root            ; setuid to this UNIX account at startup; recommended if root

# [supervisorctl] 板块,配置serverurl的值
[supervisorctl]
serverurl=unix:home/新用户名/etc/supervisor/var/supervisor.sock ; use a unix:// URL  for a unix socket

# [include] 版块,将 /home/wwb/etc/supervisor/conf.d/ 目录下所有以 .ini 结尾的文件内容包含到配置中来,这样便于配置的模块化管理,和之前 Nginx 配置文件的处理方式是类似的。注意取消行首的`;`注释。
[include]
files = /home/新用户名/etc/supervisor/conf.d/*.ini
autorestart=True

配置项目应用到supervisor

# 进入我们上面设置配置文件路径 /home/新用户名/etc/supervisor/conf.d
su 新用户
cd ~/etc/supervisor/conf.d
# 新建项目配置文件blog.ini
vim blog.ini

##############################################################
# blog.ini配置详情
# 程序名,后续开启关闭进程都使用程序名指代当前应用
[program:myDj]
# 程序需要执行的指令
command=gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
# 执行指令时到达的路径
directory=/home/新用户名/apps/djangoproject/
# 是否自动启动,遭遇意外自动重启
autostart=true
autorestart=unexpected
# 开启当前应用的用户角色
user=root
# 应用的相关日志
stdout_logfile=/home/新用户名/etc/supervisor/log/myDjango-stdout.log
stderr_logfile=/home/新用户名/etc/supervisor/log/myDjango-stderr.log
##################################################################
# -c 指定 Supervisr 启动时的配置文件。
supervisord -c ~/etc/supervisord.conf
#进入 supervisorctl 进程管理控制台
supervisorctl -c ~/etc/supervisord.conf
#更新配置文件
update
#启动应用
restart myDj

lli3oivr.png

配置数据库

参考文章: Django学习之旅(十二)Nginx+Gunicorn+Supervisor部署Django博客应用以及各种排坑尝试
Linux系统上安装python详细步骤
【Python】Python创建虚拟环境的三种方式

  • 47
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的 NginxGunicornDjango 和 DRF 示例,涵盖了常见的配置和设置: 1. 安装和配置 Nginx 在服务器上安装 Nginx,并创建一个新的站点配置文件。以下是一个示例配置文件,将所有请求转发到 Gunicorn: ``` server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` 2. 安装和配置 GunicornDjango 项目的虚拟环境中安装 Gunicorn: ``` pip install gunicorn ``` 创建一个 Gunicorn 配置文件(比如 gunicorn_config.py),指定项目的 WSGI 应用程序和其他选项: ``` import multiprocessing bind = "127.0.0.1:8000" workers = multiprocessing.cpu_count() * 2 + 1 ``` 3. 安装和配置 Django 和 DRF 在 Django 项目的虚拟环境中安装 Django 和 DRF: ``` pip install django djangorestframework ``` 创建一个 Django 项目,并在 settings.py 中添加 DRF 的应用程序: ``` INSTALLED_APPS = [ ... 'rest_framework', ... ] ``` 在 urls.py 中添加 DRF 的路由: ``` from django.urls import path, include urlpatterns = [ ... path('api/', include('rest_framework.urls')), ... ] ``` 创建一个 DRF 视图(比如 views.py),实现一个简单的 API: ``` from rest_framework.views import APIView from rest_framework.response import Response class HelloWorldView(APIView): def get(self, request): return Response("Hello, World!") ``` 在 urls.py 中添加一个路由,将视图映射到 URL: ``` from django.urls import path from .views import HelloWorldView urlpatterns = [ ... path('api/hello/', HelloWorldView.as_view()), ... ] ``` 4. 启动应用程序 使用 Gunicorn 启动 Django 项目: ``` gunicorn myproject.wsgi:application -c gunicorn_config.py ``` 访问 http://yourdomain.com/api/hello/,应该会看到 "Hello, World!" 的响应。如果您遇到任何问题,请参阅 NginxGunicornDjango 和 DRF 的文档和教程,以获取更详细的说明和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值