Poichè alcuni sperano che io faccia un post ad un anno esatto di distanza, in modo da celebrare un anno di blog morto, ho deciso invece di postare pochi giorni prima ed evitare pertanto di dare ragione ai conformismi.

Dopo avere installato circa centinaia di siti e blog, voglio aiutare tutti quelli che hanno problemi di permessi di upload con wordpress con questa veloce guida.

Se avete avuto problemi con questo messaggio di errore:

Unable to create directory /wp-content/uploads/2012/02.
Is its parent directory writable by the server?

Quando avete problemi di permessi di Upload con WordPress vi dice che non può scrivere, non dovete buttarvi a pesce lesso su Gogol (Google per i più, ma da noi è stato battezzato Gogol oramai) e scoprire che l’unica soluzione è fare:

[bad idea] chmod 0777 wp-content/uploads/

poichè in questo modo state dicendo al server che chiunque acceda al vostro spazio web può scrivere in quella directory, una scelta di immensa gravità di sicurezza (ovvero se un plugin ha un bug o la versione di wordpress si scopre essere bucabile, sicuramente vi troverete un injection nel vostro sito/blog).

Il motivo per cui i permessi non funzionano con le installazioni di default sono da ricercare nel fatto che probabilmente avere caricato WordPress su di un server utilizzando un utente che non è quello usato dal Web Server, il quale è l’unico utente (oltre a root) che dovrebbe poter scrivere.

Pertanto, la procedura è la seguente.

Riducete al minimo l’accesso alle directory. Per wordpress potete usare quello suggerito da WordPress.org, ovvero

[step 1] chmod 0755 wp-content/uploads/

e poi dovete assegnare la directory che avete creato allo stesso utente del vostro apache web server e al gruppo a cui appartiene l’utente.

Per sapere a quale utente assegnare le cartelle del blog, se potete accedere all’apache.conf, cercate la linea che indica lo user in uso con questo comando.

sudo ps xe  | grep apache2

e leggerete qualcosa come:

 27648 ?        Ss     0:04 /usr/sbin/apache2 -k start APACHE_PID_FILE=/var/run/apache2.pid PATH=/usr/local/bin:/usr/bin:/bin LANG=C APACHE_RUN_GROUP=www-data APACHE_RUN_USER=www-data

dove leggete che lo user e il gruppo sono www-data e www-data; quindi andate nel vostro blog e fate:

[step 2] chown  -R www-data.www-data wp-content/uploads/

in questo modo non dovrete fare quell’orribile 777.

Se il ps xe non vi dà risultati, allora potete leggere l’apache.conf e usare le informazioni là inserite come User e Group, ma nei moderni OS le informazioni sono trasferite negli script di startup del web server e non più nell’apache.conf come variabile ${APACHE_RUN_USER}. Potete localizzare il vostro apache.conf velocemente scrivendo ad esempio:

apache2ctl -V

oppure httpd -V

e leggere la linea con

SERVER_CONFIG_FILE=

A presto.

 

Addendum per “An error occurred while updating … “.

Aggiungo una nota ad un errore che può apparire in fase di Aggiornamento anche dopo che tutti i settings e permessi sono corretti.

Se tentate di aggiornare un plug-in e leggere un errore del tipo

An error occurred while updating [PlugIn Name Here]: Could not create directory. […]

allora controllate che non abbiate attivato un plug in di security come AskApache Password Protect, ad esempio, o altri plug-in che lavorano su Apache mod_security.

In quei casi dovete disabilitare il Plugin di WordPress o mod_security (temporaneamente) per risolvere il problema.

Non vi consigli di disabilitare mod_security con

[bad idea] a2dismod mod-security2

poichè le stringhe di configurazione del modulo nella configurazione del sito o delle directory tramite htaccess rimangono e diventano “errori” per Apache e il riavvio del WebServer genera un downtime grave, ma piuttosto vi consiglio di inserire (o modificare l’htaccess per la wp-content/upgrade/ in modo da disabilitarlo, inserendo:

<IfModule mod_security.c>

SecFilterEngine Off

</IfModule>

e questo non necessita di riavvio di Apache (se l’htaccess è abilitato).

Buon blog!