如何在与PHP / Apache网站相同的服务器上运行Flask应用程序?

时间:2019-12-20 17:56:51

标签: apache flask gunicorn

找不到具有此特定设置的问题,因此在我的情况下无法使其他一些答案起作用。

我有一台CentOS服务器,该服务器运行一个基于PHP的网站,并将Apache作为Web服务器(工作正常)。我现在正尝试在另一个端口上部署基于Flask的应用程序(使用通过Apache代理的Gunicorn)。

在我的主要httpd.conf文件中,我有:

<IfModule proxy_module>
# Include the proxy information for VMS Flask Application
Include conf/extra/httpd-foo.conf
</IfModule>

在我的httpd-foo.conf文件中,我有:

ProxyPreserveHost On
ProxyPass /foo http://localhost:8000/
ProxyPassReverse /foo http://localhost:8000/
Timeout 2400
ProxyTimeout 240

PHP网站的运行位置:https://myphpwebsite.com 我希望Flask应用在以下位置运行:https://myphpwebsite.com/foo

我遇到的问题是当我访问Flask URL时,是否遇到了2个问题。首先,如果我在“ foo”之后不添加斜杠,则会得到404(因为该目录实际上不在实际的Web目录中。第二个问题是,我所有的Flask路由都假设“ /”为“ root”,现在还不是。我不知道如何告诉Flask,所有路由都应在它们之前添加“ / foo”。

这可能吗?

-一些其他信息-

我尝试运行带有“ -E”选项的gunicorn命令来告诉它SCRIPT_NAME似乎仅对主页有帮助:

gunicorn app:app -b 0.0.0.0:8000 -t 180 -e SCRIPT_NAME=/foo -w 4

当前,如果我访问https://myphpwebsite.com/foo/,则会导致500 Internal Server Error。我可以看到我的“未登录”重定向似乎可以正常工作,并将我带到https://myphpwebsite.com/foo/login,但是再次导致500错误。

1 个答案:

答案 0 :(得分:0)

我有相同的设置(apache,php,gunicorn,flask),最适合我的是使用VirtualHost并将ProxyPass嵌入到Location指令中。所以我的配置文件看起来像

<VirtualHost *:80>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPreserveHost On
    <Location "/foo">
          ProxyPass "http://127.0.0.1:8000/"
          ProxyPassReverse "http://127.0.0.1:8000/"
    </Location>
</VirtualHost>

这样,对https://mydomein.com/的调用由Apache管理(始终管理php als),并且对https://mydomein.com/foo的所有请求都被委派给GUnicorn(侦听端口8000)。