通过Gunicorn、Supervisor和Nginx更好地运行Django-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

同时发布在个人站点上 https://panzhixiang.cn

通过runserver运行Django

相信用过Django做开发的人对于python manage.py runserver 这个命令一定不陌生这个命令利用django自带的一个web服务器可以帮助我们在本地很简单地就运行django对于本地测试来说足够了但是不能用作生产环境中甚至测试环境都不行主要有如下几点问题

  1. 性能差
    它是单进程、单线程的因此只能同时处理一个请求。随着请求量的增加服务器的 CPU 和内存使用率会不断上升最终导致性能下降

  2. 功能有限
    它仅支持基本的 HTTP 请求不支持 HTTPS、负载均衡、静态文件服务等功能。在生产环境中这些功能是必不可少的。

通过Gunicorn运行Django

正式使用Gunicorn之前先说一下它的优点
以下内容来自GPT4

GunicornGreen Unicorn是一个Python的WSGI HTTP服务器许多大型网站和高性能应用都选用它来托管 Python web 应用。以下是 Gunicorn 的一些主要优点

  1. 简单易用Gunicorn 非常容易安装和配置。你只需要通过 pip 安装它并用几行命令就可以启动一个 WSGI 应用。这使得开发者可以更加专注于他们的应用程序代码而不需要过多关心部署和运维问题。

  2. 兼容性强Gunicorn 全面支持 WSGI 规范因此理论上与所有遵循该规范的Python web框架兼容包括但不限于Django、Flask和Pyramid等。

  3. 预分叉模型Gunicorn 使用 Unix 的 fork 系统调用创建子进程worker每个 worker 可以独立地处理请求。使用预分叉模型父进程可以在必要时杀死并重建子进程提供了对内存泄漏的防护机制。

  4. 负载管理Gunicorn 有多种类型的 worker 可供选择包括同步 worker 和异步 worker。同步 worker 适合 CPU 密集型任务而异步 worker 则适合 IO 密集型或网络密集型的任务。这意味着你可以根据自己的应用特性选择最合适的 worker 类型。

  5. 错误隔离由于每个请求都由各自的 worker 进程处理如果一个请求导致 crash 或者未捕获的异常那么只会影响到正在处理该请求的 worker其他 worker 或请求将不受影响。

  6. 健壮性和可靠性Gunicorn 能够自动管理 worker 进程如果某个 worker 异常退出Gunicorn 主进程会自动重新启动新的 worker 进程来代替从而保证服务的持续可用。

  7. 配置灵活Gunicorn 提供了大量的配置选项你可以控制日志级别、输出位置、worker 数量、请求超时时间、SSL 设置等诸多方面。同时Gunicorn 支持从 Python 文件、环境变量、命令行参数中读取配置满足了不同场景下的需求。

  8. 热重载Gunicorn 支持无缝重启这意味着你可以在不中断服务的情况下升级代码或者配置。

  9. 社区支持和文档最后但同样重要的是Gunicorn 有一个活跃的开发者社区和详细的官方文档能够为使用 Gunicorn 的开发者提供大量的帮助和指导。

在使用 Gunicorn 运行 Django 之前你需要确保已经正确地安装了 Django 和 Gunicorn。假设你的 Django 项目名为 myproject并且它位于 /path/to/myproject/ 下。

  1. 安装 Gunicorn
    如果你还没有安装 Gunicorn可以使用 pip 来安装

    pip install gunicorn
    
  2. 运行 Gunicorn
    现在你应该可以用 Gunicorn 来启动你的 Django 应用了。Gunicorn 的基本命令格式是 gunicorn [OPTIONS] APP_MODULE其中 APP_MODULE 是一个 Python 导入路径指向包含 WSGI application 对象的模块。

    在标准的 Django 项目中这个对象通常被称为 application定义在 wsgi.py 文件里。所以如果你的项目名为 myproject那么 APP_MODULE 就是 myproject.wsgi

    要让 Gunicorn 启动 Django 项目可以执行以下命令

    cd /path/to/myproject/
    gunicorn myproject.wsgi
    

    这将会在监听 localhost:8000 的 Gunicorn 服务器上启动你的 Django 应用。

    注意这个只是为了演示gunicorn的简单运行方式正式环境中不推荐这么使用

  3. 配置 Gunicorn

    Gunicorn 提供了许多可配置的选项可以根据自己的需求去调整其行为比较常用的方式是创建一个 Gunicorn 配置文件可以让你的配置更加结构化和方便管理。Gunicorn 的配置文件通常是一个 Python 脚本其中定义了一些全局变量。

    假设我们在 /path/to/myproject/gunicorn_config.py 创建以下配置文件

    
     # gunicorn_config.py
     import multiprocessing
     
     # 绑定ip和端口号
     bind = "0.0.0.0:8080"
     
     # 使用gevent模式还可以使用sync 模式默认的是sync模式
     worker_class = 'gevent'
     
     # 开启的进程数
     workers = multiprocessing.cpu_count() * 2 + 1
     
     # 并发处理的请求数量
     threads = 2
     
     # 最大待处理连接数
     backlog = 2048
     
     # 工作模式协程
     worker_connections = 1000
     
     # 重载、修改配置后自动重新加载程序
     reload = True
     
     # 访问日志文件
     accesslog = "/var/log/gunicorn/access.log"
     
     # 错误日志文件
     errorlog = "/var/log/gunicorn/error.log"
    

    上述配置中我们设置了多个参数如绑定地址、工作模式、日志位置等等。这只是一个基础的配置例子你可以根据实际需求进行修改或扩展。

    然后你可以通过 -c--config 命令行选项来指明配置文件的路径运行 Django 应用如下所示

    cd /path/to/myproject/
    gunicorn myproject.wsgi -c gunicorn_config.py
    

    该命令告诉 Gunicorn 加载 gunicorn_config.py 文件并应用里面定义的配置。

