在Ubuntu上使用nginx通过FastCGI运行Python

在Ubuntu上使用nginx通过FastCGI运行Python,python,http,nginx,installation,Python,Http,Nginx,Installation,我已经看过了关于这个的其他线程,但是大多数没有深入到足够的设置细节,这正是我需要帮助的地方 我有一个使用nginx运行的基于Ubuntu的VPS,通过端口9000上的PHPCGI为PHP站点提供服务 我想开始用Python做更多的工作,所以我编写了一个部署脚本,基本上我想在本地GitLab服务器上作为post接收挂钩,作为我的第一个Python脚本。我可以通过在命令行上运行python script.py成功运行此脚本,但为了将其用作post接收挂钩,我需要它能够通过http访问它 我在ngin

我已经看过了关于这个的其他线程,但是大多数没有深入到足够的设置细节,这正是我需要帮助的地方

我有一个使用nginx运行的基于Ubuntu的VPS,通过端口9000上的PHPCGI为PHP站点提供服务

我想开始用Python做更多的工作,所以我编写了一个部署脚本,基本上我想在本地GitLab服务器上作为post接收挂钩,作为我的第一个Python脚本。我可以通过在命令行上运行
python script.py
成功运行此脚本,但为了将其用作post接收挂钩,我需要它能够通过http访问它

我在nginx wiki上查看了一下,但中途说:

并启动django fastcgi流程:

python./manage.py runfcgi主机=127.0.0.1端口=8080

现在,正如我所说,我对python非常陌生,而且我从未使用过Django框架。有谁能帮助我如何启动fastcgi服务器吗?我是否用脚本的名称替换
/manage.py
?我在网上找到的所有东西都是关于与Django合作的,因此我非常感谢您的任何帮助

是否用脚本的名称替换./manage.py

不可能。您的脚本不太可能是FastCGI服务器,或者它可以接受任何类型的HTTP请求,因为您提到了通过命令行运行它。(据我所知,FastCGI是一款支持它的应用程序,它必须能够以特定的格式处理来自stdin的请求流,因此肯定涉及到一些管道。)

我认为最简单的方法是使用一些web框架作为HTTP/FastCGI中间件。对于你来说,像这样的“微框架”(甚至我发现文档难以理解)听起来很好用。这样做的想法是让主代码有两个接口,一个可以处理命令行参数,另一个可以处理HTTP请求,最终两者都只调用一个实际执行该工作的函数。(如果要保留应用程序的命令行版本。)

Flask文档还提到或作为部署选项。我对前者不熟悉;我不推荐后者作为一个简单、低流量的应用程序,原因与下一段中的方法相同

考虑到您使用的是VPS,您甚至可以使用作为独立服务器进程运行应用程序,但我不确定这是否是更好的选择,除非您绝对不想使用任何类型的框架。您必须确保应用程序在服务器重新启动时启动,或者在服务器崩溃时重新启动,并且让nginx来完成主管的工作似乎更容易

更新:请注意,nginx似乎不会为您管理FastCGI工作进程,这将是该方法的主要优势。有鉴于此,您使用三种方法中的哪一种并不重要,因为您必须以这种或那种方式设置服务主管。我认为应该使用uWSGI,因为flup(Flask+FastCGI需要)似乎从2011年就被放弃了,而且uWSGI协议显然在nginx中得到了本地支持。否则,您需要使用不同于nginx的web服务器,该服务器将为您管理FastCGI工作程序。如果这是一个选项,我会考虑,它可以使用Web GUI来配置。
tl;dr:您需要编写一个(非常简单的)Web应用程序。虽然在没有任何类型的web框架的情况下实现这一点是可行的,但在我看来,使用一个框架更容易,因为您需要一些(非平凡的)免费安装管道,有很多关于如何部署它们的指南。

@Vitaliy如果问题是如何通过HTTP公开此代码,这怎么可能相关?@Vitaliy我不明白这有什么关系?它甚至不使用数据库;tldr-cgi并不真正推荐用于Python开发,WSGI是现代协议。@JonathanVanasco不是主要用作应用服务器(如paster和gunicorn)之间的抽象接口,在这样的设置中,Apache/nginx反向代理到一组工作进程?在“真正的”Web服务器中直接支持它并不是一件真正的事情。如果OP已经有了一个他知道已经启用并配置了FastCGI的nginx服务器,那么使用它并没有什么问题。(看起来WSGI模块在nginx中不是标准的,因此在他们的构建中可能不可用,看起来很可怕。)WSGI被用作这样的抽象接口,但它也驱动着诸如Flask、Paste、web.py等的设计原则。nginx通过uwsgi服务器提供WSGI支持。使用CGI并没有什么错——它只是一种过时的web脚本编写方法。如果您正在学习如何将python用于web内容,那么学习当前技术比学习人们不真正使用的旧技术更有意义。此外,您还可以获得中间件、本地测试服务器(通过任何框架)的好处,并且不必使用cgi模块。是一个更小的框架;重申我对这个问题的评论:当涉及到Python web开发时,CGI是不推荐的,WSGI是当前推荐的方法。@JonathanVanasco如果你能提供一个关于如何将nginx与WSGI应用程序连接起来的答案,那就更好了。我严重怀疑这只是一个替代品,因为WSGI需要切换到proxy+workers架构,或者向nginx添加第三方模块。我认为FastCGI对于OP范围内的应用来说是完美的,代理+工作者的好处在这里并不适用。你本质上是为了避免CGI而发送OP去刮牦牛的胡子。@JonathanVanasco,就其价值而言,我不认为FastCGI和WSGI是如何相互排斥的技术。FastCGI是一种“在线”协议,允许对多个HTTP请求重用“工作者”Python进程。WSGI i