Skocz do zawartości
Gość Rafiki

nginx + php-fpm nie daje rady

Polecane posty

Gość Rafiki

Posiadam VPS:
6 x 2,4 Ghz (intel Xenon - debian 7 64 bit)
8GB ramu
dysk SSD

na tym VPS stoi tylko nginx + php-fpm

na osobnym vps ( 2x3Ghz + 3GB ram - centos 6 64bity) stoi tylko baza danych MariaDB.

Myślałem ,że taka konfiguracja będzie super wydajna i była gdy na serwerze hostowałem małe stronki nie przekraczające kilkudziesięciu użytkowników w ciągu dnia.

Od niedawna przeniosłem na moje "maszyny" sklep oparty na prestashop, który ma dziennie ok. 1 500 unikalnych wejść i już zaczął się problem.
Wieczorami gdy sklep ma największe obciązenie jest najgorzej, wtedy często pojawia się błąd 504 bad gateaway.

Sklep ma swój pool w php-fpm ale niestety gdy online jest już kilkanaście osób VPS nie wytrzymuje, sklep ładuje się "godzinami" o ile się załaduje albo wywala w/w błąd. Procesor obciążony jest często w 100% (wszystkich 6 rdzeni). Nie wiem czym może to być spowodowane.
A może poprostu taka konfiguracja jest za słaba na preste i online 20 osób ? (a co dopiero jak przyjdą święta i osob online będzie 30 - 40 wole nie myśleć :) )

Poniżej konfiguracja nginx oraz vhosta do sklepu oraz php-fpm


Prosiłbym o rady co powinienem zmienic albo chociaż gdzie szukać aby rozwiązać ten problem.
Z góry wielkie dzięki.

PS. Najdziwniejsze było ty gdy chwili przełączyłem sklep na apache2-worker + php-fpm "zatykał" się mniej niż nginx z phpem i generował mniejsze zużycie CPU. Ale i tak wyżej opisywane sytuacje miały miejsce tylko jakby z mniejszym nasileniem.

nginx.conf

user www-data;
worker_processes 6;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 90;
    types_hash_max_size 2048;
    server_tokens off;
    client_max_body_size 10m;
    client_body_buffer_size 128k;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


vhost

server {
    listen      80;
    #server_name bb.vpsfi.pl www.bb.vpsfi.pl;
    server_name bba.vpsfi.pl www.bba.vpsfi.pl brooklynbutik.pl www.brooklynbutik.pl bb.vpsfi.pl www.bb.vpsfi.pl;
    root        /home/brooklynbutik/public_html/;

    location / {
    index index.php index.html index.htm;
    }

        # Shop
        rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
        rewrite ^/([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$1$2$3.jpg last;
        rewrite ^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3$4.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4$5.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5$6.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6$7.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7$8.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8$9.jpg last;
        rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9$10.jpg last;
        rewrite ^/c/([0-9]+)(\-[\.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+\.jpg$ //img/c/$1$2$3.jpg last;
        rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+\.jpg$ /img/c/$1$2.jpg last;
        rewrite ^/images_ie/?([^/]+)\.(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/$1.$2 last;
        rewrite ^/order$ /index.php?controller=order last;
        rewrite ^/allegro/(.*)$ http://brookly1.o11.pl/allegro/allegro/$1 last;
        rewrite ^/adm/&token(.*)$ /adm/index.php?controller=AdminDashboard&token$1 last;
        rewrite ^/adm/index.php$ /adm/index.php?controller=AdminDashboard&token last;

        if (!-e $request_filename) {
                rewrite ^/.*$ /index.php last;
        }

        location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm-brooklynbutik.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param                   SCRIPT_FILENAME /home/brooklynbutik/public_html$fastcgi_script_name;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 14k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
}

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    access_log        off;
    log_not_found     off;
    expires           360d;
}

access_log off;
log_not_found off;
error_log /var/log/nginx-error.log warn;

    # static file cache configuration
    location ~* .(gif)$ {
    expires 2592000s;
    }
    location ~* .(jpeg|jpg)$ {
    expires 2592000s;
    }
    location ~* .(png)$ {
    expires 2592000s;
    }
    location ~* .(css)$ {
    expires 604800s;
    }
    location ~* .(js)$ {
    expires 604800s;
    }
    location ~* .(js)$ {
    expires 604800s;
    }
    location ~* .(ico)$ {
    expires 31536000s;
    }

}

php-fpm

[brooklynbutik]

user = brooklynbutik
group = brooklynbutik

listen = /var/run/php5-fpm-brooklynbutik.sock

listen.backlog = -1

listen.owner = www-data
listen.group = www-data
;listen.mode = 0660
 
;listen.allowed_clients = 127.0.0.1

pm = dynamic

pm.max_children = 100

pm.start_servers = 6

pm.min_spare_servers = 6

pm.max_spare_servers = 12

;pm.process_idle_timeout = 10s;
 
pm.max_requests = 500

rlimit_files = 131072
 
rlimit_core = unlimited

catch_workers_output = yes
 
chdir = /
 
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f postmaster@vpsfi.pl
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 256M

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Przede wszystkim presta często bywa tragiczna i pewnie warto byłoby bardzo dokładnie przeanalizować co w niej powoduje problemy.

Ale tak poza tym testowałeś jak się sprawuje ten zewnętrzny MySQL? Czy przypadkiem provider nie ucina Ci przepustowości pomiędzy serwerami, albo w ogóle jak wyglądają opóźnienia w komunikacji?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Po pierwsze, wywal te rewrite'y i popraw sprawdzanie, czy plik istnieje w konfigu nginksa. Metodą Kopiego-Paste'a chyba to pisałeś, co? Wygląda tragicznie.

 

Po drugie, musisz ustalić, co generuje obciążenie: nginx, php, baza danych? Na pewno problem jest z CPU? Nie przypadkiem z I/O?

 

Albo w ogóle z konfiguracją? Nie kończą się deskryptory albo coś takiego? Pokaż błędy z logów nginksa i php.

Edytowano przez spindritf (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Pewnie open files limit masz domyslny 1024. Daj wieksza wartosc, naprawde wieksza. Potem php sprobuj na tcp zamiast socket'a, bo jak VPS to roznir bywa. Czasami zewnetrzna baza nie przyspiesza, ale to sprawdz na koncu. Jakby dalej mulilo to odezwij sie na PW, zerkne i moze cos pomoge.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Rafiki

Dziękuje wszystkim za rady. Niestety dopiero teraz mam możliwośc odpisać.

 

Przetestowałem wszystkie opisane tutaj możliwości i jeszcze więcej znalezionych w Internecie - niestety żadnych zmian nie dały, przynajmniej podszkoliłem się trochę w linuxie ;)

 

Co do rewritów były one wzięte z strony nginx'a na temat presty jak ją odpalić i wątpie czy jak w przypadku Wordpressa wystarczy jedna linijka ale jeśli się mylę z chęcia poznam lepsze rozwiązanie.

 

Co do szybkości ładowania sklepu i jego zamulania problem nie stał wcale po stronie serwera

Serwer miał zbyt duże obciązenia gdy wchodziło na sklep juz kilkanaście osób (nie mówiąc o 100 - 200 online gdzie teraz taka liczba nie robi wrażenia na VPS'ie :) ). Problem stał po stronie presty która miała ustawione cacheowanie do memcached (który oczywiście był zainstalowany i uruchomiony na serwerze) - niestety jakis "bufor" się zapychał po kilku wejściach i na tym się kończyło. Wyłączenie tej opcji w prestashop spowodowało normalne działanie tzn takie ,że przy odwiedzalności 10tys wejść sklep działa szybciutko :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×