Je ne détaillerai pas ici l’installation même du serveur, mais bien la part de configuration qui concerne Dotclear. Il existe de nombreux tutoriels pour installer et configurer un serveur dit LEMP[1].
Mise en place
Vous devez avoir installé Nginx, un serveur de base de données (MySQL ou son clone libre MariaDB, PostgreSQL ou, si vous êtes joueur, SQLite), et PHP-FPM[2].
Puis, dans le fichier qui gère l’hôte de votre Dotclear, quelques règles de sécurité (Nginx ne tient pas compte des .htaccess livrés dans Dotclear)
location ~ /dotclear/(inc|cache|db|plugins|var) { #on interdit l’accès direct aux dossiers protégés de Dotclear
deny all;
access_log off;
log_not_found off;
}
et, bien sûr, les instructions pour faire traiter le php par php-fpm (je reprends ici le fichier /etc/nginx/snippets/fastcgi-php.conf, on modifiera ensuite pour la réécriture d’URL)
location ~ [^/]\.php(/|$) { # l’expression régulière permet de prendre en compte les urls en path_info
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_pass unix:/var/run/php/php-fpm.sock; # l’emplacement du socket php-fpm peut varier suivant votre système
}
À partir de là, installez Dotclear et votrejolisite.com/dotclear/index.php? pourra afficher votre page d’accueil ! On va pouvoir affiner.
Rediriger depuis la racine
Si vous souhaitez que Dotclear s’affiche à la racine de votre site, il n’est pas nécessaire d’y ajouter un index.php[3]. Vous pouvez définir comme url http://votrejolisite.com/ et définir la méthode de lecture de l’url en PATH_INFO, puis ajouter ces lignes de réécriture dans la configuration Nginx :
location / {
try_files $uri $uri/ @dotclear_path_info; # vérifier si le fichier ou dossier existe, et sinon, renvoyer le traitement à Dotclear
}
location @dotclear_path_info {
rewrite ^/index.php /dotclear/index.php last;
rewrite ^/(.*) /dotclear/index.php/$1;
}
et modifier la section concernant le traitement php comme suit :
location ~ [^/]\.php(/|$) { # l’expression régulière permet de prendre en compte les urls en path_info
(…)
# redirection vers @dotclear_path_info si le fichier n’existe pas (permet notamment d’afficher les 404 de Dotclear pour tout le site)
try_files $fastcgi_script_name @dotclear_path_info;
(…)
}
Multi-blogs
Pour une installation multi-blogs, on peut utiliser aussi la réécriture d’URL si on ne souhaite pas créer un dossier par blog, en utilisant la constante DC_BLOG_ID, définie dans l’index.php de Dotclear si elle n’a pas été définie ailleurs. Il faut simplement ajouter un paramètre fastcgi qui sera envoyé à PHP.
location ~ [^/]\.php(/|$) {
(…)
fastcgi_param DC_BLOG_ID $dotclear_id; # identifiant du blog Dotclear qu’on veut appeler
}
Et ensuite, on n’a plus qu’à définir $dotclear_id à chaque location correspondant à un blog du multi-blog.
location / {
set @dotclear_id default;
try_files $uri $uri/ @dotclear_path_info; # vérifier si le fichier ou dossier existe, et sinon, renvoyer le traitement à Dotclear
}
location /blog1 {
set @dotclear_id blog1;
try_files $uri $uri/ @dotclear_path_info; # vérifier si le fichier ou dossier existe, et sinon, renvoyer le traitement à Dotclear
}
#et on n’oublie pas toutes les redirections
location @dotclear_path_info {
rewrite ^/blog1/?(.*) /dotclear/index.php/$1 last;
rewrite ^/index.php /dotclear/index.php/$1 last;
rewrite ^/(.*) /dotclear/index.php/$1;
}
Configuration complète exemple
Pour finir, un exemple de configuration, inspirée de celle qui fait fonctionner les sites des plugins de DotAddict.
server {
listen 80;
server_name example.org;
root /var/www; # emplacement des fichiers du site sur le serveur
index index.php /dotclear/index.php;
access_log /var/log/www/example.log;
error_log /var/log/www/example.log;
# pour Dotclear 2.35 et plus, pour gérer les thèmes modifiables
if ($request_uri ~* "^/index\.php(\?.*)") {
return 301 https://$host/$1;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Deny all attempts to config files such as .htaccess, .htpasswd
location ~ /\.ht {
deny all;
access_log off;
log_not_found off;
}
location ~ /dotclear/(inc|cache|db|plugins|var) { #on interdit l’accès direct aux dossiers protégés de Dotclear
deny all;
access_log off;
log_not_found off;
}
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ { #optimisation du cache pour les images et feuilles de style
expires max;
log_not_found off;
}
location ~ [^/]\.php(/|$) {
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_pass unix:/var/run/php/php-fpm.sock; # l’emplacement du socket php-fpm peut varier suivant votre système
fastcgi_param DC_BLOG_ID $dotclear_id;
}
location /dotclear {
set $dotclear_id default;
try_files $uri $uri/ =404;
}
location /blog1 {
set $dotclear_id blog1;
try_files $uri $uri/ @dotclear_path_info;
}
location /blog2 {
set $dotclear_id blog2;
try_files $uri $uri/ @dotclear_path_info;
}
location / {
set $dotclear_id default;
try_files $uri $uri/ @dotclear_path_info;
}
location @dotclear_path_info {
rewrite ^/blog2/?(.*) /dotclear/index.php/$1 last;
rewrite ^/blog1/?(.*) /dotclear/index.php/$1 last;
rewrite ^/(.*) /dotclear/index.php/$1;
}
}
N’hésitez pas à partager vos propres astuces, j’éditerai cette fiche au besoin.


Commentaires