Syntax Highlighting

Posted 08.03.2010 um 21:54 von badboy_ - 0 Kommentare

So! Ab sofort gibt es hier im Blog auch Syntax Highlighting.

Möglich macht das SHJS:

SHJS is a JavaScript program which highlights source code passages in HTML documents. Documents using SHJS are highlighted on the client side by the web browser.

Auf Serverseite erledigt folgendes Stück Code die Arbeit:

html = Nokogiri::XML.parse(html_code)

html.css('pre').each do |pre|
  pre.css('code').each do |code|
    out = code.text
    lines = out.split("\n")
    if lines.first[0, 3] == '@@@'
      lang = lines.shift.gsub('@@@', '').strip
      pre.set_attribute('class', 'sh_' + lang)
      code.content = lines.join("\n")
    end
  end
end

Das habe ich aus dem Code zu showoff: showoff.rb:86

Als Grundlage für das Layout habe ich das Theme "ide-devcpp" genommen und modifiziert. Die modifizierte Version könnt ihr ja einfach aus dem production-System nehmen: sh_vibrantink_like.css.

Angelehnt ist das Theme an das vim-Colorscheme vibrantink.

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?

Blog down, Blog up, Blog down, ...

Posted 13.02.2010 um 17:29 von badboy_ - 0 Kommentare

Falls es jemandem aufgefallen sein sollte: zwischendurch war der Blog zeitweise nicht zu erreichen.

Ich bin nämlich von Apache + Passenger auf nginx + thin umgestiegen.

Was genau ich da so konfiguriert habe, kommt später aber noch.

Spamfilter

Posted 07.02.2010 um 22:03 von badboy_ - 0 Kommentare

So! Ab sofort kann ich den Spamfilter via Webinterface erweitern. Sollte also trotz Captcha doch noch Spam durchkommen, ist es eine Kleinigkeit das in Zukunft auch zu blocken.

Nun mit simplem Captcha

Posted 07.02.2010 um 19:15 von badboy_ - 2 Kommentare

Durch die ansteigende Flut an Spamkommentaren, die zwar größtenteils rausgefischt wurden, aber trotzdem nervig sind, habe ich jetzt ein simples Captcha eingebaut:

Um einen Kommentar abzusenden, muss man eine kleine Rechnung lösen. Für jeden Menschen einfach zu lösen, simple Spambots verzweifeln daran aber.

Ich hoffe es hilft.