Správa linuxového serveru: Redmine: Thin a Nginx

Minulý díl načal nasazení systému pro správu projektů Redmine. Dozvěděli jste se, jak dospět k funkční testovací instanci Redmine. V tomto dílu se dočtete, jak nasadit Redmine produkčně pomocí webových serverů Thin a Nginx.

Úvod

Tento návod je dokončením, které navazuje na předchozí dva díly seriálu. Doporučuji vám si tyto dva díly (1. díl2. díl) projít, pokud jste tak ještě neučinili.

Webový server Thin

Minulý díl skončil funkční instancí Redmine, kterou jste si mohli otestovat pomocí webového serveru Webrick, jenž se ovšem nehodí pro produkční nasazení. Dalším krokem je tedy zprovoznění webového serveru Thin. Jak bylo řečeno v prvním dílu miniseriálu o nasazení Ruby aplikací, Thin je server napsaný v Ruby, zralý pro produkční nasazení (na rozdíl od Webricku, který se doporučuje používat pouze na testování Ruby aplikací). Thin lze propojit s Nginx, což provedeme za chvíli. Získejte tedy oprávnění uživatele Redmine:

su redmine -
cd

A následně nainstalujte Thin:

gem install thin

Pro samotné spouštění Thin můžete použít vlastní skript, který Thin nahodí (popř. podle potřeby shodí). Pokud budete používat pokročilejší vlastnosti RVM, můžete specifikovat konkrétní gemset před spuštěním Thinu. Pokud jste postupovali podle návodu, nemusíte si s touto informací dělat starosti.

Vytvořte adresář $HOME/bin:

su redmine -
cd 
mkdir bin

V tomto adresáři vytvořte skript pojmenovaný redmine-thin:

nano bin/redmine-thin

Obsah skriptu může být následující:

#!/bin/bash

if [ -z "$1" ]; then
   echo 'Specifikujte parametr pro Thin server (napr. "start", "stop" apod.)'
   exit 0
fi

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
cd "$HOME/redmine-1.2.1"
thin -e production $1 -s1 --socket "$HOME/redmine.sock" -d

Tento skript si vylaďte podle libosti. Zejména parametry Thinu, jako např. počet serverů (parametr -s) či konkrétní soubor se socketem, přes který bude Thin komunikovat. Socket je rychlejší než komunikace přes síť, proto je lepší používat socket – v případě problémů se můžete vrátit k použití sítě a spustit Thin na nějakém portu na místní smyčce (viz minulý díl). Dodávám jen, že Thin mění pojmenování socketu, i když je nastaven pro běh jen jednoho serveru, přidává tam číslo (redmine.0.sock). Zohledněte to pak v konfiguraci Nginx.

Následně učiňte skript spustitelným:

chmod a+x bin/redmine-thin

Adresář $HOME/bin můžete zařadit do prohledávací cesty, tedy do proměnné PATH. Do .bashrc uživatele redmine tedy přidejte:

PATH="$PATH:$HOME/bin"

Spusťte Thin pomocí skriptu:

$HOME/bin/redmine-thin start

Následně zkontrolujte, zda byl příslušný socket vytvořen (pozor, chvilku to trvá, zejména na pomalejších serverech, nelekejte se tedy, že se tam soubor hned neobjeví). Pokud ne, podívejte se v adresáři s Redmine do logu, který je umístěn v log/thin.0.log, zda vám nenapoví, kde je problém.

Tento soubor pak můžete spouštět s právy roota takto:

su redmine -c '/home/redmine/bin/redmine-thin start'

Aby se tento skript spustil při startu serveru, nejjednodušší je přidat příkaz k jeho spuštění do /etc/rc.local, ale mnohem čistší řešení je vytvořit pro něj skript v /etc/init.d a zařadit ho do příslušné úrovně běhu pomocí update-rc.d. Abyste zajistili jeho nepřerušený běh, resp. jeho případný automatický restart, pokud by spadl, můžete použít nástroj Monit. Tento nástroj byl představen ve dvou dílech seriálu (1. díl2. díl).

Nginx

Nyní by vám již měl Redmine běžet a měl by být dostupný na socketu /home/redmine/redmine.sock. Zbývá propojit webový server s tímto socketem. Nainstalujte tedy Nginx:

aptitude install nginx

Nginx je třeba nakonfigurovat. Ideální je, pokud vám Redmine bude běžet přes zabezpečený protokol HTTPS, k čemuž ovšem potřebujete certifikát, a to ideálně ne self-signed (na který jsou prohlížeče v dnešní době již silně alergické), ale certifikát podepsaný od nějaké důvěryhodné certifikační autority. Nechcete-li příliš utrácet, můžete použít např. StartSSL nebo CACert.org, které vám vydají certifikát zdarma.

Vytvořte tedy konfigurační soubor pro Nginx:

nano /etc/nginx/sites-available/redmine

A naplňte jej následujícím obsahem:

upstream  backend {
   server   unix:/home/redmine/redmine.0.sock;
}

