Apache Web服务器和Flask应用程序

6
我正在运行Ubuntu 14.04上的apache2 Web服务器。 默认情况下,当我在http://localhost上启动apache Web服务器时,会看到从/var/www/html/index.html文件启动的“Apache2 Ubuntu默认页面”。
我在/home/ubuntu/myprojects/位置有一个Flask应用程序。该Flask应用程序在virtualenv上运行,并具有呈现HTML文件的正确文件夹结构。 以下是文件夹结构: /home/ubuntu/myprojects/hello/hello.py(呈现HTML的Flask应用程序) /home/ubuntu/myprojects/hello/templates/hello.html
Flask应用程序代码如下:
from flask import Flask
from flask import render_template
from flask import request

app = Flask(__name__)

@app.route('/')
def my_form():
        return render_template("hello.html")

if __name__ == '__main__':
        app.debug = True
        app.run(host='0.0.0.0')

当我运行http://localhost:5000时,将呈现hello.html。 当调用http://localhost时,我想要从hello.py flask应用程序呈现hello.html,而不需要指定任何端口号。 为了实现这一点,我添加了以下代码:

app.run(host='0.0.0.0', port=80)

但是,当我运行 Flask 应用时,它会出现错误并退出:

 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
Traceback (most recent call last):
  File "hello.py", line 21, in <module>
    app.run(host='0.0.0.0', port=80)
  File "/home/ubuntu/myproject/venv/local/lib/python2.7/site-packages/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File "/home/ubuntu/myproject/venv/local/lib/python2.7/site-packages/werkzeug/serving.py", line 618, in run_simple
    test_socket.bind((hostname, port))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 13] Permission denied

我不知道我做错了什么。在http://localhost上,来自/var/www/html/的index.html正在呈现。


除此之外,当我使用mod_wsgi时,我添加了下面的代码 添加application.wsgi

import os, sys, logging
logging.basicConfig(stream=sys.stderr)

PROJECT_DIR = '/home/ubuntu/myproject/hello'

activate_this = os.path.join(PROJECT_DIR, 'bin', 'activate_this.py')
execfile(activate_this, dict(__file__=activate_this))
sys.path.append(PROJECT_DIR)

from hello import app as application

/etc/apache2/sites-available/000-default.conf文件中,我添加了如下内容:
<VirtualHost *:80>
        WSGIDaemonProcess FunRoute user=ubuntu group=root threads=5
        WSGIScriptAlias / /home/ubuntu/myproject/FunRoute/application.wsgi

        <Directory /home/ubuntu/myproject/FunRoute/>
                WSGIProcessGroup FunRoute
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
        </Directory>
</VirtualHost>

我将hello.py文件改回了原始状态:

app.run(host='0.0.0.0')

但是当我尝试启动http://localhost时,却收到了403 Forbidden错误。

Forbidden

You don't have permission to access / on this server.

Apache/2.4.7 (Ubuntu) Server at 52.8.217.39 Port 80
2个回答

5

我花了一点时间在谷歌上查找,最终解决了问题。

Apache 2.4及以上版本增加了额外的安全措施,语法发生了变化:

在Apache 2.2中,如果我们想允许访问一个文件夹(例如网站文件),我们需要使用以下选项:

  <Directory /path/to/site/files>
    Order deny,allow
    Allow from all
  </Directory>

但是在Apache 2.4的情况下,我们需要提供以下选项:

<Directory /path/to/site/files>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

这让我获得了访问权限,403禁止错误也得到了解决。使用mod_wsgi帮助我创建了一个Flask应用程序,现在可以通过http://localhost访问它,而不是http://localhost:5000

2
启动 Flask 在 80 端口需要 root 权限,但在这种情况下也不会适用,因为 Apache 已经在该端口运行了,并且您通常不能让两个无关的进程监听同一端口。我假设您想要做到这一点是为了进行一般的测试/开发,其中一种方法是利用反向 HTTP 代理,这样当代码发生变化时就不必一直担心重新启动 Apache。我建议在一个不是 5000 的特定端口上启动应用程序;尝试使用 8000。
app.run(host='0.0.0.0', port=8000)

在您的默认站点配置(应该是/etc/apache2/sites-available/default)中,您可以编辑它以包括以下内容:
    <Location />
        ProxyPass http://localhost:8000
        ProxyPassReverse  http://localhost:8000
    </Location>

这将接管您默认站点的根目录。如果不希望这样做,您需要定义一个单独的虚拟主机(最好在一个单独的文件中),然后调用 a2ensite 。此外,为了使上述配置生效,您还需要调用 a2enmod proxy_http。这两个命令都需要 root 权限。
对于生产使用,您可能想要使用类似于 mod_wsgi 的东西,您可以检查侧边栏中相关问题的列表以帮助您入门。

嗨@metatoaster,我尝试使用mod_wsgi实现,但仍然存在权限问题。我已经编辑了我的问题并添加了mod_wsgi。 - Rookie
检查/var/log/apache2/error.log,看看是什么导致了这个403错误。 - metatoaster
错误日志文件显示:AH01630: client denied by server configuration: /home/ubuntu/myproject/hello/application.wsgi - Rookie
嗨@metatoaster,我使用mod_wsgi以及在Apache2 2.4配置文件中进行了一些调整来允许访问站点文件,已经成功解决了问题。谢谢。 - Rookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接