1 votes

Wordpress admin sur nginx+php5-fpm sur VPS incroyablement lent. Les autres applications/WP front-end fonctionnent bien

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.

1voto

n1000 Points 7136

C'est vrai - après deux jours de ma vie et beaucoup d'apprentissage sur des choses comme xdebug, je peux répondre à ma propre question et dire en toute sécurité qu'il est IMPOSSIBLE de faire tourner Wordpress 3.3 - même une toute nouvelle installation sans plugins - sur un VPS avec moins de 512Mb de RAM. Ce qui est dommage, parce que le VPS de 256Mb avait toujours été parfaitement bon auparavant.

Auparavant, tout allait bien. Vous vous souvenez que dans ma question initiale, j'ai noté la ligne "ALERT - script a essayé d'augmenter memory_limit à 268435456 bytes ce qui est au dessus de la valeur autorisée" ?

J'ai également noté que je ne voyais pas de pic de mémoire dans l'utilitaire de ligne de commande "top". Mais manifestement, il ne rafraîchit pas les données assez rapidement. Avec un peu d'aide de l'hôte du VPS qui a des outils graphiques, nous avons vu des rafales de 228Mb d'utilisation lorsque la partie ADMIN de WP 3.3 essayait de se charger. Mais la partie frontale ? Eh bien, comme je l'ai dit plus haut, il a filé à toute allure et n'est même pas apparu sur leur graphique.

Peu de temps après, j'ai trouvé ceci : http://www.dev4press.com/2011/blog/benchmark/wordpress-benchmark-3-0-vs-3-1-vs-3-2-vs-3-3/ qui confirme mes résultats, mais ne montre pas tout à fait la même utilisation de la mémoire.

J'ai temporairement déménagé sur un VPS de 512Mb RAM pendant que je décide quoi faire, et, bien sûr, WP fonctionne à nouveau très bien. Mais ce n'est pas une solution abordable à long terme. Il va donc falloir soit essayer de revenir en arrière, soit chercher un autre CMS. Ce qui est dommage, après 5 ans de Wordpressing heureux.

Note finale pour anticiper l'inévitable commentaire "mais on peut trouver des VPS de 1Gb RAM très bon marché de nos jours", oui, c'est possible. Et j'ai été gravement brûlé de cette façon et c'est tout ce que je dis à ce sujet. On en a pour son argent - mais il est préférable de payer pour 256 que pour 512...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X