【问题标题】:Serving Pyramid App with UWSGI and NGINX使用 UWSGI 和 NGINX 服务 Pyramid 应用程序
【发布时间】:2015-11-02 05:20:43
【问题描述】:

我是 NGINX、uWSGI 和 Pyramid 的新手,我正在尝试使用 nginx 作为反向代理通过 uWSGI 为 Pyramid 应用程序提供服务。我现在真的很困惑,希望有人可以就如何解决这个问题提出一些建议。如果你能解释一下可能发生的事情,那也会很有帮助,因为我的理解非常有限!

目前,当我访问反向代理 URL 时,我从 uWSGI 收到“内部服务器错误”。在 uWSGI 错误日志中,我收到错误消息:

--- no python application found, check your startup logs for errors ---

当我单独通过 uWSGI 服务并使用 pserve 启动时,应用程序运行良好。我可以按如下方式从我的虚拟信封中启动它:

bin/pserve my-app/uwsgi.ini

但是当我启动 nginx 并访问代理地址时,我得到了内部服务器错误。

我在uwsgi.ini中的设置如下:

[app:main]
use = egg:myapp
pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
pyramid_debugtoolbar
[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

[loggers]
keys = root, musiccircle

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = ERROR
handlers = console
[logger_musiccircle]
level = ERROR
handlers =
qualname = musiccircle

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s

[uwsgi]
socket = unix://home/usr/env/myapp/myapp.sock
master = true

processes = 48
cpu-affinity = 12

harakiri = 60
post-buffering = 8192
buffer-size = 65535

daemonize = ./uwsgi.log
pidfile = ./pid_5000.pid

listen = 32767

reload-on-as = 512
reload-on-rss = 192
limit-as = 1024
no-orphans = true
reload-mercy = 8
log-slow = true

virtualenv = /home/usr/env

在 nginx 对应的 myapp.conf 文件中,我有以下内容:

upstream myapp {
    server 127.0.0.1:6543;
}

server {
    listen          8080;
    server_name myapp.local www.myapp.local;
    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/usr/env/myapp;
    }
    access_log      /var/log/nginx/access.log;
    error_log       /var/log/nginx/error.log;

    charset         utf-8;
    location / {
        include         uwsgi_params;
        uwsgi_pass      unix://home/usr/env/myapp/myapp.sock;
    }
}

如果您需要查看其他内容,请告诉我。如您所见,Nginx 配置为在端口 8080 上提供服务(它确实如此),而 Pyramid 应用程序由 uWSGI 提供给端口 6543(它确实如此)。

提前致谢。

【问题讨论】:

  • 据我所知,您的配置文件适用于 Pyramid pserve 而不是 uwsgi
  • 在您的 nginx.conf 中,尝试将服务器 127.0.0.1:6543 更改为服务器 0.0.0.0:6543
  • 在你的 Nginx 文件中 uwsgi_pass 指令应该是 uwsgi_pass unix:///home/usr/env/myapp/myapp.sock; (3 个斜线)。在您的 uwsgi.ini 文件中,将这些行注释掉,使用 = egg:waitress#main,host = 0.0.0.0,port = 6543。在您的 [uwsgi] 部分中,您不必在指定套接字路径时添加 unix:// .为我做的另一件事是为套接字添加适当的权限。这是我的 wsgi 部分 pastebin.com/PB89jGMM 的配置。我从 env/bin/uwsgi --ini-paste uwsgi.ini 开始
  • Mikko Ohtamaa,你说得对……我是通过 paste/pserve 和女服务员来服务我的应用程序,而不是预期的 uwsgi。因此我决定,为什么不直接修改我的 nginx 配置,继续为服务员服务呢?这就是我所做的,克鲁克西,谢谢,你是对的,我需要修改我的 .ini 文件,以便 2 个主机 IP 匹配。它现在正在使用女服务员 + nginx 配置,尽管我在 Chrome 中访问该站点时遇到问题(尽管这是另一个问题!)。 webjunkie,谢谢你的建议,我也会试试这个选项。
  • 是的,我认为可以运行 Nginx + pserve,尽管大多数人似乎更喜欢 uwsgi。

标签: nginx pyramid reverse-proxy uwsgi


【解决方案1】:

似乎 Pyramid 项目打算安装 (setup.py),然后使用带有pserve.ini 配置文件运行。 Pserve 然后在运行时将这些配置文件详细信息作为**settings 传递给您的 Pyramid 应用程序。

这与 Flask 不同,后者 未安装 并且通常具有 no 配置文件。这样的 Flask 应用程序可以根据需要由 uWSGI 运行,所有运行时配置都由 uWSGI 或环境变量处理。

由于 Pyramid 通常在运行时需要一个配置文件,并且在使用配置文件时依赖 pserve 来提供它们(即production.ini),我认为你必须运行uwsgi --ini-paste production.ini(或者如果使用 Pypy 运行, uwsgi --pypy-paste production.ini)(感谢@Sorrel)

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2016-01-19
    • 2014-06-04
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2014-03-08
    相关资源
    最近更新 更多