nginx + uwsgi: -- 请求了不可用的修饰符: 0 --

89

Ubuntu 12.04,nginx 1.2.0,uwsgi 1.0.3。

我使用以下命令启动uwsgi:

uwsgi -s 127.0.0.1:9010 -M -t 30 -A 4 -p 4 -d /var/log/uwsgi.log

每个请求nginx都会回复502,uwsgi会写入日志以下行:

-- unavailable modifier requested: 0 --

在Ubuntu上,uwsgi作为服务启动:service uwsgi start - sorin
6个回答

116

原始答案

对于在Ubuntu 11.10上使用upstartPython 2,请使用apt-get install uwsgi-plugin-python安装uWSGI的Python插件。如果您正在使用ini文件来配置uWSGI应用程序,则在[uwsgi]部分中添加plugins = python即可解决此问题。

编辑:针对Python 3和Ubuntu 17.10进行更新

对于在Ubuntu 17.10上使用systemdPython 3,请使用apt-get install uwsgi-plugin-python3安装uWSGI的Python插件。如果您正在使用ini文件来配置uWSGI应用程序,则在[uwsgi]部分中添加plugins = python3即可解决此问题。

如需进一步了解如何开始使用python/uWSGI应用程序,包括如何使用ini文件进行配置,请参阅这个方便的指南

在CentOS7上,这个(yum插件安装+uwsgi配置更改)的等效方法对我起作用了。 - Mike Howsden
一直在苦苦思索,无法解决这个问题。谢谢! - SuperNova
那Alpine Linux怎么样? - Adam Parkin
请注意,该插件依赖于/usr/lib64/uwsgi中的版本(例如),在我的CentOS机器上,我不得不使用plugins = python36 - Wes Hardaker
4
对于Python 3,我必须执行plugins = python3 - Galen
显示剩余2条评论

29

通过安装 uwsgi-plugin-python3 插件,并将 --plugin python3 选项添加到 uwsgi 启动命令中解决问题


3
请提供更详细的广泛回答,并将问题标记为已解决,使用@SHaKie的答案。 - b1_

15

我正在Ubuntu上使用upstart启动uwsgi。我通过运行apt-get install uwsgi-plugin-python来解决问题,然后在/etc/uwsgi/applications-available中的application.ini文件中添加plugins=python即可。


8
http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html 中得知,为了将请求路由到特定的插件,Web服务器需要向uWSGI实例传递一个称为修饰符的神奇数字。默认情况下,此数字设置为0,映射到Python。
我在bash脚本中使用9并且它可以工作。这个页面上有数字及其含义: http://uwsgi-docs.readthedocs.org/en/latest/Protocol.html 在我的nginx配置文件中:
location ~ .cgi$ {
    include uwsgi_params;
    uwsgi_modifier1 9;
    uwsgi_pass 127.0.0.1:3031;
}

7

通过添加插件行修改您的ini文件。

    [uwsgi]
    plugins         = python3

2

我正在使用Ubuntu 18.04和Python 3。以下是我用于使其工作的确切配置。

您必须安装Python 3 uWSGI插件:

apt install uwsgi-plugin-python3

您的Nginx站点配置应该指向您的uWSGI套接字。确保端口与后续步骤中的配置匹配。

    location / {
        uwsgi_pass 127.0.0.1:9090;
        include uwsgi_params;
    }

重新加载Nginx配置以反映您刚刚所做的更改:
systemctl reload nginx

您可以使用命令行参数或ini文件进行配置。我创建了uwsgi.ini文件。请确保套接字地址与您的nginx配置匹配。

[uwsgi]
socket = 127.0.0.1:9090
chdir = /var/www
processes = 4
threads = 2
plugins = python3
wsgi-file = /var/www/app.py

我的 app.py 只有一个基本示例:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/plain')])
    return [b"Hello World!"]

现在从命令行启动uWSGI服务器:

uwsgi uwsgi.ini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接