设置Flask + uWSGI + nginx的最佳实践

时间:2014-03-16 04:05:14

标签: python nginx flask uwsgi

我尝试使用Flask,uWSGI和nginx的组合来设置我的第一个Web服务器。我获得了Flask& amp; uWSGI组件正在运行。我还从各种博客中获得了很多关于如何设置它的技巧。但是,没有一致性,文章提出了许多不同的设置方法,特别是在文件夹结构,nginx配置和用户/权限方面(我已经尝试了一些这些建议,很多都有效,但我不是确定哪个最好)。那么有一个基本的"最佳实践"设置这个堆栈的方法?

3 个答案:

答案 0 :(得分:8)

nginx + uwsgi + flask是一个强大的堆栈!我将supervisor添加到混合中并按如下方式配置它。

  1. 从主管中运行uwsgi和nginx以获得更好的过程控制。然后,您可以在启动时启动主管,它将以正确的顺序运行uwsgi和nginx。如果他们死了,它也会智能地试图让他们活着。请参阅下面的示例主管配置。
  2. 如果您在同一主机上运行nginx和uwsgi,请使用unix套接字而不是HTTP。
  3. 如果您的Web服务器正在侦听端口80,则nginx主进程必须以root身份运行。我通常在其他端口(如8080)上运行我的Web服务器并使用前面的负载均衡器来侦听端口80和代理到nginx的。
  4. 确保您的uwsgi服务器有权读取/写入您选择的套接字文件以及对任何应用程序代码和数据目录的适当权限。
  5. 不要过分担心您的文件夹结构,特别是如果您使用的是具有合理默认值的Ubuntu Linux发行版。主管理程序配置文件可以包含来自/etc/supervisor/conf.d/等子目录的文件,以将特定于应用程序的配置与管理程序核心配置分开。 nginx也是如此,只有/etc/nginx/sites-enabled

    uwsgi和nginx的示例管理程序配置:

    $ cat /etc/supervisor/conf.d/app.conf
    [program:app]
    command=/usr/local/bin/uwsgi
      --enable-threads
      --single-interpreter
      --vacuum
      --chdir /path/to/app
      --uid www-data
      --log-syslog
      --processes 4
      --socket /tmp/app.sock
      -w mypython:app
      --master
    directory=/path/to/app
    autostart=true
    autorestart=true
    priority=999
    stopsignal=INT
    environment=SOMEVAR=somevalue
    
    [program:nginx]
    command=/usr/sbin/nginx
    
    autostart=true
    autorestart=true
    
    priority=999
    

    示例nginx.conf:

    $ cat /etc/nginx/sites-enabled/myapp.conf
    server {
      listen 8080;
      client_max_body_size 4G;
      server_name localhost;
      keepalive_timeout 5;
      location / {
          include uwsgi_params;
          uwsgi_pass unix:///tmp/app.sock;
      }
    }
    

答案 1 :(得分:3)

这有两个部分,一个是设置系统本身(我的意思是操作系统及其各种路径/文件系统),第二部分是安装和配置组件。

我将集中讨论第二部分,我认为这是你问题的症结所在:

  1. nginx应由操作系统的本机程序包管理实用程序安装。这将确保正确设置所有权限,并且配置文件是您(或其他任何人)期望它们的位置。例如,这意味着在类似debian的系统(例如ubuntu及其各种堂兄弟)上,配置在/etc/nginx/中,通过在/etc/nginx/sites-available/中添加文件来配置站点,依此类推。这也意味着如果您的操作系统供应商推送更新,它们将由您的打包软件自动安装。

  2. uWSGI您应该按来源安装;因为它具有非常快的开发周期,uwsgi中的改进将对您的应用程序产生积极影响。安装过程很简单,不需要特殊权限;除了普通的root / superuser权限之外,您需要在系统范围内安装应用程序。

  3. 您的应用程序的源文件。为此,我强烈建议为每个应用程序创建单独的用户角色,并隔离所有权限和所有相关文件(例如,由uwsgi生成的日志文件),以便它们是全部由同一用户拥有。这可确保其他应用程序/用户无法读取错误消息/日志文件,并且一个用户具有读取/调试与该应用程序相关的所有内容的所有权限,而无需使用sudo等工具。

  4. 除了上面提到的三点之外,实际上让所有这些组件协同工作是一个标准过程:

    1. 在您的应用程序中创建wsgi进程/处理程序。对于flask,默认的flask应用程序已经提供了此接口。

    2. 使用wsgi引擎运行此文件。这是uwsgigunicorn或类似内容。确保您使用的是二进制协议。

    3. 将静态文件映射到Web代理服务的位置(nginx);并创建一个上游服务器,指向wsgi进程期望连接的位置。这可以是端口或管道(取决于您如何设置组件)。

    4. 可选使用像supervisor这样的流程管理器来控制wsgi进程,以便在系统重启时重新启动它们,并且更易于管理。

    5. 其他一切都取决于个人喜好(特别是在文件系统布局方面)。对于大型应用程序,flask的创建者提供blueprints,但请注意,他们不会颂扬任何文件系统/目录布局。

      作为任何 Python包的一般规则,我会将您推荐给this link

答案 2 :(得分:0)

您要求的不是"最佳做法",而是"惯例"。不,项目中没有关于路径,权限等的约定。每个系统管理员(或开发人员)都有自己的需求和品味,所以如果您对当前的设置感到满意......那么#34;完成任务"。没有uWSGI的神可以让他们开心:)显然,发行版提供的软件包必须有他们的约定,但它们与发行版和发行版不同。