簡體   English   中英

Apache Web服務器和Flask應用

[英]Apache webserver and Flask app

我有在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的燒瓶應用程序)/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

經過一點點谷歌搜索后,我解決了。

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

要在端口80上啟動flask需要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 <filename> 同樣, a2enmod proxy_http上述配置a2enmod proxy_http ,您還需要調用a2enmod proxy_http 這兩個命令都需要root特權。

對於生產用途,您可能想要使用mod_wsgi東西,可以在側欄上查看相關問題的列表以幫助您入門。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM