如何正确配置Python Flask应用程序以由Apache提供服务?

nfg76nw0  于 2022-12-14  发布在  Apache
关注(0)|答案(1)|浏览(246)

我一直在努力解决这个问题,但我就是不能让它工作。
基本上,我想使用mod_wsgi和apache来服务我的Python Flask应用程序,我错过了什么?
这是我得到的,一个python flask 应用程序(flask_restful),带有一个main.py,如下所示:

from app import create_app

application = create_app()

application.run(debug=True)

它叫我的app.py

def create_app() -> Flask:

    errors = WWAPIErrors()
    errors.add_error(GeneralException, 400)

    app = Flask("namehere")
    api = WWAPI(error_list=errors, app=app)

    # APIS
    api.add_resource(endpointResouceClass, '/endpoint')

    return app

这一切都运行在本地正确,我有一个VPS设置与其他网站运行完美,但没有python flask 应用程序。
所以我做了以下工作:

sudo apt-get install libapache2-mod-wsgi-py3
sudo apt-get install apache2-dev
sudo apt-get install python3-dev

cd /var/www/appDirectory
python3 -m venv venv
source venv/bin/activate
pip install mod_wsgi
pip install -r requirements.txt

我的website.conf文件在/etc/apache 2/sites-available目录中是:

<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin email@email.com
        WSGIScriptAlias / /var/www/appDirectory/app/api/main.py
        DocumentRoot /var/www/appDirectory/app/api
        <Directory /var/www/appDirectory/app/api/main.py>
            Require all granted
        </Directory>

        WSGIDaemonProcess localhost python-path=/var/www/appDirectory/venv/lib/python3.10/site-packages/ user=www-data
        Alias /api /var/www/appDirectory/app/api

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

然后设置mod_wsgi配置文件:

sudo a2enmod wsgi

mod_wsgi-express module-config
LoadModule wsgi_module "/home/user/appDirectory/venv/lib/python3.10/site-packages/mod_wsgi/server/mod_wsgi-py310.cpython-310-x86_64-linux-gnu.so"
WSGIPythonHome "/home/user/appDirectory/venv"

并将其放在我/etc/apache 2/mods-enabled/wsgi.load文件中。
接下来,我启用了我的网站:

cd /etc/apache2/sites-available
sudo a2ensite mysitename.conf

我的项目的目录加载时,我去我的应用程序的基本URL,因为我没有index.html或任何东西在site.com/根目录.但当我去我的实现网站的URL,这是site.com/endpoint,我只是得到一个404,我甚至试图让它在我的VPS本地,没有运气.

wget localhost:80/endpoint
--2022-12-08 21:07:15--  http://localhost/endpoint
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2022-12-08 21:07:15 ERROR 404: Not Found.

我知道/希望我只是错过了一些愚蠢的,任何帮助将不胜感激。
系统详细信息:

neofetch
            .-/+oossssoo+/-.               
        `:+ssssssssssssssssss+:`           ------------- 
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 22.04.1 LTS x86_64 
    .ossssssssssssssssssdMMMNysssso.       Host: VMware Virtual Platform None 
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Kernel: 5.15.0-52-generic 
  +ssssssssshmydMMMMMMMNddddyssssssss+     Uptime: 47 days, 10 hours, 49 mins 
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Packages: 1392 (dpkg), 7 (snap) 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Shell: bash 5.1.16 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Resolution: 1024x768 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Terminal: /dev/pts/0 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: Intel Xeon E5-2683 v3 (2) @ 1.997GHz 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   GPU: 00:0f.0 VMware SVGA II Adapter 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Memory: 987MiB / 1941MiB 
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
  +sssssssssdmydMMMMMMMMddddyssssssss+                             
   /ssssssssssshdmNNNNmyNMMMMhssssss/                              
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.
23c0lvtd

23c0lvtd1#

我总算找到了我的问题所在:
显然wsgi不能直接使用main.py文件,我需要在项目目录的根目录下包含一个app.wsgi文件,其内容如下:

import sys

sys.path.insert(0, '/var/www/appDirectory/app/api')

from main import application

除此之外,我还需要编辑我的main.py文件,删除application.run()行,因为wsgi本身会处理它。所以我的main.py文件现在看起来像这样:

from app import create_app

application = create_app()

现在,当我运行应用程序时,我不再得到404,而是得到正确的响应,代码为200。
希望这在某个阶段对其他人有所帮助,因为我确实认为关于mod_wsgi和wsgi的信息在网上确实缺乏和冲突。

相关问题