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.

Notes

[1] Le E représente Nginx dans l’acronyme, en raison de la façon dont on le prononce EnGineX

[2] FPM pour FastCGI Process Manager. Là où Apache utilise un module pour traiter les requêtes PHP, Nginx les adresse à PHP-FPM et lui « délègue » le traitement.

[3] Selon la méthode détaillée ici.