Nachdem ich hier beschrieben habe, wie man sich ein aktuelles Debian-Paket von nginx zusammen baut, möchte ich nun kurz erläutern, wie man mit Syscp zusammen mit nginx einen Ramdisk-Cache betreiben kann.
Der Vorteil dieser Konstruktion dürfte klar auf der Hand liegen. Nginx ist von hause aus schon schnell. Kann nginx jedoch auf Daten aus dem RAM zugreifen, so wird dies noch um einiges schneller.
Installation
Installiert habe ich ein selbst compiliertes nginx in der Version 0.8.54-3. Indem Archiv sind folgende Pakete enthalten:
- nginx_0.8.54-3_all.deb
- nginx_0.8.54-3_amd64.changes
- nginx_0.8.54-3.dsc
- nginx-doc_0.8.54-3_all.deb
- nginx-extras_0.8.54-3_amd64.deb
- nginx-extras-dbg_0.8.54-3_amd64.deb
- nginx-full_0.8.54-3_amd64.deb
- nginx-full-dbg_0.8.54-3_amd64.deb
- nginx-light_0.8.54-3_amd64.deb
- nginx-light-dbg_0.8.54-3_amd64.deb
nginx-full-dbg_0.8.54-3_amd64.deb wurde mit dem purge Modul v1.2 zusammen compiliert.
Konfiguration
Zur Konfiguration von nginx muss einmal die /etc/nginx/nginx.conf sowie eine Konfigurations-Datei für die entsprechende Webseite erstellt bzw. angepasst werden. In meinem Fall heißt die Konfugurations-Datei /etc/nginx/blog.cscholz.io.conf. Des weiteren wird ein Start-Skript für php(5)-cgi benötigt, welches ich unter /etc/init.d/php-cgi abgelegt habe. Ich möchte nicht auf die gesamte Konfiguration eingehen, jedoch auf die wichtigsten Punkte.
Ramdisk
Um die Ramdisk anzulegen, muss lediglich eine Zeile in der /etc/fstab hinzugefügt werden.
/dev/shm /var/www/nginx_cache tmpfs defaults,noexec,nodev,nosuid, size=52m,mode=750,uid=33,gid=33 0 0
In diesem Fall wird die Ramdisk unter /var/www/nginx_cache eingebunden. Die Größe sind 52MB und uid & gid stehen auf 33, was die ID des Benutzers ist mit dem Apache2 läuft entspricht.
nginx.conf
Die entscheidenden Zeilen in der /etc/nginx/nginx.conf zur Cache-Konfiguration sind:
proxy_cache_path /var/www/nginx_cache levels=1:2 keys_zone=staticfilecache:52m inactive=1d max_size=52m;fastcgi_cache_path /var/www/nginx_cache/fastcgi levels=1:2 keys_zone=php:30m inactive=1d max_size=30m;
Hier wird der Pfad, die Größe sowie die Cache-Dauer der Elemente eingestellt.
Der Abschnitt upstream backendserver ist für alle die interessant, die ihre Webseite auf mehreren Server haben. Hier können mehrere Server eingetragen werden, die Anschließend nach der vergebenen Gewichtung angefragt werden.
blog.cscholz.io.conf
Hier werden alle Websiten spezifischen Einstellungen vorgenommen. Pro location können hier unterschiedliche Einstellungen gesetzt werden. Es macht zum Beispiel Sinn, die wp-admin Seite nicht zu cachen, da sonst ein Login auf der Webseite im Admin-Bereich nicht mehr möglich ist.
location ~ /wp-admin/.*.php { # don't cache admin sitesi, get direct from folder index index.php index.html index.htm; send_timeout 1800; fastcgi_read_timeout 1800; fastcgi_ignore_headers Cache-Control Expires; # fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/lib/apache2/fcgid/sock/php-fastcgi.socket; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/kunden/webs/cscholz/blog.cscholz.io/$fastcgi_script_name; include /etc/nginx/fastcgi_params;
fastcgi_pass gibt hierbei an, auf welchem Port/socket php(5)-cgi zu finden ist. Ich habe mich für die Socket Konfiguration entschieden. Die Port Möglichkeit habe ich lediglich auskommentiert. Ob Port oder Socket Kommunikation kann in der php-fcgi eingestellt werden.
php-fcgi
#!/bin/bash #BIND=127.0.0.1:9000 BIND=/var/lib/apache2/fcgid/sock/php-fastcgi.socket USER=www-data PHP_FCGI_CHILDREN=15 PHP_FCGI_MAX_REQUESTS=1000 PHP_CGI=/usr/bin/php5-cgi PHP_CGI_NAME=`basename $PHP_CGI` PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND" [...]
Wer anstelle des Sockets über einen Port gehen möchte, braucht lediglich die BIND Zeilen entsprechend um zu kommentieren.