Pylons, DreamHost i Virtual Python

Wiem, że zacznam może od końca ale myślę, że wielu osobom przyda się instrukcja jak uruchomic Pylons na DreamHoście.

Przewodnik ten jest w dużej części oparty na tym wpisie: “A tale of Pylons, Python and FastCGI on DreamHost”.

Jeżeli chcesz założyć konto na DreamHoście możesz przed płatnością podać kod: PYPLANET, który da Ci zniżkę w wysokości 60USD a jednocześnie DreamHost przekaże nam 37 USD na hosting pod różne projekty (między innymi tego bloga i django.pl). Kończymy z reklamami i zaczynamy.

Po pierwsze w panelu administracyjnym w zakładce “domains -> manage domains” musisz ustawić domenę (lub subdomenę), która będzie obsługiwała FCGI. W naszym przypadku będzie to sandbox.pypla.net

Ważne: jeden użytkownik systemowy, którym ma uruchamiać procesy FCGI powinien mieć tylko jedną domenę/subdomenę.

Przykład: użytkownik pyplanet, który obsługuje domenę pypla.net (na której działa aplikacja FCGI, czyli procesy o nazwie dispatch.fcgi - tylko tej nazwy DreamHost nie zabija gdy długo chodzą) nie powinien obsługiwać również subdomeny np sandbox.pypla.net, pod którą ma działać inna aplikacja FCGI. Jeżeli w tej kwestii jednak się mylę proszę poprawcie mnie.

Mamy już użytkownika i domenę. Logujemy się na niego używając SSH (na Windowsie możemy użyć puTTY)

Code (bash)
  1. ssh username@host

W moim przypadku:

Code (bash)
  1. ssh sandbox_pyplanet@sandbox.pypla.net

W katalogu głównym tworzymy katalog bin. sciągamy skrypt, który zainstaluje nam niezależną wersję Pythona:

Code (bash)
  1. mkdir ~/bin
  2. wget -P ~/bin http://peak.telecommunity.com/dist/virtual-python.py
  3. python2.4 ~/bin/virtual-python.py
  4. rm ~/bin/virtual-python.py

Teraz sprawmy by nasz lokalny Python stał się na tym koncie domyślny:

Code (bash)
  1. echo "export PATH=~/bin:$PATH" >> .bash_profile
  2. source .bash_profile

Teraz potrzebujemy setuptools:

Code (bash)
  1. wget -P ~/bin http://peak.telecommunity.com/dist/ez_setup.py
  2. python ~/bin/ez_setup.py
  3. rm ~/bin/ez_setup.py

Jeżeli powyższe przeszło bez problemów w konsoli mamy dostępne polecenie easy_install.
Instalujemy Pylons:

Code (bash)
  1. easy_install Pylons

Teraz moglibyśmy stworzyć nowy projekt Pylons ale zamiast tego uruchomimy QuickWiki:

Code (bash)
  1. easy_install QuickWiki

Generujemy plik konfiguracyjny naszego Wiki:

Code (bash)
  1. cd ~
  2. paster make-config QuickWiki wiki.ini

Edytujemy wiki.ini i zmieniamy:

Code (ini)
  1. [server:main]
  2. use = egg:Paste#http
  3. host = 0.0.0.0
  4. port = 5000

na:

Code (ini)
  1. [server:main]
  2. use = egg:PasteScript#flup_fcgi_thread
  3. host = 0.0.0.0
  4. port = 5000

Teraz powinniśmy stworzyć bazę danych i wyedytować ten wiersz:

Code (ini)
  1. sqlalchemy.dburi = postgres://username:password@localhost/quickwiki_test

Uwaga: Miałem problemy z używaniem SQLite’a więc radzę użyć MySQLa.
Wpis powinien wyglądać mniej więcej tak:

Code (ini)
  1. sqlalchemy.dburi = mysql://uzytkownik:haslo@twoj_host/nazwa_bazy_danych

Synchronizujemy aplikację (automatycznie zostaną stworzone odpowiednie tabele w bazie):

Code (bash)
  1. paster setup-app wiki.ini

Wszystko jest prawie gotowe.
Jesteśmy w momencie gdie mogą powstać pewne problemy.
Rozpoczniemy od zalecanej konfiguracji z użyciem Flupa, z która niestety mogą być problemy na DreamHoście. Poniżej opiszę konfigurację alternatywną.
Flup:

Code (bash)
  1. easy_install Flup
  2. vim ~/sandbox.pypla.net/dispatch.fcgi

Plik dispatch.fcgi powinien wyglądać mniej więcej tak. Pierwszy wiersz tego pliku powinien zawierać bezwzględną scieżkę instalacji Virtual Pythona #!/home/username/bin/python. Podobnie wygląda kwestia pliku wiki.ini;

Code (python)
  1. #!/home/sandbox_pyplanet/bin/python
  2. from paste.deploy import loadapp
  3. from flup.server.fcgi import WSGIServer
  4. app = loadapp("config:/home/sandbox_pyplanet/wiki.ini")
  5. server = WSGIServer(app)
  6. server.run()

Upewniamy się, że prawa dostępu są prawidłowe:

Code (bash)
  1. chmod 755 ~/sandbox.pypla.net/dispatch.fcgi

Sprawmy by Apache przekierowywał automatycznie wszystkie odwołania do dispatch.fcgi

Code (apache)
  1. AddHandler fastcgi-script .fcgi
  2. RewriteEngine On
  3. RewriteBase /
  4. RewriteRule ^(dispatch.fcgi/.*)$ - [L]
  5. RewriteRule ^(.*)$ dispatch.fcgi/$1 [L]

Jeżeli mamy szczęście :) wchodząc na http://sandbox.pypla.net/dispatch.fcgi powinniśmy zobaczyć stronę główną naszej aplikacji.
Routes nadal będą robić odwołania do dispatch.fcgi. Możemy to naprawić w ten sposób

Jeżeli jednak opcja z Flupem nie działa alternatywnie ściągamy skrypt fcgi.py:

Code (bash)
  1. wget -P ~/lib/python2.4/site-packages http://svn.saddi.com/py-lib/trunk/fcgi.py

Sprawiamy by nasz plik dispatch.fcgi wyglądał tak:

Code (python)
  1. #!/home/sandbox_pyplanet/bin/python
  2. from paste.deploy import loadapp
  3. from fcgi import WSGIServer
  4. app = loadapp("config:/home/sandbox_pyplanet/wiki.ini")
  5. server = WSGIServer(app)
  6. server.run()

Jeżeli macie pomysł jak ulepszyć ten poradnik, komentujcie.

One Response to

  1. Mateusz says:

    Przy zakładaniu konta w Dreamhost polecam kod PROMOCODE4POLAND - jego użycie przy zakupei konta powoduje spadek ceny konta do magicznych 7 złotych!!!
    Kto z polskich hosterów jest w stanie to pobić?

    Pozdrawiam

Leave a Reply »