Syntax Highlighting
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
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:
So! Nun sollte ich so ziemlich alles erzählt haben. Noch Fragen?
Blog down, Blog up, Blog down, ...
Spamfilter
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
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.
