2013-12-09 3 views
0

Я закончил простое приложение Flask, которое я пытаюсь разместить на экземпляре AWS EC2 с Apache2. Я следующие this tutorial.Установка приложения Flask на EC2 для доступа к локальному хосту

Единственные изменения, которые я сделал из процесса разработки (в котором приложение работает совершенно нормально, когда я запускаю его, а затем попытаться получить к нему доступ с помощью локального хоста) являются:

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 

Вот файл my_app в /etc/apache2/sites-available:

<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__.py и views.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

Переведен весь код, чтобы/вар/WWW

Это неправильно. Вам необходимо разместить свой код в каталоге, не доступном в Интернете. Публикуйте свои статические файлы только по адресу /var/www

Обратитесь к official deployment guide о том, как настроить его с помощью Apache и mod_wsgi. Если у вас возникли проблемы, вы можете рассмотреть this AMI image с флягой, nginx и uwsgi.

Стек 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 на апача?

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() 

Это образец колба апач конфигурации для моего рабочего примера :

<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

import sys 

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

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

from main import app as application 

Btw, ваш 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. 
$ 

Я хотел бы также проверить Апач журналы /var/log/apache2/error.log

Вы также можете попробовать Nginx так же, как (Бурхан Халида) упоминается.

Смежные вопросы