server {
        listen  1.2.3.4:443;
        server_name  jmeno.serveru.cz;

        client_max_body_size 10M;
        client_body_buffer_size 128k;

        ssl  on;
        ssl_certificate  /etc/nginx/certifikat.pem;
        ssl_certificate_key  /etc/nginx/klic.pem;

        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_session_timeout  3m;

        access_log  /var/log/nginx/redmine.access.log;
        root /home/redmine/redmine-1.2.1/public;

        location / {
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (-f $request_filename/index.html) {
                        rewrite (.*) $1/index.html break;
                }
                if (-f $request_filename.html) {
                        rewrite (.*) $1.html break;
                }
                 if (!-f $request_filename) {
                        proxy_pass http://backend;
                        break;
                }
        }

}

server {
    listen 1.2.3.4:80;
    rewrite ^(.*) https://$host$1 permanent;
}

Pokud byste přeci jen nechtěli používat zabezpečený přístup ke své instanci Redmine a stačil by vám nešifrovaný protokol HTTP, můžete použít následující konfigurační soubor:

upstream  backend {
   server   unix:/home/redmine/redmine.0.sock;
}

server {
        listen  1.2.3.4:80;
        server_name  jmeno.serveru.cz;

        client_max_body_size 10M;
        client_body_buffer_size 128k;

        access_log  /var/log/nginx/redmine.access.log;
        root /home/redmine/redmine-1.2.1/public;

        location / {
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (-f $request_filename/index.html) {
                        rewrite (.*) $1/index.html break;
                }
                if (-f $request_filename.html) {
                        rewrite (.*) $1.html break;
                }
                 if (!-f $request_filename) {
                        proxy_pass http://backend;
                        break;
                }
        }

}

V tomto souboru si určitě upravte všechny potřebné informace jako IP adresy serveru, dále cesty k logům, cestu k Redmine (direktiva root), cestu k socketu nebo socketům, samozřejmě pak také cesty k certifikátům v SSL variantě konfiguračního souboru výše apod.

Budete-li používat více než jeden běžící server, socketů se vytvoří také více – v takovém případě ke všem z nich uveďte cestu:

upstream  backend {
   server   unix:/home/redmine/redmine.0.sock;
   server   unix:/home/redmine/redmine.1.sock;
   server   unix:/home/redmine/redmine.2.sock;
   server   unix:/home/redmine/redmine.3.sock;
}

Posledním krokem je "aktivace" konfigurace, resp. vytvoření symbolického odkazu v adresáři /etc/nginx/sites-enabled:

ln -s /etc/nginx/sites-available/redmine /etc/nginx/sites-enabled/redmine

A konečně můžete spustit nakonfigurovaný Nginx:

/etc/init.d/nginx start

Nyní se přihlaste do Redmine a konfigurujte, vytvářejte projekty, uživatelské účty apod. Připomínám, že výchozím uživatelem je "admin" a heslo k němu je "admin". Opět dodávám, že by bylo vhodné toto heslo urychleně změnit.

Doladění konfigurace Redmine

Na závěr zbývá doladit konfiguraci Redmine, a sice vyřešit rozesílání e-mailů. Redmine má velmi propracovaný systém e-mailových oznámení, a proto potřebuje přístup k poštovnímu serveru, aby mohl poštu rozesílat. Asi nejjednodušší je použít nástroj sendmail k odesílání pošty, ale můžete použít i klasický SMTP server. Získejte tedy oprávnění uživatele redmine a dostaňte se do adresáře s Redmine:

su redmine -
cd ~/redmine-1.2.1

Můžete použít předlohu, configuration.yml.example, a zkopírovat ji do neexistujícího configuration.yml:

cp config/configuration.yml.example config/configuration.yml

Tento soubor je bohatě komentovaný, varianta se sendmailem je tam naznačena:

production:
   email_delivery:
   delivery_method: :sendmail

Stejně tak varianta s použitím místního poštovního serveru:

production:
   email_delivery:
   delivery_method: :smtp
   smtp_settings:
   address: "localhost"
   port: 25

K dispozici jsou i varianty s externím poštovním serverem s autentifikací. Pokud budete používat tento soubor jako předlohu, berte na vědomí, že je v něm již doručování e-mailů nastaveno (SMTP server s autentifikací), je tedy vhodné tuto konfiguraci najít a upravit (soubor je velký a klíčový odkomentovaný kousíček snadno přehlédnete). Tím je instalace a konfigurace Redmine hotová.

Z bezpečnostního hlediska běží Thin a celé Redmine pod separátním, neprivilegovaným účtem redmine. Ke Thinu se pak připojuje Nginx, který také běží pod neprivilegovaným účtem, v Debianu pod účtem www-data. S MySQL, Thinem a Nginx jsem se na OpenVZ virtuálním stroji s 256 RAM vešel do 150 MB, i s poštovním serverem. Použil jsem jeden paralelní Thin server, jak jsem naznačil v návodu výše.