热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用Nginx+UWSGI

如何使用Nginx+UWSGI
  经过大量的实验(在 disqus.com和 getsentry.com上),我可以确切的说:uwsgi应该成为Python世界的标准。 把它和nginx结合,在基于 Python的Web应用程序上你能获得在线程(或非线程)之上更好的性能体验。

  更新:忽略古老的说法“你给任何度量是慢”,我在这里说的请求是指后端节点,他们处理输入事件(从20KB到1MB大小的请求),在网络跳过数跳经过各种授权和配额策略,并最形成一些队列操作。卸载尽可能多的工作负载。(本段翻译有问题,请参考原文,译者注)

 服务策略

  目前已经有相当数量的方法可以用来运行Python应用程序。我不打算使用mod_wsgi,最重要的,我并不想说明事件模型如何工作。我不相信在Python的世界它们依旧使用,所以这篇文章的主题也不是关于传统的线程(或多进程)的Python应用程序。

  相反,我将专注于两个最流行且我最熟悉的解决方案:gunicorn和uwsgi。

 Gunicorn(Python UNIX平台的wsgi服务器)

  回顾过去,Python的Web服务器的解决方案基本上只有mod_wsgi。其中最流行的(或理解为时尚)的方法是最近Gunicorn。

  实际上,我仍然建议使用gunicorn,这样可以极大的减少不便:它可以漂亮的嵌入Django而且设置简单。

  它也有10%的配置选项和uwsgi一致(这对某些人来说是件好事),除此之外,比较看来,它提供了与uwsgi(或任何其他Python Web服务器)几乎相同的基本特性。

 uwsgi

  在我看来这是唯一的选择,从Gunicorn到uwsgi。将有更高性能的,有更多极易明白的配置选项,通过协议可以与nginx交互也增加了优势。
它的配置也是相当简单,找到一篇文章相关文章就可以了,后来更多。
我开始使用uwsgi来跑一些应用,使用–processes=10和–threads=10来测试服务器的多CPU,目的有两个:

  • 支持情况


  • 测试降低内存使用量的可能性


  • 测试线程安全的支持情况

  (对于这些测试是否值得,DISQUS是 单线程运行的,我想保持尽可能的精简,把每个节点的能力发挥到极致)

 不断趋向成功的迭代

  我们使API平均响应时间降到40ms以内,我非常自豪。这里我说的API相应时间是指:从请求击中了Python服务器到服务器返回响应到代理所花费的时间。

  不幸的是,当我们始获得越来越大的流量并出现访问尖峰后响应时间出现问题了,波动的响应时间不再符合我们开始的设想,尽管服务节点上我们仍然有大约30%的内存和60%的资源空余。

  在不少调整后,我们停用了大量uwsgi进程的方法,让nginx的负载均衡它们(之前是让uwsgi本身负载平衡)。

  这意味着什么呢,是不是做uwsgi过程= 10,我们运行10个单独的uwsgi实例代替–processes=10。

  其结果是一个美丽的,一致的20ms的平均响应时间。

  API响应时间

 将他们组合在一起

  我喜欢着手去做而非空谈,这里我给大家一些我们在线服务器的实际设置。

 nginx

  配置的第一块是Nginx的,我们需要实际计算并添加uwsgi的进程 后端数量,所以事情有点复杂。

  我们首先建立在我们的网页配置列表:

# recipes/web.rb

hosts = (0..(node[:getsentry][:web][:processes] - 1)).to_a.map do |x|
  port = 9000 + x
  "127.0.0.1:#{port}"
end

template "#{node['nginx']['dir']}/sites-available/getsentry.com" do
  source "nginx/getsentry.erb"
  owner "root"
  group "root"
  variables(
    :hosts => hosts
  )
  mode 0644
  notifies :reload, "service[nginx]"
end

  Nginx的配置很简单:

# templates/getsentry.erb

upstream internal {
<% @hosts.each do |host| %>
  server <%= host %>;
<% end %>
}

server {
  location / {
    uwsgi_pass         internal;

    uwsgi_param   Host                 $host;
    uwsgi_param   X-Real-IP            $remote_addr;
    uwsgi_param   X-Forwarded-For      $proxy_add_x_forwarded_for;
    uwsgi_param   X-Forwarded-Proto    $http_x_forwarded_proto;

    include uwsgi_params;
  }
}

  现在,我们已经设置了uwsgi的主机数量并分配了权重值,从9000端口开始,它们都是被uwsgi配置使用的套接字地址。

 uwsgi

  另一方面,我们使用supervisor来控制uwsg进程,这也非常简单:

# recipes/web.rb

command = "/srv/www/getsentry.com/env/bin/uwsgi -s 127.0.0.1:90%(process_num)02d --need-app --disable-logging --wsgi-file getsentry/wsgi.py --processes 1 --threads #{node[&#39;getsentry&#39;][&#39;web&#39;][&#39;threads&#39;]}"

supervisor_service "web" do
  directory "/srv/www/getsentry.com/current/"
  command command
  user "dcramer"
  stdout_logfile "syslog"
  stderr_logfile "syslog"
  startsecs 10
  stopsignal "QUIT"
  stopasgroup true
  killasgroup true
  process_name &#39;%(program_name)s %(process_num)02d&#39;
  numprocs node[&#39;getsentry&#39;][&#39;web&#39;][&#39;processes&#39;]
end

 位置的选择

  除非有人想出了一个非常有说服力的论据:为什么应该有另一种方式(或某种该情形下不能工作的情况),我希望能听到这种模式因为Python的世界变得更标准。最起码,我希望看到关于如何提高uwsgi内进程管理的一些辩论的火花。

以上就是如何使用Nginx + UWSGI的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • PHP环境下的ini配置详解:聚焦错误相关选项
    本文详细探讨了PHP环境中的ini配置,特别是与错误处理相关的配置项,旨在帮助开发者更好地理解和调整php.ini文件以适应不同的开发需求。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本指南详细介绍了如何利用华为云对象存储服务构建视频点播(VoD)平台。通过结合开源技术如Ceph、WordPress、PHP和Nginx,用户可以高效地实现数据存储、内容管理和网站搭建。主要内容涵盖华为云对象存储系统的配置步骤、性能优化及安全设置,为开发者提供全面的技术支持。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
author-avatar
花甲墨者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有