使用 mod_wsgi 在 Jelastic PaaS 环境中使用 FastAPI 运行 ASGI 应用程序

Run ASGI Application with FastAPI inside a Jelastic PaaS Environment using mod_wsgi

提问人:madx 提问时间:10/13/2023 最后编辑:madx 更新时间:10/15/2023 访问量:87

问:

我想在我的 python 项目中使用,我想将其部署在 Jelastic PaaS 上。 显然只管理WSGI应用程序,所以我试图像这样在WSGI应用程序中运行ASGI应用程序,这是我的:FastAPImod_wsgia2wsgiwsgi.py

import os, sys

virtenv = os.path.expanduser('~') + '/virtenv/'
virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
try:
    if sys.version.split(' ')[0].split('.')[0] == '3':
        exec(compile(open(virtualenv, "rb").read(), virtualenv, 'exec'), dict(__file__=virtualenv))
    else:
        execfile(virtualenv, dict(__file__=virtualenv))
except IOError:
    pass

sys.path.append(os.path.expanduser('~'))
sys.path.append(os.path.expanduser('~') + '/ROOT/')


from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


from a2wsgi import ASGIMiddleware
application = ASGIMiddleware(app)

这些行已经为我的特定执行:virtenv

virtualenv virtenv
source virtenv/bin/activate
pip install a2wsgi
pip install fastapi
deactivate

但它仍然无法正常工作。可能我错过了一些大东西。 这个错误似乎没有“说话”(但我不是python人):

mod_wsgi (pid=14438): Failed to exec Python script file '/var/www/webroot/ROOT/wsgi.py'.
mod_wsgi (pid=14438): Exception occurred processing WSGI script '/var/www/webroot/ROOT/wsgi.py'.
Traceback (most recent call last):
File "/var/www/webroot/ROOT/wsgi.py", line 24, in <module>
from fastapi import FastAPI
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/__init__.py", line 7, in <module>
from .applications import FastAPI as FastAPI
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/applications.py", line 16, in <module>
from fastapi import routing
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/routing.py", line 22, in <module>
from fastapi import params
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/params.py", line 5, in <module>
from fastapi.openapi.models import Example
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/openapi/models.py", line 4, in <module>
from fastapi._compat import (
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/_compat.py", line 20, in <module>
from fastapi.exceptions import RequestErrorModel
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/exceptions.py", line 3, in <module>
from pydantic import BaseModel, create_model
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/__init__.py", line 12, in <module>
from . import dataclasses
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/dataclasses.py", line 11, in <module>
from ._internal import _config, _decorators, _typing_extra
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py", line 15, in <module>
from ..fields import ComputedFieldInfo
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/fields.py", line 19, in <module>
import annotated_types
File "/var/www/webroot/virtenv/lib/python3.12/site-packages/annotated_types/__init__.py", line 361, in <module>
IsNotFinite = Annotated[_NumericType, Predicate(Not(math.isfinite))]
^^^^^^^^^^^^^^^^^^
TypeError: Not() takes no arguments

完整背景:

APACHE_VERSION=2.4.57
DOCKER_EXPOSED_PORT=21,22,25,443,7979,80
MOD_WSGI_VERSION=4.9.4
OWASP_MODSECURITY_CRS_VERSION=3.3.2
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PYTHON_VERSION=3.12.0
STACK_VERSION=2.4.57
VERSION=3.12.0
WEBROOT=/var/www/webroot
WSGI_SCRIPT=/var/www/webroot/ROOT/wsgi.py
python mod-wsgi wsgi jelastic asgi

评论

0赞 Damien - Layershift 10/13/2023
当您在本地运行此代码时,它是否成功执行?该错误表明编码错误Not(math.isfinite)
0赞 madx 10/13/2023
此时此刻,我无法在本地重现完全相同的环境。我能说的是,在本地运行命令,它运行正确。gunicorn wsgi:application
0赞 madx 10/14/2023
我设法在 jelastic 的 docker 容器下运行相同的内容,但是如果我设法在 jelastic-python 环境中运行它,那么轻松配置 CI/CD 会更好。
1赞 madx 10/15/2023
@Damien-Layershift 我终于找到了它,python 版本给该库带来了问题。我将在下面发布完整的解决方案。

答:

1赞 madx 10/15/2023 #1

我找到了一个简单的解决方案。
我降级了 jelastic 容器:
apachepython

  • 2.4.57-python-3.12.0
  • 至 或2.4.57-python-3.9.182.4.57-python-3.11.6

它奏效了。

您可以按照我在 github 上的这个公共存储库中编写的步骤在您自己的 Jelastic 环境中测试它:danielemaddaluno/pyjel