Mod_fcgid ili mod_fastcgi?

Pozdrav

Do sad se nisam bas nesto posebno igrao sa Apache osim standarnog mpm-prefork-a sa mod_php ali iz vise razloga potreban mi je worker i jedna od navedenih opcija. Ono sto sam do sad pratio jeste odlican Adisov tutorijal na http://localhost.ba/Docs/Apache/UltimatePHPSetup . On ocigledno preporucuje fcgid : ).

Ono sto me nervira kod fcgid je sto ne postoji neko ‘samostalno’ upravljanje procesima pa tako php wrapperi ostaju u procesu dozivotno : )

Kakva su vasa iskustava sa fastcgi? Sta je brze,stabilnije od ove dvije opcije ?

tnx.

[quote=amar-ze]Pozdrav

Do sad se nisam bas nesto posebno igrao sa Apache osim standarnog mpm-prefork-a sa mod_php ali iz vise razloga potreban mi je worker i jedna od navedenih opcija. Ono sto sam do sad pratio jeste odlican Adisov tutorijal na http://localhost.ba/Docs/Apache/UltimatePHPSetup . On ocigledno preporucuje fcgid : ).

Ono sto me nervira kod fcgid je sto ne postoji neko ‘samostalno’ upravljanje procesima pa tako php wrapperi ostaju u procesu dozivotno : )

Kakva su vasa iskustava sa fastcgi? Sta je brze,stabilnije od ove dvije opcije ?

tnx.[/quote]
hehehe, ne ostaju :slight_smile: samo moraš imati dobar fcgid.conf :wink:

Mislim da će ti se javiti Adis, ne želim da mu uskratim to zadovoljstvo, ipak je on donio fcgid u BiH :wink:

Koristi mod_fcgid 2.3.6 ili noviji (zvanični Apache projekat!)
http://httpd.apache.org/mod_fcgid/

Obrati pažnju na parametre:

[code]## Process Management ##

    # fastcgi application lifetime (3600)
    # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidprocesslifetime
    FcgidProcessLifeTime 1800

    # Max total process count (1000)
    # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxprocesses
    FcgidMaxProcesses X

    # FcgidMaxProcessesPerClass - Max process count of one class of fastcgi application (100)
    # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxprocessesperclass
    FcgidMaxProcessesPerClass Y

    # Min process count of one class of fastcgi application
    # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidminprocessesperclass
    FcgidMinProcessesPerClass 1

    # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestsperprocess
    FcgidMaxRequestsPerProcess 2048

    # (128k by default wtf)
    # http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestlen
    FcgidMaxRequestLen 512000000[/code]

Koristi sljedeću PHP wrapper skriptu za SuEXEC:

#!/bin/sh PHPRC="/etc/php5/cgi" PHP_FCGI_CHILDREN=0 PHP_FCGI_MAX_REQUESTS=0 export PHPRC PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS exec /usr/bin/php-cgi
Moj tutorijal je rađen za stari mod_fcgid (1.2?), dosta verzija 2.2 i 2.3 je bilo bugovito, a tek su verzije 2.3.5 i 2.3.6 kosher (i izdate su pod okriljem Apache projekta)

Ko u 2011 koristi mod_php treba na sysadmin reedukaciju :smiley:

Koliko vidim Debian Squeeze ima upravo taj http://packages.debian.org/squeeze/libapache2-mod-fcgid . Moze li tvoj fcgid.conf jer ja u svom imam samo ovo, a ne da mi se na Debianu kompajlirati source :stuck_out_tongue: :

<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi FcgidConnectTimeout 20 </IfModule>

Naravno da može, samo zamijeni X i Y sa željenim ciframa.

Trebaće ti i

ili u fcgid.conf ili unutar ‘Directory’ sekcije za željeni vhost (uz FcgidWrapper)

Mislio sam vise da mi zakacis svoj conf na pastebin i sl. : ) . U Apache vhostu vec imam tu direktivu AddHandler

Pa to ti je najvažniji dio confa.

  1. FcgidMaxProcesses:
  • Odlučiš za koju količinu RAM-a želiš dodijeliti PHP procesima, npr 512MB,
  • Postaviš php_memory_limit na razumnu veličinu (npr. 128MB)
  • Procijeniš koliko prosječni PHP proces troši RAM-a, npr 16MB

= 512/16 = 32 = FcgidMaxProcesses

  1. FcgidMaxProcessesPerClass

Odrediš koliko maksimalno resursa može potrošiti jedan vhost, npr 25%, th

FcgidMaxProcessesPerClass = 8

  1. Testiraš, revidiraš postavke, testiraš, revidiraš postavke nakon određenog vremena korištenja :smiley:

Bice da ovaj moj Apache ili totalno ignorise /etc/apache2/mods-enabled/fcgid.conf ili nesto ne radi kako treba. Npr imam:

[code]
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 20

fastcgi application lifetime (3600)

Scan Interval

FcgidIdleScanInterval 190

http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidprocesslifetime

FcgidProcessLifeTime 180

Max total process count (1000)

http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxprocesses

FcgidMaxProcesses 8

FcgidMaxProcessesPerClass - Max process count of one class of fastcgi application (100)

http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxprocessesperclass

FcgidMaxProcessesPerClass 8

Min process count of one class of fastcgi application

http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidminprocessesperclass

FcgidMinProcessesPerClass 1

http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestsperprocess

FcgidMaxRequestsPerProcess 2048

(128k by default wtf)

http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxrequestlen

FcgidMaxRequestLen 512000000
[/code]
… i PHP proces opet ne “umre” nakon 3 minute :confused:

Provjeri PID, trebao bi biti novi proces svakih par minuta (3 minute je premalo, probaj sa > 5)

Ako te bas nervira taj jedan preforked PHP postavi
FcgidMinProcessesPerClass 0

Dodatno podpitanje(a) : ) . Recimo da imam usera amar koji u svom www direktoriju ima 5 stranica(vhostova). Podesio sam FcgidMaxProcessesPerClass 2 no koliko sam skontao svaki vhost ce da pokrene 2 procesa samim tim 5 vhostova = 10 procesa. Postoji li kakva mogucnost ogranicavanja max procesa po useru ?

Mislim da ne:
https://issues.apache.org/bugzilla/show_bug.cgi?id=49902

cgroups?

I opet se onda vracam na svoj pocetni post : ). Nemam kontrole na procesima. Ovako jednostavno svaki vhost “jede” koliko hoce cak i ako stavim FcgidMaxProcessesPerClass 0 . Ako ga limitiram sa npr FcgidMaxProcesses 8 doci cu do trenutka kad ce X vhost traziti 9 proces i onda ce dobiti nesto kao error 503 sve dok ne restartam Apache ili dok neki od fcgid procesa ne “umre” sam… Da ne spominjem da je potrosnja memorije u ovom slucaju neogranicena i vrlo brzo ulazi u swap : ). Zanima me kako si ti rijesio ove stvari… ?

Kako nemaš kontrole?

Postaviš FcgidMaxProcesses koliko mašina moze maksimalno izdržati (npr 20)
Postaviš FcgidMaxProcessesPerClass na 50% (10)

10 PHP procesa može odraditi popriličan broj requesta. Npr. ako za jedan request treba 150 ms, 66 req/s

Čim jedan PHP proces odradi request, spreman je za sljedeći. U tvom primjeru, ako dođe 11 zahtjev, biće odbijen, ali nema potrebe za restartom apache-a ili slično, jer dovoljno je uraditi refresh u browseru i velika je vjerovatnoća da će neki “PHP slot” biti slobodan da izvrši zahtjev. Nema govora o neograničenoj potrošnji memorije ili slično.