Tornado Web Server – MiniHowto

tornado-128x32  Serwis Facebook udostępnił na licencji Apache Licence, Version 2.0 serwer WWW o nazwieTornado Web Server. Wraz z    serwerem     zostały udostępnione narzędzia przy pomocy których powstała strona FriendFeed. Tornado potrafi obsługiwać tysiące jednoczesnych połączeń.

Aplikacja FriendFeed została napisana przy użyciu webowych frameworków podobnych do web.py oraz Google’s webapp.

Całość serwera została napisana w Pythonie. Do swojego działania wymagany jest Python 2.5 lub 2.6 oraz biblioteki PycURL oraz obsługi języka JSON na przykład dzięki simplejson.

Dokładniejszy opis Tornado, jego funkcji oraz zastosowań znajduję się tutaj, mój artykuł pokazuje podstawową konfigurację, sposob szybkiej instalacji i uruchomienia.

Instalacja przeprowadzana na Linux Mint 15:

Pobieramy potrzebne pakiety:

apt-get install python python-pip pycurl screen

Instalujemy Tornado Web Server

pip install tornado

Proces szybki, serwer malutki – teraz konfiguracja:

mkdir -p ~/website/{static,templates/layouts}
cd ~/website
wget -O application.py http://pliki.gru.one.pl/11-2013/application.py

Po pobraniu pliku application.py – można go wyedytować – znajdują się w nim podstawowe dan konfiguracyjne serwera Tornado, przygotowany przeze mnie plik wystarcza do uruchomienia serwera WWW.

Teraz plik index.html i 404.html. w index’ie znajduję się strona główna, a 404 będzie ładowane jeżeli użytkownik będzie próbował wczytać nie istniejącą zawartość

touch templates/index.html templates/404.html
echo 'Zapraszam na <a href="http://linuxiarz.pl">gru.one.pl">' > templates/index.html
echo '<h1><b>404 - Not found</b>></h1>' > templates/404.html

Prawa uruchamiania do pliku application.py:

chmod +x application.py

I uruchomienie

python application.py

Teraz w przeglądarce powinien przywitać cię na porcie 8080, uruchomiony serwer www z wcześniej zdefiniowaną treścią.

Oczywiście port serwera i inne rzeczy można dowolnie zmieniać w pliku application.py.

#!/usr/bin/env python
## -*- coding: utf-8 -*-
import os
from mako import exceptions
from mako.lookup import TemplateLookup
import tornado.ioloop
import tornado.web
from tornado import httpclient

root = os.path.dirname(__file__)
template_root = os.path.join(root, 'templates')
blacklist_templates = ('layouts',)
template_lookup = TemplateLookup(input_encoding='utf-8',
 output_encoding='utf-8',
 encoding_errors='replace',
 directories=[template_root])

def render_template(filename):
 if os.path.isdir(os.path.join(template_root, filename)):
 filename = os.path.join(filename, 'index.html')
 else:
 filename = '%s.html' % filename
 if any(filename.lstrip('/').startswith(p) for p in blacklist_templates):
 raise httpclient.HTTPError(404)
 try:
 return template_lookup.get_template(filename).render()
 except exceptions.TopLevelLookupException:
 raise httpclient.HTTPError(404)

class DefaultHandler(tornado.web.RequestHandler):
 def get_error_html(self, status_code, exception, **kwargs):
 if hasattr(exception, 'code'):
 self.set_status(exception.code)
 if exception.code == 500:
 return exceptions.html_error_template().render()
 return render_template(str(exception.code))
 return exceptions.html_error_template().render()

class MainHandler(DefaultHandler):
 def get(self, filename):
 self.write(render_template(filename))

application = tornado.web.Application([
 (r'^/(.*)$', MainHandler),
], debug=True, static_path=os.path.join(root, 'static'))

if __name__ == '__main__':
 application.listen(8080)
 tornado.ioloop.IOLoop.instance().start()

O porcie serwera mówi końcowy wpis:

if __name__ == '__main__':
application.listen(8080)
tornado.ioloop.IOLoop.instance().start()

Wystarczy zmienić to na 80 lub inny.

Uruchomienie Tornado w tle: (w screenie)

screen -dmS tornado-server python ~/website/application.py

Uruchamianie przy starcie:

nano /etc/rc.local

I przed  exit dodaj: (jeśli serwer znajduję sie w katalogu root)

@reboot screen -dmS tornado-server python ~/website/application.py

Jeśli pliki serwera u innego użytkownika to analogicznie:

@reboot screen -dmS tornado-server python /home/UZYTKOWNIK/website/application.py