ugrás a tartalomhoz

Debian VPS + Nginx + PHP-FPM: hibaüzenet nélkül leáll a futás

fchris82 · 2010. Szep. 7. (K), 14.15
Van egy művelet, amiben egy feltöltött excel táblát kell feldolgozni. A saját gépemen, Apache-csal gond nélkül lefut, amióta pedig kikapcsoltam a php.ini-ben az output_buffering-et - http://weblabor.hu/forumok/temak/105632#comment-69444 -, szépen és folyamatosan tájékoztat arról is, hogy a feldolgozás éppen hol tart. Ismétlem: a saját gépemen.

A szerveren viszont nem akar lefutni a dolog. Egyrészt egyáltalán nem hajlandó folyamatosan írogatni, hogy mi van, vhol bizony bufferol. Tölt-tölt, majd megjelenik a 125. sorig, hogy OK, tölt tovább, majd a töltés abbamarad. Az nginx logban csak ennyi van:
2010/09/07 14:04:07 [error] 7959#0: *3 readv() failed (104: Connection reset by peer) while reading upstream, client: 123.123.123.123, server: vmi.hu, request: "GET /backend_dev.php/products/importLoad/i
d/1 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "vmi.hu", referrer: "http://vmi.hu/..."
A php-fpm logjában pedig:
Sep 07 14:03:11.169651 [WARNING] fpm_children_bury(), line 215: child 32207 (pool default) exited on signal 15 SIGTERM after 1405.441110 seconds from start
Sep 07 14:03:11.169682 [WARNING] fpm_children_bury(), line 215: child 5701 (pool default) exited on signal 15 SIGTERM after 1152.482899 seconds from start
Sep 07 14:03:11.169708 [WARNING] fpm_children_bury(), line 215: child 11267 (pool default) exited on signal 15 SIGTERM after 831.433262 seconds from start
Sep 07 14:03:11.169734 [WARNING] fpm_children_bury(), line 215: child 20263 (pool default) exited on signal 15 SIGTERM after 679.433691 seconds from start
Sep 07 14:03:11.169760 [WARNING] fpm_children_bury(), line 215: child 9759 (pool default) exited on signal 15 SIGTERM after 373.431525 seconds from start
Egyszerűen azt se tudom, hova nyúljak ... :-/

nginx.conf
user  www-data;
worker_processes  2;

error_log  logs/error.log  notice;

