LinuxOS novinky 47. týždeň 2015
Dnes o infraštruktúre LinuxOS.sk (hádam povinné čítanie pre tých, ktorí majú na linuxos root práva).
Web server
Ako webserver sa používa nginx. Kedysi ešte za čias Tomáša Srnku sa používalo lighthttpd, ale vzhľadom na stagnujúci vývoj sa presedlalo na nginx.
Nastavenia virtuálnych serverov sú v /etc/nginx/sites-enabled
. Nech je sranda pastnem tu rovno funkčnú konfiguráciu pre new.linuxos.sk
server { listen 80; server_name new.linuxos.sk; root /srv/new/files; error_page 404 /404.html; error_page 500 501 502 503 504 /500.html; location /favicon.ico { try_files $uri empty_gif; } location /media { expires max; } location /static { expires max; } location /clanky { expires max; } location /propagacia { expires max; } location /files/404.html { } location /files/500.html { } location /robots.txt { try_files $uri =404; } location /sitemap.xml { try_files /static/sitemap.xml =404; } location / { include uwsgi_params; uwsgi_pass unix:///run/uwsgi/app/new/socket; access_log off; } }
V podstate server len sprístupňuje súbory v /srv/new/files
(to je mimo samotnej webovej aplikácie, takže sa nemôže stať aby niekto náhodou hrabol na súbor s kódom). Všetky ostatné požiadavky sú presmerované na uwsgi.
Logy sa ukladajú do /var/log/nginx/access.log
a /var/log/nginx/error.log
. Nachádzajú sa tam len logy týkajúce sa prístupu k súborom.
HTTPS
Donedávna štandardné virtual hosty zobrazovali welcome to nginx stránku. Viem, som prasa ktoré kašle na nastavenie web servera. Horšie bolo, že na https bol štandardný host nastavený na linuxos.sk, takže napríklad https://m.linuxos.sk
zobrazil ten istý obsah čo https://linuxos.sk/
. Google indexoval obsah duplicitne, čo nie je moc dobré, takže som na všetky nedefinované virtuálne hosty dal momentálne 404.
uWSGI
Služba uWSGI sa stará o spustenie webových aplikácií. Momentálne na LinuxOS bežia 3 webové aplikácie - linuxos, new (verejná beta) a sentry (logovanie). Nastavenie je celkom triviálne:
[uwsgi] plugins = python processes = 2 enable-threads = True threads = 10 master = 1 socket_timeout = 30 listen = 128 disable-loggind = False log-maxsize = 1000000 env = DJANGO_SETTINGS_MODULE=shakal.settings_production module = shakal.wsgi chdir = /srv/linuxos/app pythonpath = /srv/linuxos/app virtualenv = /srv/linuxos/venv idle = 3600 chmod-socket = 1 uid = www-data gid = www-data cheap = true lazy = true harakiri = 60 harakiri-verbose = 1 logto = /var/log/uwsgi/app/linuxos_error.log # len logy ktoré nezachytí sentry buffer-size = 8192 chroot = ...
Momentálne bežíme na starom uWSGI. Chce sa niekomu skompilovať nová verzia na debian? Ak áno kričte, ak nie budem musieť skúsiť ja.
Nová verzia uWSGI je taký švajčiarsky nožík. Okrem optimalizácií má napríklad veľmi užitočnú podporu pre vlastný crontab, supervizor (momentálne mi tu beží kvôli jednej drobnosti supervizord, rád by som sa ho zbavil).
Sentry
Hneď po štarte webovej aplikácie sú logy smerované na službu sentry. O použití sentry som písal napr. tu. Vďaka tomu môžem vidieť všetky výnimky s podrobnými informáciami vrátane toho v akom stave boli lokálne premenné počas vyhodenia výnimky.
Výnimku môžem bez problémov reprodukovať. Podobné výnimky sú zoskupené, takže ak nejaká výnimka vyskočí 100x ja uvidím celú výnimku zoskupenú, vidím v akých prehliadačoch sa vyskytuje, na akej URL a za akých podmienok.
Zoskupovanie a celková práca s výnimkami prebieha asynchrónne pomocou celery (cron je riešený cez celerybeat). Toto je jediná služba, ktorú spúšťam supervizor (ak sa mi podarí upgradnúť uwsgi bude ako samotný supervizor fungovať uwsgi a supervizord pôjde preč, akurát to žere RAM a CPU).
Cache
Ako cache sa používa memcached server. Cachované sú momentálne len niektoré drobnosti ako napríklad RSS dole na stránke.
Okrem memcache tu beží aj redis kvôli sentry.
Databáza
Ako jediný databázový server už pár rokov používame postgresql (verzia 9.1). Na server sa prihlasuje lokálne:
# su - postgres $ psql linuxos_new ➤ psql://postgres@linuxos:5432/linuxos_new # \dt List of relations ┌────────┬──────────────────────────────────┬───────┬─────────┐ │ Schema │ Name │ Type │ Owner │ ├────────┼──────────────────────────────────┼───────┼─────────┤ │ public │ account_emailaddress │ table │ linuxos │ │ public │ account_emailconfirmation │ table │ linuxos │ │ public │ accounts_remembertoken │ table │ linuxos │ │ public │ accounts_userrating │ table │ linuxos │ │ public │ article_article │ table │ linuxos │ │ public │ article_category │ table │ linuxos │ │ public │ attachment_attachment │ table │ linuxos │ │ public │ attachment_attachmentimage │ table │ linuxos │ │ public │ attachment_temporaryattachment │ table │ linuxos │ │ public │ attachment_uploadsession │ table │ linuxos │ │ public │ auth_group │ table │ linuxos │ │ public │ auth_group_permissions │ table │ linuxos │ │ public │ auth_permission │ table │ linuxos │ │ public │ auth_user │ table │ linuxos │ │ public │ auth_user_groups │ table │ linuxos │ │ public │ auth_user_user_permissions │ table │ linuxos │ │ public │ blog_blog │ table │ linuxos │ │ public │ blog_post │ table │ linuxos │ │ public │ comments_comment │ table │ linuxos │ │ public │ comments_commentflag │ table │ linuxos │ │ public │ comments_rootheader │ table │ linuxos │ │ public │ comments_userdiscussionattribute │ table │ linuxos │ │ public │ django_admin_log │ table │ linuxos │ │ public │ django_content_type │ table │ linuxos │ │ public │ django_migrations │ table │ linuxos │ │ public │ django_session │ table │ linuxos │ │ public │ django_site │ table │ linuxos │ │ public │ forum_section │ table │ linuxos │ │ public │ forum_topic │ table │ linuxos │ │ public │ hitcount_hitcount │ table │ linuxos │ │ public │ news_news │ table │ linuxos │ │ public │ notifications_event │ table │ linuxos │ │ public │ notifications_inbox │ table │ linuxos │ │ public │ polls_choice │ table │ linuxos │ │ public │ polls_poll │ table │ linuxos │ │ public │ polls_recordip │ table │ linuxos │ │ public │ polls_recorduser │ table │ linuxos │ │ public │ reversion_revision │ table │ linuxos │ │ public │ reversion_version │ table │ linuxos │ │ public │ wiki_page │ table │ linuxos │ └────────┴──────────────────────────────────┴───────┴─────────┘ (40 rows)
Pre pridávanie komentárov sa musíte prihlásiť.
To chovanie google kôli indexácii aliasov sa nedalo okresať cez robots.txt?
Dobrá otázka, neviem, či google vyradí odkazy rýchlo, ale zakážem ich cez robots.txt.
On ten robots.txt tu niekto prestal používať?