mecker. mecker. mecker.

nginx

07.01.2012, 22:03

Seit heute rennt das Blog unter nginx. Der Grund ist einfach: lighttpd ist behindert zu kon­fi­gu­rie­ren, hat keine aktuellen/coolen Features und ist zudem noch langsamer als nginx. Ich hoffte seit knapp einem Jahr, dass sich in der Ent­wick­lung was tut, aber außer einer Beta-Version mit in­te­grier­tem lua-Support (um überhaupt ein if-else statt if-else-if kon­fi­gu­rie­ren zu können) und zahl­rei­chen Won’t fixes für 1.4.x hat sich leider rein gar nichts getan.

Warum nginx? Ja, das weiß ich auch nicht, aber die Al­ter­na­ti­ven zu non-Apache mit geringem Memory-Footprint, vielen Features und opensource sehen schlecht aus. thttpd hat kein mod_proxy, Cherokee bringt gleich ein Web-GUI zur Ad­mi­nis­tra­ti­on mit und LiteSpeed Web Server ist nicht quell-offen. Also, was sind die Features von nginx?

  • schnell und leicht­ge­wich­tig
  • logische Kon­fi­gu­ra­ti­on (was ich schon für behinderte Logik-Krämpfe mit lighttpd hatte…)
  • mod_proxy, mo­d_­fast­cgi, expires, PCRE

Moving from lighttpd to nginx

Die Umstellung von lighttpd nach nginx ist nicht ganz ohne. Prin­zi­pi­ell ist alles anders und nginx hat keine Un­ter­stüt­zung für CGI und rewrite-Regeln auf Query-Parametern. Außerdem spawnt nginx nicht au­to­ma­tisch einen wei­ter­le­sen.

Just in case, anyone ex­pe­ri­ences this, too. Lighttpd can not handle Expect: 100-continue properly. Pushing with git fails (sometimes) with something like this:

# git push origin master
    Counting objects: 11, done.
    Delta compression using up to 24 threads.
    Compressing objects: 100% (10/10), done.
    Writing objects: 100% (11/11), 1.94 KiB, done.
    Total 11 (delta 0), reused 0 (delta 0)
    error: RPC failed; result=22, HTTP code = 417
    fatal: The remote end hung up unexpectedly
    fatal: The remote end hung up unexpectedly

It’s fixed in lighttpd 1.5 but is a Wont’t fix for version 1.4.29. As you may know, version 1.5 is still beta and not finished yet. Since four years, now. Great fix, though. A workaround can be found here:

server.reject-expect-100-with-417 = "disable"

So, nach gut zwei Wochen weiterem Probieren und Failen habe ich nun auch eine richtige Au­then­ti­fi­zie­rung für non-Apache Webserver mittels Redmine. Ich nutze hierbei das neue Smart HTTP Transport Protokoll, das seit Git 1.6.6 un­ter­stützt wird. Über SSL getunnelt ist es fast so sicher und genauso schnell wie die Über­tra­gung über SSH oder Git-Daemon. Nur halt mittels plain HTTP, Webserver und etwas mod_proxy.

Weil schon die In­stal­la­ti­on abseits von Apache/Nginx eine Qual wegen nicht vor­han­de­ner Do­ku­men­ta­ti­on war, will ich auch hier wieder do­ku­men­tie­ren, indem ich mein Setup als Beispiel angebe. Wie immer nutze ich lighttpd und eine Redmine-In­stal­la­ti­on Version 1.2.1, betrieben mit thin. Weil Hype cool ist, existieren Wrapper für git-http natürlich nur in nodejs und ruby. Argh. Naja, hab’ ich schon Ruby am Hals, nehm ich halt den letzteren. Mein Code baut auf maxlapshin/grack auf, das ist ein un­ge­merg­ter Fork eines un­ge­merg­ten Fork von schacon/grack x(

Schema

Mein an­ge­streb­tes URL-Layout sieht wie folgt aus:

/redmine                <- meine Redmine-Installation, HTTPS-getunnelt
/git/myproject.git   weiterlesen.

Heute mal eine Rarität. Während das Internetz zu 99% An­lei­tun­gen zu Apache + Redmine + Passenger und zu einem großen Anteil (1%) auch Redmine + nginx + Mongrel/Thin im Angebot hat, habe ich auf diese Bloatware Apache keinen Bock und finde die Be­nut­zer­do­ku­men­ta­ti­on von nginx… erm… etwas dünn (faktisch null). Nun habe ich wohl merk­wür­di­ge Vor­stel­lun­gen, aber ich find’ lighttpd wirklich hübsch.

Redmine kennt man ja derweil, das ist auch so eine Bloatware, die auf einer Bloatware läuft, deren In­ter­pre­ter auch Bloatware Scheiße ist. Ach, und als häufig genutzte Da­ten­bank­ba­ckends kommen noch leicht­ge­wich­ti­ge, re­la­tio­na­le Da­ten­ban­ken wie MySQL und PostgreSQL hinzu. Sqlite3 geht, aber das zu erwähnen ist ja unwichtig. Und mit diesen Ansprüchen, Redmine mit nur 100-150 MB RAM statt 300 MB laufen zu lassen, bin ich relativ alleine. Die Anleitung bezieht sich übrigens nur auf Debian Squeeze. Außerdem nutze ich die Ruby Enterprise Edition, weil RAM--.

Pre­re­qui­si­tes

Wir brauchen sqlite, headers und ‘nen Ruby-In­ter­pre­ter (64-Bit). Und alles als root!

Ich hab’ ab heute ‘n SSL-Cert, das sogar validiert und keine extra Freigabe wegen un­be­kann­ter Identität erfordert! Web 2.0++, yeah!

Nur failed jetzt alles. Disqus, mein statisches HTML, lighttpd beim au­to­ma­ti­schen redirect. An sich alles kein Problem. Aber Disqus kann kein SSL, das wäre read-only für nicht re­gis­trier­te und das wollen wir ja nicht. Ach mann. FAIL.

Immerhin geht posativ.org :)

written by posativImpressum

by-nc-sa