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