通过Gunicorn、Supervisor和Nginx更好地运行Django

这篇具有很好参考价值的文章主要介绍了通过Gunicorn、Supervisor和Nginx更好地运行Django。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

通过runserver运行Django

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

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

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

通过Gunicorn运行Django

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

Gunicorn(Green 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),你可以这样做:文章来源地址https://www.toymoban.com/news/detail-722540.html

    sudo supervisorctl start myproject_gunicorn
    

到了这里,关于通过Gunicorn、Supervisor和Nginx更好地运行Django的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用gunicorn部署django项目时,发现静态文件加载失败问题,及部署

    from   django.contrib.staticfiles.urls  import   staticfiles_urlpatterns     urlpatterns  =   [    url( \\\'^admin/\\\' , admin.site.urls), ] urlpatterns  + =   staticfiles_urlpatterns() # 修改settings.py文件的:INSTALLED_APPS INSTALLED_APPS = [ ... \\\'gunicorn\\\', # 把gunicorn添加到apps中 ] 配置脚本文件启动django项目: # gunicorn_con

    2024年02月09日
    浏览(49)
  • 阿里云服务器部署flask项目「gunicorn + nginx + 支持https」

    最近做了一个微信小程序,使用 flask 实现了对应的后台,上线需要部署到服务器上,之前只是了解并没有全链路试过,靠着网上的资料最终完成部署上线,但中间遇到了较多的一些问题,网上的资料也比较零碎,所以整理了这篇文章,一方面是作为记录方便后续查阅,另一方

    2024年02月06日
    浏览(46)
  • Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录

    个人博客:https://xzajyjs.cn 之前自己写的flask使用gunicorn上线生产环境没有什么问题,但是最近搭建了一个现成的flask项目,当使用python直接运行时不会有问题,而使用gunicorn时则会出现一些问题。 这里使用pyenv创建了一个虚拟环境,并安装好依赖 下面是入口函数 run.py : 其中

    2024年02月16日
    浏览(45)
  • FastAPI + NGINX + Gunicorn:一步一步教你部署一个高性能的Python网页应用

    部署一个 FastAPI 应用到你的服务器是一项复杂的任务。如果你对 NGINX 、 Gunicorn 和 Uvicorn 这些技术不熟悉,可能会浪费大量的时间。如果你是刚接触 Python 语言不久或者希望利用 Python 构建自己的Web应用程序,本文的内容可能会让你第一次部署时更节省时间。 FastAPI 是用于开发

    2024年02月05日
    浏览(62)
  • Django+Nginx+uWSGI+Supervisor实战

    大家好,真的是许久没有更新文章了,甚是想念,最近这段时间事情很多,家里的事情、工作的事情,真没有太多时间去码文章,其实已经搁置了些许文章,没有整理,趁着这段时间风平浪静,我还是不忘初心,给大家分享。 唠嗑下网络自动化(NetDevOps): 为什么要讨论这个,

    2024年02月09日
    浏览(46)
  • python之gunicorn的配置

    为了实现并发,python常见的web部署搭配nginx + gunicorn, flask + gunicorn 本文介绍gunicorn的配置和使用。 2.1. 配置flask路由 (my_service.py ) 在flask的项目的目录下启动flask的应用程序(启动flask文件的同级目录) 3.1 全局配置文件  3.2 读取配置文件 3.3 配置flask路由 (gunicorn_service.py ) 3.4

    2024年02月09日
    浏览(34)
  • 01、uwsgi、gunicorn如何实现优雅重启

    在实际开发过程中,我们会不断迭代升级产品,每次迭代后,都需要在线上服务器更新代码。一般小公司的迭代升级,是没有做到像金丝雀发布或者使用到kubernetes这些东西的。那如何保证更新的时候,之前接收到的请求能够正常处理完成呢,这个时候就需要实现优雅重启了。

    2023年04月10日
    浏览(35)
  • Python中使用Gunicorn进行高效部署的配置指南

    Gunicorn(Green Unicorn)是一个用于在Python Web应用程序中充当HTTP服务器的工具。它可以帮助开发人员在生产环境中高效地部署Python应用程序。本文将介绍如何正确配置和使用Gunicorn,以实现最佳的性能和可靠性。 Gunicorn是一个基于Python的Web服务器,它使用预派生的子进程来处理并

    2024年04月13日
    浏览(35)
  • Python Flask + Gunicorn + Docker 的日志输出设置

    我们一个项目使用了 Python Flask 框架来实现 Web 服务,之前的日志输出一直有问题。而从项目需求、运行维护出发,正确的日志输出对使用者来说都是非常重要的。 这里完整的整理了从 开发 Flask 时的日志设置,到生产环境使用 Gunicorn 运行 Flask 的日志设置 以及 使用 Docker 容器

    2024年02月05日
    浏览(41)
  • 在 AWS EC2 Linux 服务器上部署Gunicorn

    在 AWS EC2 Linux 服务器上部署 Flask 应用的步骤类似,你也可以使用 Gunicorn。以下是具体步骤: 1. 连接到你的 AWS EC2 实例。你可以通过 SSH 进行连接,如: ``` ssh -i /path/to/your/key.pem ec2-user@your-ec2-ip-address ``` 2. 在你的环境中安装 Gunicorn,如果你还没有安装 Flask,你也应该安装它:

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包