通过Nginx来做反向代理

gunicorn比起django的runserver要好很多但是实践中一般不会直接将gunicorn直接对外暴露而是再加一层反向代理最常用的就是Nginx。

使用Nginx作为反向代理主要有以下优势

  1. 静态文件处理Nginx 非常擅长处理静态内容如 CSS、JavaScript 文件或图片而 Python WSGI 服务器通常并不适合直接服务静态文件这可能会引发性能问题。通过将静态文件服务任务交给 Nginx你可以释放出 Gunicorn 的资源来处理动态内容。

  2. 负载均衡如果你有多个后端服务器或者多个 worker 进程Nginx 可以有效地分配传入请求到各个后端服务器上实现负载均衡。它还支持多种负载均衡策略和健康检查。

  3. 缓冲请求Nginx 可以为后端提供一层保护因为它拦截并处理了所有客户端连接。这意味着后端服务器只需要处理完整的请求无需关心网络问题或慢速连接。此外如果后端应用挂掉或重启在这段时间内 Nginx 仍然可以继续为用户提供服务例如返回一个友好的错误页面。

  4. SSL 终止如果你的网站需要 SSL 加密Nginx 可以处理所有的 HTTPS 握手过程并与后端服务器进行非加密通信这样就减轻了后端服务器的负担。

  5. HTTP/2 支持Nginx 支持 HTTP/2 协议而大部分 WSGI 服务器包括 Gunicorn 目前还没有直接支持 HTTP/2 的计划。通过在 Nginx 中开启 HTTP/2你的用户可以享受到更快的加载速度和更低的延迟。

  6. 访问控制和安全防护Nginx 提供了一系列安全相关功能比如 IP 白名单/黑名单、限速、防止 DDOS 攻击等。

  7. gzip 压缩Nginx 可以对响应数据进行 gzip 压缩从而减少网络带宽消耗和提高页面的加载速度。

下面是使用 Nginx 作为 Gunicorn 的反向代理的详细步骤

  1. 安装 Nginx

    在 Ubuntu/Debian 上你可以通过 apt-get 来安装 Nginx

    sudo apt-get install nginx
    
  2. 配置 Nginx

    配置 Nginx 以使其能正确地将请求转发到 Gunicorn。Nginx 的设置文件通常位于 /etc/nginx/sites-available/default

    下面是一个基本的配置示例

    server {
        listen 80;
        server_name yourdomain.com;
    
        location /static/ {
            alias /path/to/myproject/static/;  # 这里是指向Django中的静态文件目录的
        }
    
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            
            proxy_pass http://localhost:8000; # 替换成 gunicorn 正在监听的地址和端口号
        }
    }
    
  3. 启动 Nginx

    完成配置后你就可以启动 Nginx 了

    sudo service nginx start
    

以上就是基本的流程。当然这只是最简单的配置如果你需要更高级的特性比如 HTTPS、负载均衡或缓存则需要进行更多的配置。建议查阅 Nginx 官方文档 获取更详细的信息。

通过Supervisor来托管gunicorn和nginx

我是在第二份工作中才接触到supervisor的了解之后就非常喜欢这个工具最大好处就是托管某一个进程尤其是如果进程出现问题死掉了supervisor会自动尝试重启这个进程这个对于线上环境来说非常重要。

Supervisor 是一个用 Python 写的进程管理工具可以很方便地用来在 UNIX-like 系统不支持Windows下启动、重启自动和关闭进程。

以下是如何使用 Supervisor 托管 gunicorn 和 nginx 的步骤

  1. 安装 Supervisor

    在 Ubuntu/Debian 上你可以通过 apt-get 来安装 Supervisor

     sudo apt-get install supervisor
    
  2. 创建 Supervisor 配置文件

    你需要为每个要由 Supervisor 管理的程序创建一个配置文件。这些文件通常位于 /etc/supervisor/conf.d/ 目录下并且以 .conf 结尾。

    如上假设Django 项目路径为 /path/to/myproject/Gunicorn 的配置文件名为 gunicorn_config.py那么我们需要为 Gunicorn 创建一个名为 myproject_gunicorn.conf 的文件

    # /etc/supervisor/conf.d/myproject_gunicorn.conf
    
    [program:myproject_gunicorn]
    command=/usr/local/bin/gunicorn myproject.wsgi:application -c /path/to/myproject/gunicorn_config.py
    directory=/path/to/myproject/
    user=yourusername
    autostart=true
    autorestart=true
    redirect_stderr=true
    

    同样我们也需要为 Nginx 创建一个名为 nginx.conf 的文件

    # /etc/supervisor/conf.d/nginx.conf
    
    [program:nginx]
    command=/usr/sbin/nginx -g "daemon off;"
    autostart=true
    autorestart=true
    redirect_stderr=true
    
  3. 运行 Supervisor

    安装完 Supervisor 并创建了相关的配置文件后你就可以让 Supervisor 开始工作了。首先你需要读取所有新的或修改过的配置文件

    sudo supervisorctl reread
    

    接着你可以更新 Supervisor 服务的状态使其开始运行新添加的程序

    sudo supervisorctl update
    

    或者如果你想单独启动某个程序比如 myproject_gunicorn (也就是上面的Django)你可以这样做

    sudo supervisorctl start myproject_gunicorn
    
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginxgo

“通过Gunicorn、Supervisor和Nginx更好地运行Django-CSDN博客” 的相关文章