NGINX Unit

Zope§

要使用 Unit 运行使用 Zope Web 框架构建的应用

  1. 使用 Python 3.6+ 语言模块安装 Unit

  2. 安装 Zope。在此,我们在 /path/to/app/ 处执行此操作;在配置中使用真实路径。

    首先,安装 Zope 的 核心文件,例如

    $ pip install -U pip wheel zc.buildout
    $ cd /path/to/app/
    $ wget https://pypi.ac.cn/packages/source/Z/Zope/Zope-A.B.C.tar.gz
    $ tar xfvz Zope-A.B.C.tar.gz --strip-components=1
    $ buildout
    

    接下来,添加一个名为 /path/to/app/wsgi.cfg 的新配置文件

    [buildout]
    extends =
        buildout.cfg
    
    parts +=
        wsgi.py
    
    [wsgi.py]
    recipe = plone.recipe.zope2instance
    user = admin:admin
    zodb-temporary-storage = off
    eggs =
    scripts =
    initialization =
        from Zope2.Startup.run import make_wsgi_app
        wsgiapp = make_wsgi_app({}, '${buildout:parts-directory}/wsgi.py/etc/zope.conf')
        def application(*args, **kwargs):return wsgiapp(*args, **kwargs)
    

    它创建一个新的 Zope 实例。该部分的名称必须以 .py 结尾,以便将生成的实例脚本识别为 Python 模块;initialization 选项 定义一个 WSGI 入口点。

    重新运行 Buildout,向其提供新的配置文件

    $ buildout -c wsgi.cfg
    
          ...
          Installing wsgi.py.
          Generated script '/path/to/app/bin/wsgi.py'.
    

    这样创建的实例脚本可与 Unit 一起使用。

    运行以下命令,以便 Unit 可以访问 应用程序目录

    # chown -R unit:unit /path/to/app/
    

    注意

    unit:unit 用户组对仅适用于 官方软件包、Docker 映像 和一些 第三方仓库。否则,帐户名称可能不同;运行 ps aux | grep unitd 命令以确保这一点。

    有关更多详细信息,包括权限,请参阅 安全检查清单

    最后,准备 Zope 配置以供 Unit 使用(对 path 使用真实值)

    {
        "listeners": {
            "*:80": {
                "pass": "applications/zope"
            }
        },
    
        "applications": {
            "zope": {
                "type": "python 3",
                "path": "/path/to/app/",
                "module": "bin.wsgi"
            }
        }
    }
    

    创建一个虚拟环境来安装 Zope 的 PIP 包

    $ cd /path/to/app/
    $ python3 --version
          Python 3.Y.Z
    $ python3 -m venv venv
    $ source venv/bin/activate
    $ pip install 'zope[wsgi]'
    $ deactivate
    

    警告

    使用与步骤 1 中语言模块匹配的 Python 版本(本例中为 3.Y)创建虚拟环境。此外,单元配置中的应用程序 类型必须 解析 为类似的匹配版本;单元不会从环境中推断它。

    安装后,创建 Zope 实例

    $ venv/bin/mkwsgiinstance -d instance
    

    要在单元上运行实例,请创建一个 WSGI 入口点

    from pathlib import Path
    from Zope2.Startup.run import make_wsgi_app
    
    wsgiapp = make_wsgi_app({}, str(Path(__file__).parent / 'etc/zope.conf'))
    def application(*args, **kwargs):return wsgiapp(*args, **kwargs)
    

    将脚本另存为实例主目录中的 wsgi.py(此处为 /path/to/app/instance/)。

    运行以下命令,以便 Unit 可以访问 应用程序目录

    # chown -R unit:unit /path/to/app/
    

    注意

    unit:unit 用户组对仅适用于 官方软件包、Docker 映像 和一些 第三方仓库。否则,帐户名称可能不同;运行 ps aux | grep unitd 命令以确保这一点。

    有关更多详细信息,包括权限,请参阅 安全检查清单

    最后,准备 Zope 配置以供单元使用(对 路径主目录使用实际值)

    {
        "listeners": {
            "*:80": {
                "pass": "applications/zope"
            }
        },
    
        "applications": {
            "zope": {
                "type": "python 3.Y",
                "path": "/path/to/app/instance/",
                "home": "/path/to/app/venv/",
                "module": "wsgi"
            }
        }
    }
    
  3. 上传更新后的配置。假设上述 JSON 已添加到 config.json

    # curl -X PUT --data-binary @config.json --unix-socket \
           /path/to/control.unit.sock http://localhost/config/
    

    注意

    控制套接字 路径可能有所不同;运行 unitd -h 或参阅 启动和关闭 了解详情。

    成功更新后,Zope 实例应可在侦听器的 IP 地址和端口上使用

    $ curl http://localhost
    
          <!DOCTYPE html>
          <html>
            <head>
          <base href="http://localhost/" />
    
              <title>Auto-generated default page</title>
              <meta charset="utf-8" />
            </head>
            <body>
    
              <h2>Zope
                  Auto-generated default page</h2>
    
              This is Page Template <em>index_html</em>.
            </body>
          </html>