[spip-dev] Retour sur l'installation de SPIP sur Cherokee

Salut la liste,

Cherokee est un exemple de serveur qui booste pas mal, offre pleins de possibilités super intéressantes.

Bonne nouvelle, l’installation dans Cherokee de SPIP se déroule sans aucun problème… jusqu’à ce qu’on veuille utiliser des urls propres / arbo / etc.

Cherokee ne supporte pas les .htaccess, propres à Apache, donc il faut trouver l’équivalent dans les fichiers de config.

J’ai bien apprécié le message d’avertissement qui apparait en fin d’installation, mais je suis resté un peu désarmé devant tout ce charabia.

Pour Cherokee, j’ai donc dû refaire (laborieusement) l’équivalent des .htaccess et des restrictions au niveau des droits d’écriture. Voici les règles que j’ai utilisées, extraites du fichier de config (bon, on ne touche jamais à ce fichier, c’est juste pour ressortir toutes les valeurs).

Est-ce que, en pratique, il ne faudrait pas, en fin d’installation de SPIP, donner accès à des infos supplémentaires pour ceux qui sont dans les situations comme la mienne (genre avec Nginx, lighttpd, etc…) ?

---- Les parties du fichier /etc/cherokee/cherokee.conf qui ont été changées par l’interface d’admin --------------------------------

On commence par dire que les fichiers seront traités par PHP :

vserver!10!rule!1500!disabled = 0
vserver!10!rule!1500!encoder!gzip = 1
vserver!10!rule!1500!handler = fcgi
vserver!10!rule!1500!handler!balancer = round_robin
vserver!10!rule!1500!handler!balancer!source!1 = 1
vserver!10!rule!1500!handler!error_handler = 1
vserver!10!rule!1500!match = extensions
vserver!10!rule!1500!match!extensions = php
vserver!10!rule!1500!match!final = 0
vserver!10!rule!1500!timeout = 30

Pas de changement pour les fichiers qui existent déjà

vserver!10!rule!1400!disabled = 0
vserver!10!rule!1400!encoder!gzip = allow
vserver!10!rule!1400!handler = common
vserver!10!rule!1400!handler!allow_dirlist = 1
vserver!10!rule!1400!handler!allow_pathinfo = 0
vserver!10!rule!1400!handler!backup = 0
vserver!10!rule!1400!handler!date = 1
vserver!10!rule!1400!handler!group = 0
vserver!10!rule!1400!handler!hidden = 0
vserver!10!rule!1400!handler!iocache = 1
vserver!10!rule!1400!handler!redir_symlinks = 0
vserver!10!rule!1400!handler!size = 1
vserver!10!rule!1400!handler!symlinks = 1
vserver!10!rule!1400!handler!theme = default
vserver!10!rule!1400!handler!user = 0
vserver!10!rule!1400!match = exists
vserver!10!rule!1400!match!final = 1
vserver!10!rule!1400!match!iocache = 0
vserver!10!rule!1400!match!match_any = 1
vserver!10!rule!1400!match!match_index_files = 1
vserver!10!rule!1400!match!match_only_files = 1
vserver!10!rule!1400!no_log = 0
vserver!10!rule!1400!only_secure = 0

Le contenu de /IMG et /local est renvoyé en mode “éléments statiques”

vserver!10!rule!1300!disabled = 0
vserver!10!rule!1300!encoder!gzip = allow
vserver!10!rule!1300!expiration = max
vserver!10!rule!1300!handler = file
vserver!10!rule!1300!handler!iocache = 1
vserver!10!rule!1300!match = or
vserver!10!rule!1300!match!final = 1
vserver!10!rule!1300!match!left = directory
vserver!10!rule!1300!match!left!directory = /IMG
vserver!10!rule!1300!match!right = directory
vserver!10!rule!1300!match!right!directory = /local
vserver!10!rule!1300!no_log = 0
vserver!10!rule!1300!only_secure = 0

Un appel à un fichier de /config ou /tmp retourne une erreur 404

Règle SUPER IMPORTANTE, à définir obligatoirement !!

vserver!10!rule!1200!disabled = 0
vserver!10!rule!1200!handler = custom_error
vserver!10!rule!1200!handler!error = 404
vserver!10!rule!1200!match = or
vserver!10!rule!1200!match!final = 1
vserver!10!rule!1200!match!left = directory
vserver!10!rule!1200!match!left!directory = /tmp
vserver!10!rule!1200!match!right = directory
vserver!10!rule!1200!match!right!directory = /config
vserver!10!rule!1200!no_log = 0
vserver!10!rule!1200!only_secure = 0

Y’a d’autres règles (pour phpmyadmin, les répertoires de Cherokee, etc…)

Ensuite, les règles principales du fichier .htaccess

