Category Archives: Other stuff

WordPress caching with nginx

As a part of my friend @zenkay post on his blog here it is a simple but efficient nginx configuration for proxying and caching an Apache + WordPress installation.

Assuming that:

  • nginx and Apache are on different nodes: if nginx and Apache are on the same machine is highly advised to serve static files directly from nginx;
  • static files expire header is managed by Apache (through mod_expires); if static stuff is served directly you need to specify the expire through nginx;
  • you have installed the WordPress Nginx proxy cache integrator;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
server {
    # Listen IPv6 and IPv4 socket
    listen       [::]:80; #on Linux this means both IPv4 and IPv6
    # Name-based virtualhosts
    server_name  *.mydomain.com mydomain.com;
 
    # Add Cache-Status debug header on replies
    add_header X-Cache-Status $upstream_cache_status;
 
    # Set the vhost access-log
    access_log  /var/log/nginx/access-mydomain.log  main;
 
    location / {
 
        # Skip^1 caching variable init
        set $nocache 0;
        # Bypass^2 caching variable init
        set $purgecache 0;
 
        # Bypass^2 cache on no-cache (et al.) browser request
        if ($http_cache_control ~ "max-age=0")
            { set $purgecache 1; }
        if ($http_cache_control ~ "no-cache")
            { set $purgecache 1; }
        # Bypass^2 cache with custom header set on request
        if ($http_x_cache_purge ~* "true")
            { set $purgecache 1; }
        # Skip^1 caching when WordPress cookies are set
        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" )
            { set $nocache 1; }
 
        # Cache pool
        proxy_cache             proxy-one;
        # Bypass^2 cache when $purgecache is set to 1.
        # Bypass means that content is served fresh and the cache is updated
        proxy_cache_bypass      $purgecache;
        # Skip^1 caching when $nocache is set to 1
        # Do not cache when browsing frontend as logged user
        proxy_no_cache          $nocache;
        # Define the cache resource identifier. Be careful to add $nocache
        proxy_cache_key         "$scheme$http_host$request_uri$args$nocache";
        proxy_connect_timeout   10;
        proxy_read_timeout      10;
        # use stale cache on backend fault
        proxy_cache_use_stale   error timeout invalid_header updating http_500 http_502 http_503 http_504;
        proxy_cache_valid       200 302 15m;
        proxy_cache_valid       404 1m;
        proxy_set_header        Host             $host;
        proxy_set_header        X-Real-IP        $remote_addr;
        proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass              http://apache_remote_ip;
    }
 
    location ~* \/blog\/wp\-.*\.php|\/blog\/wp\-admin {
        proxy_cache             off;
        proxy_pass              http://apache_remote_ip;
    }
 
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
}

1^ see: http://wiki.nginx.org/HttpProxyModule#proxy_no_cache
2^ see: http://wiki.nginx.org/HttpProxyModule#proxy_cache_bypass

Allowing upload SVG in WordPress

If you try to upload an SVG file in your WordPress media library, the process will return the error

Sorry, this file type is not permitted for security reasons

To add new MIME types (in this case SVG) to the “white list” of file formats that are allowed to be uploaded just edit your theme function.php and add:

function custom_upload_mimes ( $existing_mimes=array() ) {
 
	$existing_mimes['svg'] = 'image/svg+xml';
	$existing_mimes['svgz'] = 'image/svg+xml';
 
	return $existing_mimes;
}

Easy.

Extra

To see how to configure lighttpd to handle correclty SVG and SVGZ please read “SVG e SVGZ con lighttpd” (in Italian)

APCUPSD bug USB

Attenzione! Il post non è più aggiornato poiché il bug è stato risolto nella release 3.4.10 di apcupsd.

3.14.10 -- 13 September 2011         (Maintenance Release)
 
BUG FIXES
 
  * Fix missing status and spurrious incorrect status on newer BackUPS CS
    models using USB interface.
  [...]

APCUPSD è un comodissimo software per chi possiede un UPS della APC.
Esso permette di monitorare lo stato dell’UPS, inviare alert e email in caso di blackout, avviare lo spegnimento dei server collegati a seguito di un blackout prolungato, ecc…

Dall’ultima versione, la 3.14.8, è stato introdotto un bug che si viene a verificare nel caso di utilizzo del software in abbinamento ad un UPS APC BackUp CS collegato tramite USB: ogni qualvolta che il demone effettua il polling dell’unità viene generato un errore di controllo nel subsystem USB

[...]
USB disconnect, address 6
usb 3-2: ctrl urb status -62 received
[...]

causando tra l’altro la disconnessione e riconnessione della periferica HID (viene vista dal kernel come una HID). Continue reading

Fedora 15 RAM richiesta

Attenzione! Per Fedora 15 sono necessari almeno 1GB di RAM per poter effettuare l’installazione.

Provando ad installare un webserver “minimo” su KVM, per testare le novità dell’ultima release, mi sono scontrato con un kernel panic in fase di boot dell’installer: il problema è che, almeno per la versione x86_64 soggetto del test, 512MB di RAM non sono sufficienti per scompattare l’initrd.img dell’installer poiché ora comprende anche l’immagine dell’installer install.img.

E’ necessario quindi, almeno per la fase di installazione, riservare alla VM almeno 1GB di RAM. Al termine dell’installazione è possibile tornare alla configurazione precedente.

