nginx + Thin

Posted 14.02.2010 um 14:31 von badboy_ - 0 Kommentare

Ich bin nun von Apache + Passenger auf nginx + thin umgestiegen.

Der Umstieg gestaltete sich eigentlich recht einfach, der Webserver lief recht schnell wieder so wie er sollte (nur mit monit hatte ich einige Probleme).

Hier also eine vollständige Auflistung, der Dinge, die ich getan habe:

Um nginx und thin zu installieren, bin ich nach folgendem Howto vorgegangen:

http://wiki.rubyonrails.org/deployment/nginx-thin

Zuerst habe ich also nginx kompiliert:

wget http://nginx.org/download/nginx-0.7.65.tar.gz
tar xzvf nginx-*.tar.gz
cd nginx-*
./configure --sbin-path=/usr/local/sbin --with-http_ssl_module
make

und dann als root installiert:

sudo make install

Für nginx ist in dem Howto folgendes Init-Skript verlinkt. Das hat aber falsche Zeilenenden ("\r") und außerdem habe ich noch den Syntax-Check mit eingebaut:

Die nginx-Datei habe ich dann einfach nach /etc/init.d kopiert und ausführbar gemacht:

cp nginx.d /etc/init.d/nginx
cd /etc/init.d
chmod +x nginx
update-rc.d nginx defaults

Thin kann sich selbst installieren und bringt dabei auch ein Init-Skript mit:

Also Thin installieren und das Init-Skript aktivieren:

gem install thin
thin install
chmod +x /etc/init.d/thin
update-rc.d -f thin defaults

Danach habe ich mit Thin auch gleich die benötigte Konfiguration angelegt (im Rails-Verzeichnis ausführen)

thin config -C config/thin.yml -c . --servers 2 --socket /tmp/thin.blog.sock -e production

Die Datei wird somit im git-Repo verwaltet und kommt so auch auf den Server.

Auf dem Server habe ich nun noch die Config ins richtige Verzeichnis gelinkt

mkdir -p /etc/thin
cd /etc/thin
ln -s /var/www/sites/blog/current/config/thin.yml blog_thin.yml 

Da ich nicht nur die Hauptdomain belegen will, sondern auch mehrere Subdomains, benutze ich folgende nginx-Config (nur Auszüge, die volle Config gibt's via Gist)

# nginx.conf
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
http {
    access_log /var/log/nginx/access.log;

    # ... 

    # default server
    server {
        listen       80;
        server_name  expertura.de www.expertura.de;
        # ...
    }

    include /usr/local/nginx/conf/vhosts/*;
}

# vhosts/files.conf
server {
    listen       80;
    server_name  files.expertura.de;

    # auto file listing
    autoindex    on;

    location / {
        root    /var/www/sites/files/;
        index   index.html index.htm;
    }
}

Für den Blog, der ja auf Schienen läuft, habe ich folgende Konfiguration:

# vhosts/blog.conf
upstream thin_cluster {
    server unix:/tmp/thin.blog.0.sock;
    server unix:/tmp/thin.blog.1.sock;
}

server {
    listen 80;
    server_name blog.expertura.de;

    root /var/www/sites/blog/current/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://thin_cluster;
            break;
        }
    }
    # ...
} 

Die "proxy_set_header"-Kommandos und die if-Abfragen habe ich übernommen aus dem Howto, da weiß ich noch nicht exakt wofür die Zuständig sind.

Damit wäre der Server fertig konfiguriert.

Als Systemmonitor benutze ich Monit. Neben meinem Mailserver überwacht es auch den Webserver und schickt mir bei Problemen eine eMail.

Die Konfiguration zur Überwachung von nginx sieht so aus:

check process nginx with pidfile /var/run/nginx.pid
    start program = "/etc/init.d/nginx start"
    stop program  = "/etc/init.d/nginx stop"
    if cpu > 60% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout
    group server

Außerdem überwacht es die Sockets von Thin (hier nur der Code für einen Socket, den Rest kann man sich ja denken):

check process blog_thin0 with pidfile /var/www/sites/blog/current/pids/thin.0.pid
    start program = "/usr/local/bin/thin -C /var/www/sites/blog/current/config/thin.yml -o 0 start"
    stop program = "/usr/local/bin/thin -C /var/www/sites/blog/current/config/thin.yml -o 0 stop"
    if cpu > 60% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout
    group blog_thin

(ich habe dafür übrigens mal mustache benutzt, das sieht dann so aus)

Damit monit die Prozesse nun auch überwacht, muss man die Konfiguration neu einlesen und die Prozesse starten:

monit reload
monit start nginx
monit -g blog_thin start all

Im Webinterface sieht das dann so aus:

Monit Webinterface

So! Nun sollte ich so ziemlich alles erzählt haben. Noch Fragen?

0 Kommentare:

  1. Was ist 9 plus 3?