Je pensais qu'il s'agissait d'une question StackOverflow, mais j'ai trouvé que Nginx+php5-fpm était discuté ici à Qu'est-ce qui ne va pas dans ma configuration php-fpm ? Je vais donc poster ici. Les autres recherches effectuées sont des recherches multiples concernant la lenteur de wordpress avec une configuration similaire, mais dans tous les autres cas que j'ai pu trouver, c'était le front-end ET le back-end qui étaient lents, pas seulement l'administrateur. Voici mes spécifications :
Wordpress 3.3 sur Ubuntu 11.10 + Nginx 1.0.10 + php5-fpm 5.3.8 + ISPconfig 3.0.4.1 + 256Mb VPS
J'ai un magasin Zen Cart et phpbb3, tous deux dans des pools php-fpm différents. Il n'y a pratiquement rien d'autre qui tourne que l'essentiel et ces deux sites s'envolent à toute allure. Il en va de même pour l'interface du site Wordpress, lorsque W3TC est accéléré.
BUT.... le côté administrateur prend 6-10 secondes pour faire quoi que ce soit. Il n'y a rien dans le slow log de mysql, ou dans le log d'erreur de php-fpm, la charge ne monte pas en flèche, et l'utilisation de la mémoire ne monte pas en flèche (mais voir ci-dessous à propos de la mémoire).
La première fois qu'il se charge, à wp-admin/options.php, il affiche une très longue page qui n'a pas l'air correcte, avec des lignes et des lignes comme...
active_plugins SERIALIZED DATA
Voici les principaux éléments de ps_mem.py
732.0 KiB + 87.5 KiB = 819.5 KiB bash
2.1 MiB + 369.0 KiB = 2.4 MiB fail2ban-server
1.8 MiB + 2.0 MiB = 3.9 MiB nginx (5)
5.1 MiB + 12.8 MiB = 17.9 MiB php5-fpm (29)
87.8 MiB + 149.0 KiB = 88.0 MiB mysqld
---------------------------------
116.2 MiB
=================================
Voici la moyenne de la charge presque tout le temps : moyenne de la charge : 0.48, 0.53, 0.51
Et voici le résultat de free -m
total used free shared buffers cached
Mem: 241 202 38 0 3 49
-/+ buffers/cache: 149 92
Swap: 511 29 482
Voici le fichier nginx.conf, y compris les paramètres real_ip de cloudflare (j'ai aussi essayé sans cloudflare), ainsi que la réécriture nécessaire pour que les permaliens fonctionnent sous nginx :
server {
listen 31.172.x.x:80;
server_name mysite.co.uk www.mysite.co.uk www.my-site.co.uk my-site.co.uk;
root /var/www/mysite.co.uk/web;
index index.html index.htm index.php index.cgi index.pl index.xhtml;
error_page 400 /error/400.html;
error_page 401 /error/401.html;
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 405 /error/405.html;
error_page 500 /error/500.html;
error_page 502 /error/502.html;
error_page 503 /error/503.html;
error_log /var/log/ispconfig/httpd/mysite.co.uk/error.log;
access_log /var/log/ispconfig/httpd/mysite.co.uk/access.log combined;
## Disable .htaccess and other hidden files
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location /stats {
index index.html index.php;
auth_basic "Members Only";
auth_basic_user_file /var/www/clients/client3/web9/.htpasswd_stats;
}
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/lib/php5-fpm/web9.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_intercept_errors on;
}
set_real_ip_from 204.93.240.0/24;
set_real_ip_from 204.93.177.0/24;
set_real_ip_from 199.27.128.0/21;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
real_ip_header CF-Connecting-IP;
client_max_body_size 28M;
client_body_buffer_size 128k;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?q=$1 last;
break;
}
#include /var/www/mysite.co.uk/web/nginx.conf;
}
Voici le pool php5-fpm
[web9]
listen = /var/lib/php5-fpm/web9.sock
listen.owner = web9
listen.group = client3
listen.mode = 0660
user = web9
group = client3
pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
chdir = /
php_admin_value[open_basedir] = /var/www/clients/client3/web9/web:/var/www/clients/client3/web9/tmp:/var/www/mysite.co.uk/web:/srv/www/mysite.co.uk/web:/usr/share/php5:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin
php_admin_value[session.save_path] = /var/www/clients/client3/web9/tmp
php_admin_value[upload_tmp_dir] = /var/www/clients/client3/web9/tmp
php_admin_value[date.timezone] = "UTC"
php_admin_value[post_max_size] = 28M
php_admin_value[session.gc_maxlifetime] = 604800
php_admin_value[upload_max_filesize] = 28M
php_admin_flag[display_errors] = off
php_admin_flag[display_startup_errors] = off
php_admin_flag[log_errors] = off
php_admin_flag[ignore_repeated_errors] = off
php_admin_flag[ignore_repeated_source] = off
php_admin_value[memory_limit] = 32M
J'ai dû modifier le fichier /etc/php5/conf.d/suhosin.ini comme suit conseillé par phpmyadmin et j'ai également augmenté la limite de mémoire pour WP car j'obtenais "ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value".
; configuration for php suhosin module
extension=suhosin.so
suhosin.executor.include.whitelist="phar"
suhosin.request.max_vars=2048
suhosin.post.max_vars=2048
suhosin.request.max_array_index_length=256
suhosin.post.max_array_index_length=256
suhosin.request.max_totalname_length=8192
suhosin.post.max_totalname_length=8192
suhosin.get.max_value_length=1024
suhosin.memory_limit=128M
J'ai réduit la limite de mémoire dans wp-config.php comme indiqué ci-dessous.
define('WP_MEMORY_LIMIT', '32M');
define('WP_MAX_MEMORY_LIMIT', '32M');
Bien que j'aie modifié ces limites de 256 à 128, puis de 64 à 32, cela n'a fait aucune différence pour les vitesses avant et arrière.
Voici mon fichier fastcgi_params, que je poste ici parce que j'ai dû faire un changement comme conseillé aquí pour corriger le path_info concaténé cassé que php continue d'envoyer :
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
# fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_URL $script_url;
fastcgi_param SCRIPT_URI $scheme://$http_host$script_url;
# fastcgi_param SCRIPT_FILENAME $document_root$script_filename;
# fastcgi_param PATH_INFO $path_info;
# fastcgi_param PATH_TRANSLATED $document_root$path_info;
#try_files $fastcgi_script_name =404;
J'ai remis le thème par défaut, désactivé tous les plugins, remplacé toutes les tables mysql par innodb et suivi les recommandations de mysqltuner (même si, comme je l'ai dit, il n'y a rien à propos d'un mysql lent dans les logs que je peux voir).
J'ai essayé de changer php-fpm de socket à port et vice-versa, et ainsi de suite. Je ne sais pas vraiment quoi faire d'autre maintenant - est-ce que quelqu'un peut repérer quelque chose ici ou donner des conseils ?
La chose la plus étrange de toutes ? Je fais tourner une installation personnelle de WP sur une "petite" instance gratuite sur Amazon S3 avec une configuration similaire, et ça marche du tonnerre. C'est ce qui rend le diagnostic encore plus difficile.
Et oui, il se peut que je manque un peu de mémoire, mais alors pourquoi Zen Cart et phpbb fonctionnant avec une grosse base de données chargent des pages en moins de 200ms alors que mon installation de wordpress est de 10 petites pages ? Et, pour répondre à une autre question - oui, la lenteur persiste si je désactive les autres sites.