LinuxOS novinky 47. týždeň 2015

21.11.2015 | 15:00 | Mirecove dristy | Miroslav Bendík

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)
    • RE: LinuxOS novinky 47. týždeň 2015 22.11.2015 | 21:17
      Avatar WlaSaTy   Návštevník

      To chovanie google kôli indexácii aliasov sa nedalo okresať cez robots.txt?

      • RE: LinuxOS novinky 47. týždeň 2015 02.12.2015 | 11:56
        Avatar Miroslav Bendík Gentoo  Administrátor

        Dobrá otázka, neviem, či google vyradí odkazy rýchlo, ale zakážem ich cez robots.txt.

        • RE: LinuxOS novinky 47. týždeň 2015 07.12.2015 | 19:20
          Avatar WlaSaTy   Návštevník

          On ten robots.txt tu niekto prestal používať?