gunicorn 编译 python 来源

gunicorn with compiled python source

我已经在 centOS 7 上用 PyInstaller 编译了我的 python 文件,包括 gunicorn。我正在尝试 运行 在另一台 centOS 7 机器上 运行 这些可执行文件,但我得到 ModuleNotFoundError: No module named 'manage' 但是我的模块 manage 以可执行形式存在于同一目录中。这是完整的命令及其输出。

./gunicorn -c /opt/myproject/configuration/gunicorn_conf.ini --bind unix:/etc/myproject/myproject.sock -m 007 manage:app --preload

!!!
!!! WARNING: configuration file should have a valid Python extension.
!!!

Traceback (most recent call last):
  File "gunicorn", line 8, in <module>
  File "site-packages/gunicorn/app/wsgiapp.py", line 58, in run
  File "site-packages/gunicorn/app/base.py", line 228, in run
  File "site-packages/gunicorn/app/base.py", line 72, in run
  File "site-packages/gunicorn/arbiter.py", line 58, in __init__
  File "site-packages/gunicorn/arbiter.py", line 118, in setup
  File "site-packages/gunicorn/app/base.py", line 67, in wsgi
  File "site-packages/gunicorn/app/wsgiapp.py", line 49, in load
  File "site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
  File "site-packages/gunicorn/util.py", line 358, in import_app
  File "importlib/__init__.py", line 127, in import_module
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'manage'
[20316] Failed to execute script gunicorn

我是不是漏掉了什么?或 gunicorn 不适用于已编译的文件?如果没有,那么除了使用源代码之外还有其他选择吗?

我有一个类似的问题,gunicorn.glogger 的导入失败。我通过明确地将导入添加到模块的顶部来解决它。

from gunicorn import glogger

我正在使用 gunicorn 20.0.4,但没有看到名为 manage 的模块。这可能是另一个库的依赖项吗?

另一个可能的修复

隐藏导入在 pyinstaller docs 中指定,您可以在构建命令中使用开关 --hidden-import 以在二进制文件中包含隐式使用的库。如果您有多个导入,您可以使用 : 来分隔列表。

调用 GUnicorn

Green unicorn 专为从命令行启动而构建。这在 docker 容器内或通过主机上的 运行 命令很容易做到。不幸的是,使用 pyinstaller 时情况并非如此,因为您需要一个“python”入口点。我必须从 gunicorn docs (copy/paste) 构建自定义应用程序以允许我的应用程序作为脚本启动。从这里我可以告诉 pyinstaller 使用这个脚本在 if __name__ == '__main__':

下启动服务器

参见下面的示例。

错误

即使是使用所需依赖项构建的二进制文件,我 运行 遇到了一个问题,即 Web 应用程序在 运行dom 请求数后会停止响应。我没有进一步调查,因为它把我推向了构建 RPM 以便于安装的另一个方向。

2021 年 2 月 4 日更新

正在为 GUnicorn 设置参数。

import gunicorn.app.base


class StandaloneApplication(gunicorn.app.base.BaseApplication):

    def __init__(self, app, options=None):
        self.options = options or {}
        self.application = app
        super().__init__()

    def load_config(self):
        config = {key: value for key, value in self.options.items()
                  if key in self.cfg.settings and value is not None}
        for key, value in config.items():
            self.cfg.set(key.lower(), value)

    def load(self):
        return self.application


if __name__ == '__main__':
    options = {
        'bind': 'unix:/etc/myproject/myproject.sock',
        'preload': True,
        'config': '/opt/myproject/configuration/gunicorn_conf.ini',
        'umask': '007',
        '<argument name>': '<argument value>',
    }
    StandaloneApplication(<your flask application object or factory>, options).run()

尚未测试此特定设置,但我使用的是非常相似的设置。 CLI 中的每个 GUnicorn switch/option 直接映射到 python 变量,你可以找到 here。这些选项在我们的 options 字典中设置,服务器将接受这些选项作为 StandaloneApplication 构造函数中的第二个参数。您需要将 app 对象作为 manage 模块的第一个参数或应用程序工厂函数传入。

我确实建议查看 python configuration files。您还可以将它们导出为环境变量并使用 os.getenv("<env name>") 来访问它们。它只是防止服务器使用其他用户必须在源中更改的硬编码值。