events {
    worker_connections 768;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    client_body_buffer_size 0;

    sendfile            on;
    tcp_nopush          off;
    tcp_nodelay         on;

    keepalive_timeout  0;
    #keepalive_timeout  10 10;

    gzip  off;
    gzip_comp_level 1; gzip_proxied any;
    gzip_types text/plain text/css application/x-javascript application/xml+rss text/javascript;

    ignore_invalid_headers  on;

    include /usr/local/nginx/sites-enabled/*;
}
php.ini
magic_quotes_gpc=0

output_buffering = Off
max_execution_time = 300
display_errors = On
log_errors = On
error_log = /usr/local/logs/php-errors.log
memory_limit = 256M
php-fpm.conf
<?xml version="1.0" ?>
<configuration>

        All relative paths in this config are relative to php's install prefix

        <section name="global_options">

                Pid file
                <value name="pid_file">/usr/local/logs/php-fpm.pid</value>

                Error log file
                <value name="error_log">/usr/local/logs/php-fpm.log</value>

                Log level
                <value name="log_level">notice</value>

                When this amount of php processes exited with SIGSEGV or SIGBUS ...
                <value name="emergency_restart_threshold">10</value>

                ... in a less than this interval of time, a graceful restart will be initiated.
                Useful to work around accidental curruptions in accelerator's shared memory.
                <value name="emergency_restart_interval">1m</value>

                Time limit on waiting child's reaction on signals from master
                <value name="process_control_timeout">5s</value>

                Set to 'no' to debug fpm
                <value name="daemonize">yes</value>

        </section>

        <workers>

                <section name="pool">

                        Name of pool. Used in logs and stats.
                        <value name="name">default</value>

                        Address to accept fastcgi requests on.
                        Valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'
                        <value name="listen_address">127.0.0.1:9000</value>

                        <value name="listen_options">

                                Set listen(2) backlog
                                <value name="backlog">-1</value>

                                Set permissions for unix socket, if one used.
                                In Linux read/write permissions must be set in order to allow connections from web server.
                                Many BSD-derrived systems allow connections regardless of permissions.
                                <value name="owner">www-data</value>
                                <value name="group">www-data</value>
                                <value name="mode">0666</value>
                        </value>

                        Additional php.ini defines, specific to this pool of workers.
                        <value name="php_defines">
                <!--            <value name="sendmail_path">/usr/sbin/sendmail -t -i</value>            -->
                <!--            <value name="display_errors">0</value>                                                          -->
                        </value>

                        Unix user of processes
                        <value name="user">www-data</value>

                        Unix group of processes
                        <value name="group">www-data</value>

                        Process manager settings
                        <value name="pm">

                                Sets style of controling worker process count.
                                Valid values are 'static' and 'apache-like'
                                <value name="style">static</value>

                                Sets the limit on the number of simultaneous requests that will be served.
                                Equivalent to Apache MaxClients directive.
                                Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
                                Used with any pm_style.
                                <value name="max_children">5</value>

                                Settings group for 'apache-like' pm style
                                <value name="apache_like">

                                        Sets the number of server processes created on startup.
                                        Used only when 'apache-like' pm_style is selected
                                        <value name="StartServers">20</value>

                                        Sets the desired minimum number of idle server processes.
                                        Used only when 'apache-like' pm_style is selected
                                        <value name="MinSpareServers">5</value>

                                        Sets the desired maximum number of idle server processes.
                                        Used only when 'apache-like' pm_style is selected
                                        <value name="MaxSpareServers">35</value>

                                </value>

                        </value>

                        The timeout (in seconds) for serving a single request after which the worker process will be terminated
                        Should be used when 'max_execution_time' ini option does not stop script execution for some reason
                        '0s' means 'off'
                        <value name="request_terminate_timeout">30s</value>

                        The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
                        '0s' means 'off'
                        <value name="request_slowlog_timeout">30s</value>

                        The log file for slow requests
                        <value name="slowlog">logs/slow.log</value>

                        Set open file desc rlimit
                        <value name="rlimit_files">1024</value>

                        Set max core size rlimit
                        <value name="rlimit_core">0</value>

                        Chroot to this directory at the start, absolute path
                        <value name="chroot"></value>

                        Chdir to this directory at the start, absolute path
                        <value name="chdir"></value>

                        Redirect workers' stdout and stderr into main error log.
                        If not set, they will be redirected to /dev/null, according to FastCGI specs
                        <value name="catch_workers_output">yes</value>

                        How much requests each process should execute before respawn.
                        Useful to work around memory leaks in 3rd party libraries.
                        For endless request processing please specify 0
                        Equivalent to PHP_FCGI_MAX_REQUESTS
                        <value name="max_requests">500</value>

                        Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
                        Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
                        Makes sense only with AF_INET listening socket.
                        <value name="allowed_clients">127.0.0.1</value>

                        Pass environment variables like LD_LIBRARY_PATH
                        All $VARIABLEs are taken from current environment
                        <value name="environment">
                                <value name="HOSTNAME">$HOSTNAME</value>
                                <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
                                <value name="TMP">/tmp</value>
                                <value name="TMPDIR">/tmp</value>
                                <value name="TEMP">/tmp</value>
                                <value name="OSTYPE">$OSTYPE</value>
                                <value name="MACHTYPE">$MACHTYPE</value>
                                <value name="MALLOC_CHECK_">2</value>
                        </value>

                </section>

        </workers>

</configuration>
 
1

Timeout

janoszen · 2010. Szep. 7. (K), 20.31
Mobilról vagyok, úgyhogy nem látom a hibaüzenet végét, de én akkor tapasztaltam ilyet, amikor a program túl sokáig nem küld kimenetet és ezért a PM azt hiszi, hogy meghalt. Próbálj meg valami kimenetet küldeni. Ha az sem segít, straceld meg a PM-et.
2

Nincs hibaüzenet

fchris82 · 2010. Szep. 8. (Sze), 19.45
A PHP elméletileg folyamatosan küld a kimenetre. 1 sor kb tart 0.2-0.4 másodpercig, és ilyen időközönként echo-z, hogy "x.sor [OK]\n" . De nem jelenik meg. Eltelik egy kis idő, aztán kilistáz 125 sort, majd tölt még egy kicsit, végül hibaüzenet nélkül abbahagyja a töltést...

Most kaptunk 256 helyett 1 GB memóriát, de továbbra is ez a helyzet. Az én gépemen ugyanaz, Apache-csal lefut.
3

Flush

janoszen · 2010. Szep. 9. (Cs), 05.40
Az echo kevés, flusholnod is kell a kimenetet. Nézd meg az output buffering beállításokat is.

Az, hogy a Te gépeden megy, elég irreleváns, mert egyrészt gondolom, nem FastCGI-vel van confolva, másrészt talán még csak nem is Linux és valszeg a beállítások is úgy vannak betekerve, hogy Neked kényelmes legyen. Kérd meg a rendszergazdátokat, hogy confoljon Neked a gépedre valami virtuális gépbe olyat, ami a szerveren is van, csak debug beállításokkal.
4

nginx lesz a ludas

fchris82 · 2010. Szep. 9. (Cs), 08.50
Flusholom is. Az Nginx azonban továbbra is vár, majd kiír 125 sort, tölt, majd abbamarad a töltés. Pedig már ott is nullára állítottam mindent. :(

Ezt a virtuális szerver dolgot majd megcsinálom a gépemen, jó ötlet, csak nem most, talán holnap. A következőt csináltam:
Frontend - Nginx
Backend - Nginx átirányít a 8000-es portra, ahol már egy Apache figyel

Az admin feladatok ellátáshoz kell csak ez a mizéria. Most Apache-csal normálisan lefut a szerveren is a dolog. Kértünk nagyobb memóriát is. Most be kell vinnem egy csomó adatot, import-export, stb, stb... Átmenetileg jó lesz így, csak kerüljenek már fel az adatok.
5

Akár

janoszen · 2010. Szep. 9. (Cs), 19.50
Hát jó, ez is egy megoldás, bár ha nem tudtok FastCGI-re fejleszteni, nem tudom, minek használtok az nginx-et.
6

Kompromisszum

fchris82 · 2010. Szep. 9. (Cs), 23.06
Jelenleg, az elején, kevés erőforrásból kell kihozni a legtöbbet. Ezért az Nginx. Az Apache-csal már voltak gondjaink VPS-en, "megzabálta" a memóriát - nem is kapott mondjuk sokat.
Egy helyen van gondunk a FastCGI-vel, az admin felületen, amikor másik szerverről vagy fájlból kell importálni nagyobb mennyiségű adatot. Ez nem ok arra, hogy leszedjük az Nginx-et és maradjon csak az Apache frontendre is. Persze még lehetne kombinálni, hogy a PHP-t átadom az Apache-nak, az Nginx meg csak a statikus tartalmakkal foglalkozik. Lehet, az lesz.