vserver!10!rule!500!disabled = 0
vserver!10!rule!500!encoder!gzip = allow
vserver!10!rule!500!handler = redir
vserver!10!rule!500!handler!rewrite!1!regex = /(rubrique|article|breve|auteur|mot|site)([0-9]+)(.html)?$
vserver!10!rule!500!handler!rewrite!1!show = 0
vserver!10!rule!500!handler!rewrite!1!substring = /spip.php?page=$1&id_$1=$2
vserver!10!rule!500!match = request
vserver!10!rule!500!match!final = 1
vserver!10!rule!500!match!request = /(rubrique|article|breve|auteur|mot|site)([0-9]+)(.html)?$
vserver!10!rule!500!no_log = 0
vserver!10!rule!500!only_secure = 0

vserver!10!rule!400!disabled = 0
vserver!10!rule!400!encoder!gzip = allow
vserver!10!rule!400!handler = redir
vserver!10!rule!400!handler!rewrite!1!regex = /([1-9][0-9])$
vserver!10!rule!400!handler!rewrite!1!show = 0
vserver!10!rule!400!handler!rewrite!1!substring = /spip.php?action=redirect&type=article&id=$1
vserver!10!rule!400!match = request
vserver!10!rule!400!match!final = 1
vserver!10!rule!400!match!request = /([1-9][0-9]
)$
vserver!10!rule!400!no_log = 0
vserver!10!rule!400!only_secure = 0

vserver!10!rule!300!disabled = 0
vserver!10!rule!300!encoder!gzip = allow
vserver!10!rule!300!handler = redir
vserver!10!rule!300!handler!rewrite!1!regex = /[^.]+(.html)?$
vserver!10!rule!300!handler!rewrite!1!show = 0
vserver!10!rule!300!handler!rewrite!1!substring = /spip.php?url_propre=$0
vserver!10!rule!300!match = request
vserver!10!rule!300!match!final = 1
vserver!10!rule!300!match!request = /[^.]+(.html)?$
vserver!10!rule!300!no_log = 0
vserver!10!rule!300!only_secure = 0

On interdit l’accès aux fichiers .svn (est-ce vraiment utile ?)

vserver!10!rule!200!disabled = 0
vserver!10!rule!200!handler = custom_error
vserver!10!rule!200!handler!error = 404
vserver!10!rule!200!match = request
vserver!10!rule!200!match!final = 1
vserver!10!rule!200!match!request = /(.*/)?.svn

Après la dernière règle (celle par défaut), la déclaration de la ressource ‘php’ utilisée pour la 1ère règle

En principe, PHP est détecté automatiquement, mais dans mon cas j’ai dû le déclarer avant d’activer le module PHP

source!1!env!PHP_FCGI_CHILDREN = 5
source!1!env!PHP_FCGI_MAX_REQUESTS = 490
source!1!host = 127.0.0.1:47990
source!1!interpreter = /usr/bin/php-cgi -b 127.0.0.1:47990
source!1!nick = PHP Interpreter
source!1!type = interpreter

--------------------------------------------- Fin du fichier ---------------------------------------------

