2013-12-09 81 views
0

我已經完成了一個簡單的Flask應用程序,該應用程序試圖在帶有Apache2的AWS EC2實例上託管。我一直在關注this tutorial在EC2上部署Flask應用程序以進行本地主機訪問

只有我的開發過程(其中應用程序,當我運行它,然後嘗試通過本地主機訪問它運行完全正常)所做的更改是:

1) Moved all the code in to /var/www 
2) Changed it so that 
     if __name__=='__main__': 
      app.run(debug = False) #Now False instead of True 
3) Added a app.wsgi file 
4) Added file my_app to /etc/apache2/sites-available 
5) Ran these commands: 
    $ sudo a2dissite default 
    $ sudo a2ensite sitename.com 
    $ sudo /etc/init.d/apache2 restart 

這裏是應用程序。 WSGI文件:

import sys 
sys.path.insert(0, '/var/www/my_app') 

from app import app as application 

這裏是/etc/apache2/sites-available的程序my_app文件:

<VirtualHost *:5000> 
     WSGIDaemonProcess app 
    WSGIScriptAlias//var/www/my_app/app.wsgi 

    <Directory /var/www/my_app> 
      WSGIProcessGroup app 
     WSGIApplicationGroup %{GLOBAL} 
     Order deny,allow 
     Allow from 127.0.0.1 
    </Directory> 
</VirtualHost> 

正如你從上面的文件中看到的,我只想在本地主機上使用容器應用程序。

當我運行apache並嘗試訪問網站my_site.com:5000時,出現「無法連接錯誤」。我無法弄清楚爲什麼。任何幫助,將不勝感激。

而且,這裏是我的瓶應用程序本身的目錄結構,如果這是需要的:

/var/www/my_app/ 
    app/ 
     __init__.py 
     static/ 
      css/ 
       bootstrap.css 
      favicon.ico 
      js/ 
       bootstrap.js 
     templates/ 
      base.html 
      index.html 
      search.html 
     views.py 
    app.wsgi 
    flask/   #my virtualenv 
     #Your typical virutalenv structure 
    flask_util_js.py #File that is a FLask entension for client-side generation of URLs 
    requirements.txt 
    run.py 
    virtualenv.py #Creates virutalenv flask 

UPDATE:

所以,我的感覺是,我有辦法我代碼設置是有問題的。所以我把run.py__init__.pyviews.py中的所有東西都拿了下來,並做了一個大的main.py。我已經更新了我app.wsgi看起來像這樣:

app.wsgi

import sys 

activate_this = '/home/achumbley/flask/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this)) 

sys.path.insert(0, '/home/achumbley/new_flask_app') 

from main import app as application 

而現在,我/etc/apache2/sites-available/new_flask_app樣子:

<VirtualHost *> 
    ServerName dev.east.appliedminds.com 

    WSGIDaemonProcess app 
    WSGIScriptAlias//var/www/app.wsgi 

<Directory /home/achumbley/new_flask_app> 
    WSGIProcessGroup main 
    WSGIScriptReloading On 
    WSGIApplicationGroup %{GLOBAL} 
    Order deny,allow 
    Allow from all 
</Directory> 

最後,他是我的最新目錄結構:

/home/my_username/new_flask_app/ 
    logging.log 
    flask_util_js.py 
    main.py 
    static/ 
    templates/ 

它仍然不起作用。但是,我可能不知道如何運行整個事情。我應該運行一個python main.py對不對?它應該是自動的,至少這是我所設想的。

回答

2

感動了所有的代碼到/ var/WWW

這是不對的。您需要將您的代碼發佈到非Web可訪問的目錄中。只發布您的靜態文件到/var/www

請參閱official deployment guide關於如何使用Apache和mod_wsgi進行設置。如果遇到問題,可以考慮安裝了flask,nginx和uwsgi的this AMI image

nginx + uwsgi棧也是detailed in the documentation

以下是具體步驟(簡體),您需要遵循:

假設您的應用程序是:

my_app/ 
    static/ 
     logo.gif 
     style.css 
    templates/ 
     index.html 
    main.py 

然後按照下列指示:

  1. 上傳所有的代碼到/home/youruser/
  2. app.wsgi文件上傳到/var/www/
  3. 上傳靜態目錄的內容,以/var/www/static
  4. app.wsgi文件:

    import sys 
    sys.path.append(0, '/home/youruser/my_app') 
    
    from main import app as application 
    
+0

好吧,所以我將代碼移出並使用app.wsgi文件中的應用程序的絕對路徑。重新啓動apache,但仍然不起作用。它現在應該工作嗎?另外,我還看到了很多其他示例,顯示了位於/ var/www中的整個應用程序,您確定不允許其中存在代碼? –

+0

是的,絕對確定。你在'app'目錄下沒有'app',這就是爲什麼它不起作用。導入行應該引用你有'if __name__ =='__main __''行的模塊。 –

+0

Gah,所以我完全重構了我的代碼,以便所有內容都包含在您的示例中的main.py中。我認爲我做的一切都是正確的。但它仍然不會服務我的應用程序...更新的問題 –

1

是否啓用mod_wsgi的Apache的?

a2enmod wsgi 
service apache2 restart 

我也將用一個簡單的「世界你好」例如嘗試,這將是main.py的/home/ubuntu/new_flask_app下的內容:

from flask import Flask 
app = Flask(__name__) 

@app.route('/') 
def hello_world(): 
    return 'Hello World!' 

if __name__ == '__main__': 
    app.run() 

這是我的工作例如樣品瓶Apache的配置:

<VirtualHost *:80> 
    ServerAdmin [email protected] 

    ServerName app.com 

    WSGIDaemonProcess new_flash_app user=ubuntu group=ubuntu threads=5 
    WSGIScriptAlias//var/www/app/app.wsgi 

    <Directory /var/www/app> 
     WSGIProcessGroup new_flash_app 
     WSGIApplicationGroup %{GLOBAL} 
     Order deny,allow 
     Allow from all 
    </Directory> 

</VirtualHost> 

,這將是app.wsi

內容

順便說一句,你的wsgi和main.py(或應用文件)不需要在同一個目錄下,只要確保配置指向正確的文件即可。

您可以測試你的服務器是這樣的:

$ telnet localhost 80 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
GET/
Hello World!Connection closed by foreign host. 
$ 

我還要檢查所提到的Apache日誌/var/log/apache2/error.log

您也可以嘗試nginx的一樣(布爾汗哈立德)。

相關問題