Article archivé de 2014. Conservé à titre d’archive ; la technologie est obsolète.

Configuration de WordPress avec NGINX

4 min de lecture

J’ai installé plusieurs sites WordPress sur mon nouveau VPS tournant sous NGINX.

Installer WordPress avec NGINX n’est pas aussi compliqué qu’il y paraît, mais il faut faire quelques réglages pour renforcer la sécurité et le faire fonctionner avec les plugins de cache.

Comme plugin de cache, j’ai choisi W3 Total Cache, car la méthode « Page Cache », « disk:enhanced » permet de servir des pages HTML statiques de mon site et il apporte d’autres améliorations de performance.

Je ne vais pas détailler tout le processus d’installation et de configuration de NGINX. Ici, vous trouverez des tutoriels si c’est ce que vous cherchez.

Vous devez d’abord inclure la configuration de votre domaine/serveur dans « /etc/nginx/sites-available ». Créez un nouveau fichier avec ce contenu et adaptez-le à votre domaine et à vos chemins :

 1server {
 2    listen   80; ## listen for ipv4
 3    listen   [::]:80; ## listen for ipv6
 4    server_name domain.com;
 5    access_log /var/log/nginx/domain.com.access.log;
 6    error_log  /var/log/nginx/domain.com.error.log;
 7 
 8    root /folder/with/wordpress/installation/;
 9    
10    # Include wordpress config file
11    include sites-available/wordpress.conf;
12}

Comme j’ai plusieurs installations WordPress sur mon serveur, je vais séparer la configuration de WordPress dans un autre fichier et l’utiliser dans mes différentes configurations de serveur. J’ai créé un nouveau fichier nommé « wordpress.conf » dans « /etc/nginx/sites-available » (le fichier est commenté pour expliquer les différentes options) :

 1index index.php index.html;
 2 
 3set $cache_uri $request_uri;
 4    
 5# POST requests and urls with a query string should always go to PHP
 6if ($request_method = POST) {
 7    set $cache_uri 'null cache';
 8}   
 9if ($query_string != "") {
10    set $cache_uri 'null cache';
11}   
12# Don't use the cache for logged in users or recent commenters
13if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
14    set $cache_uri 'null cache';
15}
16 
17# Use cached or actual file if they exists, otherwise pass request to WordPress
18location / {
19    rewrite ^([^.]*[^/])$ $1/ permanent;
20    try_files /wp-content/cache/page_enhanced/${host}${cache_uri}_index.html $uri $uri/ /index.php?$args;
21}
22 
23location ~ ^/wp-content/cache/minify/[^/]+/(.*)$ {
24   try_files $uri /wp-content/plugins/w3-total-cache/pub/minify.php?file=$1;
25}    
26 
27#    Show "Not Found" 404 errors in place of "Forbidden" 403 errors, because
28#    forbidden errors allow attackers potential insight into your server's
29#    layout and contents
30  error_page 403 =404;
31 
32#    Prevent access to any files starting with a dot, like .htaccess
33#    or text editor temp files
34  location ~ /\. { access_log off; log_not_found off; deny all; }
35 
36#    Prevent access to any files starting with a $ (usually temp files)
37  location ~ ~$ { access_log off; log_not_found off; deny all; }
38 
39#    Do not log access to robots.txt, to keep the logs cleaner
40  location = /robots.txt { access_log off; log_not_found off; }
41 
42#    Do not log access to the favicon, to keep the logs cleaner
43  location = /favicon.ico { access_log off; log_not_found off; }
44 
45#    Keep images, CSS and other static files around in browser cache for
46#    as long as possible, to cut down on server load
47location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
48    expires max; log_not_found off; access_log off;
49}
50 
51#    Common deny or internal locations, to help prevent access to areas of
52#    the site that should not be public
53  location ~* wp-admin/includes { deny all; }
54  location ~* wp-includes/theme-compat/ { deny all; }
55  location ~* wp-includes/js/tinymce/langs/.*\.php { deny all; }
56  location /wp-content/ { internal; }
57  location /wp-includes/ { internal; }
58#    Protects the wp-config.php|readme.html|license.txt files from being 
59#    accessed (uncomment after wordpress installation)
60#  location ~ /(\.|wp-config.php|readme.html|license.txt) { deny all; }
61 
62#    Prevent any potentially-executable files in the uploads directory from
63#    being executed by forcing their MIME type to text/plain
64  location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php)$ {
65      types { }
66      default_type text/plain;
67  }
68 
69#    Add trailing slash to */wp-admin requests so the admin interface
70#    works correctly
71  rewrite /wp-admin$ $scheme://$host$uri/ permanent;
72 
73location ~ \.php$ {
74    fastcgi_pass   127.0.0.1:9000;
75    fastcgi_index  index.php;
76    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
77    include        fastcgi_params; 
78}

Vous devez maintenant créer un lien symbolique du premier fichier que vous avez créé dans « /etc/nginx/sites-enabled » et redémarrer NGINX.

Après cela, vous pouvez installer WordPress normalement. Une fois l’installation terminée, décommentez la ligne 59 du fichier « wordpress.conf » ( location ~ /(.|wp-config.php|readme.html|license.txt) { deny all; } ) pour interdire l’accès au fichier config.php, au readme et à la licence.

Pour le plugin W3 Total Cache, vous pouvez activer le Page Cache en « disk:enhanced » pour servir les pages en cache de votre site. Vous pouvez aussi activer la minification ou n’importe quelle autre option (Object et Database Cache, CDN, etc.). Le « Browser cache » n’est pas vraiment nécessaire, car NGINX s’en charge.

Et c’est tout 🙂 Tout commentaire ou amélioration est le bienvenu.

Sources :

– https://rtcamp.com/wordpress-nginx/tutorials/

– http://blog.bigdinosaur.org/wordpress-on-nginx/