Je ne fais pas de tutoriel pour l’instant :

  • parceque dans les 4 configurations testées [ Ubuntu 9.04, CentOS 5, Debian 5 stable (Lenny) et Debian 5 Testing (Squeeze) ], seule la dernière configuration a marché pour l’installation de Cherokee + PHP + MySQL (les doigts dans le nez, d’ailleurs : je n’ai fais que suivre ce tuto : http://www.bastien-louche.fr/2010/04/installation-cherokee-php5-debian/)
  • … sauf que dans la version actuelle de Cherokee récupérée par apt-get (0.99.44, du 23 mars), il y a un bug avec Python2.5 (qui semble être corrigé en version 0.99.49). La compilation est une option que j’ai testée dans la autres environnements, mais à chaque fois on sort trop du côté “plug&play” et j’optenais systématiquement un environnement incomplet (exemple : liaison avec rrdtool pas reconnue)
  • un peu par manque de temps aussi :wink:

A suivre donc.

Est-ce que d’autres ont un retour d’expérience sur Cherokee (installation et paramétrage pour SPIP) ?

.Gilles

Salut,

j'utilise depuis un moment Cherokee et histoire d'apporter un peu d'eau au moulin voici ma configuration telle qu'expliquée sur mon blog

Cette configuration se résume en six étapes à faire via la console d'administration de Cherokee.

Donc, dans la console d’administration de Cherokee, sélectionnez le vhost précédemment créé puis activez l’onglet "Behavior" et cliquez sur "Rule Management".

La première règle à configurer est celle par défaut et nous allons l’utiliser pour toutes les réécritures ce qui entre autre va nous permettre d’activer les URL propres dans Spip.

Match: default
Handler: redirection
         Type: internal
         Regular Expression: ^(rubrique|article|breve|mot|auteur|site)(\d+)(\.html)?$
         Substitution: spip.php?page=$1&id_$1=$2
         Type: internal
         Regular Expression: ^([1-9][0-9]*)$
         Substitution: spip.php?action=redirect&type=article&id=$1
         Type: internal
         Regular Expression: ^[^\.]+(\.html)?$
         Substitution: spip.php?url_propre=$1
         Type: internal
         Regular Expression: /(robots\.txt|favicon\.ico|sitemap\.xml)?$
         Substitution: spip.php?page=$1
         Type: internal
         Regular Expression: /(\d+)$
         Substitution: spip.php?action=redirect&id=$1&type=article
         Type: internal
         Regular Expression: ^/$
         Substitution: spip.php
         Type: internal
         Regular Expression: ^/\?(.*)$
         Substitution: spip.php?$1
         Type: internal
         Regular Expression: ^/ecrire/\?(.*)$
         Substitution: /ecrire/index.php?$1
         Type: internal
         Regular Expression: ^/ecrire/$
         Substitution: /ecrire/index.php
         Type: internal
         Regular Expression: ^/ecrire$
         Substitution: /ecrire/index.php
         Type: internal
         Regular Expression: ^([^\.]+)(\.html)?\?(.*)$
         Substitution: spip.php?url_propre=$1&$3
Encoding:
         Gzip support: allow
         Deflate support: allow

La deuxième règle va gérer l’accès aux fichiers et répertoires de notre installation de Spip

match: File Exists
         match any file: Enabled
         Use I/O Cache: Enabled
         Only match files: Enabled
         If dir, check index files: Enabled
Handler: List & Send
         Use I/O cache: Enabled
         Allow symbolic links: Allow
Encoding:
         GZip support: Allow
         Deflate support: Allow

La troisième règle va interdire l’accès aux répertoires /config et /tmp de Spip

Match: Directory
         Web Directory: /config
         or
         Web Directory: /tmp
Handler: HTTP Error
         HTTP Error: 403 Forbidden

La quatrième règle va interdire l’accès aux répertoires .svn (utile si vous avez installé Spip via SVN et/ou si vous gérez vos Squelettes avec SVN)

Match: Regular Expression
         Regular Expression: /(.*/)?\.svn
Handler: HTTP Error
         HTTP Error: 403 Forbidden

La cinquième règle va gérer tout se qui se trouve dans les répertoires /IMG et /local en mode statique.

Match: Directory
         Web Directory: /IMG
         or
         Web Directory: /local
Handler: Static Content
         Use I/O cache: Enabled
Encoding:
         GZip support: Allow
         Deflate support: Allow

La sixième règle va configurer php

Match: Extensions
         Extensions: php
         Check local file: Check
Handler: FastCGI
         Error handler: Enabled
         Check file: Enabled
         Pass Request Headers: Enabled
         Balancer: Round Robin
Encoding:
         GZip support: Allow
         Deflate support: Allow
Time:
         Timeout: 30

Voila, notre vhost est configuré. Reste à cliquer sur "Save" (tout en haut à droite) et à procéder à un "redémarrage gracieux" pour activer notre configuration.

http://blog.strangeblackhole.com/Cherokee-6-regles-pour-Spiper-en.html

Voila, pour laisser une trace sur la liste.

StrangeBlackHole

Super !
Merci, je vais essayer dès que j’aurai tordu le cou à Varnish et nGinX :slight_smile:

2011/9/1 StrangeBlackHole <fabrice.coutant@strangeblackhole.com>

01/09/2011, StrangeBlackHole:

La quatrième règle va interdire l’accès aux répertoires .svn (utile
si vous avez installé Spip via SVN et/ou si vous gérez vos Squelettes
avec SVN)

Match: Regular Expression
         Regular Expression: /(.*/)?\.svn
Handler: HTTP Error
         HTTP Error: 403 Forbidden

En étant parano, on pourrait même mettre un 404 sur .svn, car 403
indique que le répertoire existe, et donc qu'on est probablement en
version de dev, avec les failles de sécurité potentielles que ça peut
laisser supposer. Ça indique aussi que le serveur peut établir des
connexions sortantes sur un port TCP (3690), et aussi qu'on peut mettre
le code à jour via SVN.
Au final ces trois informations ne sont pas des failles de sécurité en
tant que telles, mais sont des appuis possibles quand on veut pirater
une machine.
Autant ne pas trop en dire (et au passage fermer toutes les connexions
sortantes, autoriser les sorties HTTP et SVN via un proxy si et quand
on veut faire des updates et des installations de plugins via le serveur
directement (à éviter), et vérifier que le serveur web n'a pas les
droits en écriture sauf quand/où c'est vraiment nécessaire).