我尝试使用Flask,uWSGI和nginx的组合来设置我的第一个Web服务器。我获得了Flask& amp; uWSGI组件正在运行。我还从各种博客中获得了很多关于如何设置它的技巧。但是,没有一致性,文章提出了许多不同的设置方法,特别是在文件夹结构,nginx配置和用户/权限方面(我已经尝试了一些这些建议,很多都有效,但我不是确定哪个最好)。那么有一个基本的"最佳实践"设置这个堆栈的方法?
答案 0 :(得分:8)
nginx + uwsgi + flask是一个强大的堆栈!我将supervisor添加到混合中并按如下方式配置它。
不要过分担心您的文件夹结构,特别是如果您使用的是具有合理默认值的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)
这有两个部分,一个是设置系统本身(我的意思是操作系统及其各种路径/文件系统),第二部分是安装和配置组件。
我将集中讨论第二部分,我认为这是你问题的症结所在:
nginx
应由操作系统的本机程序包管理实用程序安装。这将确保正确设置所有权限,并且配置文件是您(或其他任何人)期望它们的位置。例如,这意味着在类似debian的系统(例如ubuntu及其各种堂兄弟)上,配置在/etc/nginx/
中,通过在/etc/nginx/sites-available/
中添加文件来配置站点,依此类推。这也意味着如果您的操作系统供应商推送更新,它们将由您的打包软件自动安装。
uWSGI
您应该按来源安装;因为它具有非常快的开发周期,uwsgi
中的改进将对您的应用程序产生积极影响。安装过程很简单,不需要特殊权限;除了普通的root / superuser权限之外,您需要在系统范围内安装应用程序。
您的应用程序的源文件。为此,我强烈建议为每个应用程序创建单独的用户角色,并隔离所有权限和所有相关文件(例如,由uwsgi生成的日志文件),以便它们是全部由同一用户拥有。这可确保其他应用程序/用户无法读取错误消息/日志文件,并且一个用户具有读取/调试与该应用程序相关的所有内容的所有权限,而无需使用sudo
等工具。
除了上面提到的三点之外,实际上让所有这些组件协同工作是一个标准过程:
在您的应用程序中创建wsgi进程/处理程序。对于flask,默认的flask应用程序已经提供了此接口。
使用wsgi引擎运行此文件。这是uwsgi
或gunicorn
或类似内容。确保您使用的是二进制协议。
将静态文件映射到Web代理服务的位置(nginx
);并创建一个上游服务器,指向wsgi进程期望连接的位置。这可以是端口或管道(取决于您如何设置组件)。
可选使用像supervisor
这样的流程管理器来控制wsgi进程,以便在系统重启时重新启动它们,并且更易于管理。
其他一切都取决于个人喜好(特别是在文件系统布局方面)。对于大型应用程序,flask的创建者提供blueprints,但请注意,他们不会颂扬任何文件系统/目录布局。
作为任何 Python包的一般规则,我会将您推荐给this link。
答案 2 :(得分:0)
您要求的不是"最佳做法",而是"惯例"。不,项目中没有关于路径,权限等的约定。每个系统管理员(或开发人员)都有自己的需求和品味,所以如果您对当前的设置感到满意......那么#34;完成任务"。没有uWSGI的神可以让他们开心:)显然,发行版提供的软件包必须有他们的约定,但它们与发行版和发行版不同。