Un’altra soluzione è definire la VM nel seguente modo

<memory>1048576</memory>
<currentMemory>524288</currentMemory>

Definendo quindi 512MB di RAM che in caso di necessità, su richiesta del guest possono essere estesi a 1024MB.

Firefox 4 su Fedora 14

Per installare Firefox 4 su Fedora 14 utilizzando i pacchetti RPM è sufficiente aggiungere il seguente repository:

[fedora-firefox4]
name=Firefox 4 Web Browser
baseurl=http://repos.fedorapeople.org/repos/spot/firefox4/fedora-$releasever/$basearch/
enabled=1
gpgcheck=0

salvandolo in un file .repo in /etc/yum.repos.d/ (es. fedora-firefox4.repo).

A questo punto sarà sufficiente un

yum install firefox4

L’installazione avverrà parallelamente a Firefox 3. Per rimuove Firefox 3.6 eseguire il comando

yum erase --remove-leaves firefox

Il flag –remove-leaves funziona solo se si ha installato il plugin per yum remove-with-leaves che consiglio:

yum install yum-plugin-remove-with-leaves

Yum plugin to remove dependencies which are no longer used because of a removal

SSH SOCKS forwarding

A volte può capitare la necessità di effettuare tunneling verso un altra rete, vuoi per la necessità di accedere alla rete stessa, vuoi per poter fare da ponte e utilizzare un altro gateway verso il web.

Il primo caso può essere utile ad esempio per accedere a un host in una rete locale non raggiungibile attraverso il NAT, che è quello che a me spesso capita.

Le soluzioni più eleganti e raffinate prevedono l’utilizzo di VPN, ma c’è una soluzione ancora più semplice. Avendo una macchina all’interno della rete a cui ci si vuole collegare ed avendo installato SSH raggiungibile dall’esterno è possibile utilizzare il tunneling (criptato) tramite il forwarding SOCKS5 con un semplice comando:

ssh -C2qTnN -D 8080 username@remotehost

Questo comando va eseguito sulla macchina locale (deve anche qui essere installato SSH). Per Windows è possibile utilizzare putty. Esso creerà una connessione SSH verso remotehost senza shell e rimarrà in ascolto sulla porta locale 8080. Si presume che la porta remota sia la 22, se così non fosse è possibile specificare con il flag -p la porta di SSH sull’host remoto.

E’ possibile attivare il farwarding e una shell remota contemporaneamente; per farlo vanno tolti i flag -T -n e -N.

Ora che il tunnel è creato è possibile attivare l’accesso ad esso: per i browser è sufficiente andare nella configurazione proxy ed attivare il proxy attraverso SOCKS5: i parametri saranno localhost come host e 8080 la porta (o quella definita dal parametro -D). Inserendo un indirizzo della rete locale a cui si è connessi in tunnel sarà possibile accedere ad esso.

Per le applicazioni che non supportano SOCKS, o per cui non esiste una gui apposita di configurazione, esiste in Linux un comodissimo wrapper: tsocks.

Per prima cosa bisogna provvedere ad installarlo: su Fedora è sufficiente un

yum install tsocks

per poi creare il file di configurazione /etc/tsocks.conf così impostato

server = localhost
server_port = 8080
server_type = 5
local = 127.0.0.0/255.0.0.0

infine per l’utilizzo sarà sufficiente dare da shell il comando

tsocks applicazione

(è possibile anche creare una nuova shell con attivo di default il wrapper eseguendo il solo comando tsocks).
Per verificare se è attivo il wrapping delle connessioni il comando

export | grep tsocks

deve restituire

declare -x LD_PRELOAD="libtsocks.so"

Per terminare il forwarding sarà sufficiente chiudere il processo ssh (con ctrl-c nel caso non sia stato allocato un tty).

Riferimenti

  • man ssh
  • man tsocks

Western Digital aggressive head parking

Ho da qualche giorno acquistato due Western Digital Caviar Green da 2TB (modello EARS) da montare in un MicroServer (non mio, io ho due Seagate Barracuda LP).
Ho subito notato che non è possibile tramite hdparm gestire l’APM (advanced power management) e che il disco effettua spessissimo il parcheggio delle testine.
Il controllo con smartctl ha subito evidenziato un notevole aumento del valore load_cycle_count. Se il contatore raggiunge valori molto alti viene meno l’affidabilità del disco (sono garantiti 300.000 cicli, ma meno sono e meglio è).

Cercando con google ho scoperto che tali dischi hanno impostato a livello di firmware un timeout per il parcheggio di soli 8 secondi! Non mi è stato possibile effettuare l’override delle impostazioni con hdparm: se il parametro -B255 da errore (vedi sopra) il parametro -S240 (che imposta il timeout a 20 minuti) non sortisce effetti.

Ho scoperto che anche l’unità dell’HP Mini (sempre un WD, ma un Scorpio Blu) è soggetta allo stesso problema (qui addirittura ogni 4 secondi!): in questo caso mi ero accorto del comportamento troppo aggressivo del firmware, ma ero riuscito ad arginare il problema disabilitando l’APM con

hdparm -B255 /dev/sda

Sempre grazie a google ho trovato la soluzione definitiva sia per i Green che per lo Scorpio: si tratta dell’utility WDidle 3.1 che ufficialmente è per altri modelli sempre WD, ma che almeno con i miei esemplari funziona a meraviglia. Continue reading