使用 mod_wsgi 在 Apache 上部署 Flask API
Deploy Flask API on Apache, with mod_wsgi
此时我已经学习了几个教程并且知道这一定是一些小问题。请帮我找到它!
我有一个使用 Flask-Restx 的 Flask API,准备就绪,还有一个带有 Apache 的远程 Debian VPS。我没有使用虚拟环境。
我的项目位于 /var/www/ProvisioningApi/ 并包含..
- __init__.py (blank)
- setup.py
- setup.wsgi
- ProvisioningApi/
--- __pycache__
--- api/
------ __init__.py # not blank
------ auth/ # this holds the file with the auth endpoints
------ provision/ # more endpoints
setup.wsgi
#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/ProvisioningApp/")
from setup import app as application
application.secret_key = "nosecretshere"
setup.py
from ProvisioningApi.api import create_app
app = create_app()
if __name__ == "__main__":
app.run()
/api/__init__.py
# root init file
from flask import Flask
from flask_restx import Api
from flask_jwt_extended import JWTManager
from werkzeug.middleware.proxy_fix import ProxyFix
# Import the API views
from .auth.auth import auth
from .provision.provision import prov
# Import configuration settings
from .config.config import config_dict
def create_app(config=config_dict['prod']):
app=Flask(__name__)
app.config.from_object(config)
# Instantiate RestX and add the Namespaces
api = Api(app,
version='1.0',
title='Provisioning API',
description='My provisioning endpoints')
api.add_namespace(auth, path='/auth')
api.add_namespace(prov, path='/provision')
jwt = JWTManager(app)
app.wsgi_app = ProxyFix(app.wsgi_app)
return app
虚拟主机位于 /etc/apache2/sites-available/ProvisioningApi.conf
/etc/apache2/sites-available/ProvisioningApi.conf
<VirtualHost *:80>
ServerName <the IP address for the server>
ServerAdmin <my email address>
WSGIScriptAlias / /var/www/ProvisioningApi/setup.wsgi
<Directory /var/www/ProvisioningApi/ProvisioningApi/>
Order allow,deny
Allow from all
</Directory>
Alias /api /var/www/ProvisioningApi/ProvisioningApi/api
<Directory /var/www/ProvisioningApi/ProvisioningApi/api/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
错误日志如下:
File "/var/www/ProvisioningApi/setup.wsgi", line 7, in <module>
from setup import app as application
ModuleNotFoundError: No module named 'setup'
转到 IP 地址,我看到内部服务器错误。如果我去 IP_address/api 我会看到我的文件索引。
我调整了文件的嵌套,added/removed 初始化文件,一次又一次地重新启动 Apache,错误总是与 setup.py
文件中的导入有关。
提前致谢!
这可能只是路径中的错字。你加
sys.path.insert(0, "/var/www/ProvisioningApp/")
但是你的目录最后是“...Api/”,而不是“...App/”
过去的自己,你会得到这个!
我尝试了一百种不同的方法(包括修复 Razenstein 指出的拼写错误),最终是调整我的文件。我删除了 /api/ 文件夹并将内容上移了一层。没有对 __init__.py
.
中的导入进行编辑
setup.wsgi
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/ProvisioningApi")
from ProvisioningApi import create_app
application = create_app()
不相关,但很重要:如果您在 header 中为受保护端点传递访问令牌,则需要将 WSGIPassAuthorization On
添加到 VirtualHost 文件中。
此时我已经学习了几个教程并且知道这一定是一些小问题。请帮我找到它!
我有一个使用 Flask-Restx 的 Flask API,准备就绪,还有一个带有 Apache 的远程 Debian VPS。我没有使用虚拟环境。
我的项目位于 /var/www/ProvisioningApi/ 并包含..
- __init__.py (blank)
- setup.py
- setup.wsgi
- ProvisioningApi/
--- __pycache__
--- api/
------ __init__.py # not blank
------ auth/ # this holds the file with the auth endpoints
------ provision/ # more endpoints
setup.wsgi
#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/ProvisioningApp/")
from setup import app as application
application.secret_key = "nosecretshere"
setup.py
from ProvisioningApi.api import create_app
app = create_app()
if __name__ == "__main__":
app.run()
/api/__init__.py
# root init file
from flask import Flask
from flask_restx import Api
from flask_jwt_extended import JWTManager
from werkzeug.middleware.proxy_fix import ProxyFix
# Import the API views
from .auth.auth import auth
from .provision.provision import prov
# Import configuration settings
from .config.config import config_dict
def create_app(config=config_dict['prod']):
app=Flask(__name__)
app.config.from_object(config)
# Instantiate RestX and add the Namespaces
api = Api(app,
version='1.0',
title='Provisioning API',
description='My provisioning endpoints')
api.add_namespace(auth, path='/auth')
api.add_namespace(prov, path='/provision')
jwt = JWTManager(app)
app.wsgi_app = ProxyFix(app.wsgi_app)
return app
虚拟主机位于 /etc/apache2/sites-available/ProvisioningApi.conf
/etc/apache2/sites-available/ProvisioningApi.conf
<VirtualHost *:80>
ServerName <the IP address for the server>
ServerAdmin <my email address>
WSGIScriptAlias / /var/www/ProvisioningApi/setup.wsgi
<Directory /var/www/ProvisioningApi/ProvisioningApi/>
Order allow,deny
Allow from all
</Directory>
Alias /api /var/www/ProvisioningApi/ProvisioningApi/api
<Directory /var/www/ProvisioningApi/ProvisioningApi/api/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
错误日志如下:
File "/var/www/ProvisioningApi/setup.wsgi", line 7, in <module>
from setup import app as application
ModuleNotFoundError: No module named 'setup'
转到 IP 地址,我看到内部服务器错误。如果我去 IP_address/api 我会看到我的文件索引。
我调整了文件的嵌套,added/removed 初始化文件,一次又一次地重新启动 Apache,错误总是与 setup.py
文件中的导入有关。
提前致谢!
这可能只是路径中的错字。你加
sys.path.insert(0, "/var/www/ProvisioningApp/")
但是你的目录最后是“...Api/”,而不是“...App/”
过去的自己,你会得到这个!
我尝试了一百种不同的方法(包括修复 Razenstein 指出的拼写错误),最终是调整我的文件。我删除了 /api/ 文件夹并将内容上移了一层。没有对 __init__.py
.
setup.wsgi
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/ProvisioningApi")
from ProvisioningApi import create_app
application = create_app()
不相关,但很重要:如果您在 header 中为受保护端点传递访问令牌,则需要将 WSGIPassAuthorization On
添加到 VirtualHost 文件中。