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].

Ensuite, il faut quelques lignes de magie pour gérer les URL générées par Dotclear, ajoutées à la fin de /etc/nginx/fastcgi_params.conf :

fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

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

location ~ \.php$ {
	try_files $uri =404;
	fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; #le nom exact de ce fichier dépend de votre distribution (ici Ubuntu 18.04) !
	fastcgi_index index.php;
	include /etc/nginx/fastcgi_params;
}

À 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, en la laissant en query_string, 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 {
	# Pseudo PATH_INFO dotclear reste configure en QUERY_STRING
	rewrite ^/index.php /dotclear/index.php last; 
	rewrite ^/(.*) /dotclear/index.php?$1;
}

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$ {
	try_files $uri =404;
	fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;	#le nom exact de ce fichier dépend de votre distribution (ici Ubuntu 18.04) !
	fastcgi_index index.php;
	include /etc/nginx/fastcgi_params;
	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 {
	# Pseudo PATH_INFO dotclear reste configure en QUERY_STRING
	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;

	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$ {
		try_files $uri =404;
		include /etc/nginx/fastcgi_params;
		fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
		fastcgi_index index.php;
		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 {
		# Pseudo PATH_INFO dotclear reste configure en QUERY_STRING
		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.