Apache2 Proxy zaman aşımı


23

Apache2'ye göre PHP + PHP-FPM ile ayarlandı:

http://wiki.apache.org/httpd/PHP-FPM

Dahili bir Vhost'ta yürütmesi uzun zaman alacak bir komut dosyası yazıyorum, ancak zaman aşımına uğradı, komut dosyası 30 saniyeden kısa sürede çalıştırılırsa her şey kusursuz çalışıyor.

Apache günlüğüm bana şunları söylüyor:

[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:

Komut dosyasını çalıştırmaya çalışırken 503 Service Unavailable, yürütme süresinden tam olarak 30 saniye sonra bana verilir . Mantıksal olarak bu, zaman aşımı direktifine veya ayarına 30 saniyeye ayarlı olduğum anlamına gelir, ancak bunları Vhost'un yapılandırmasında var:

Timeout 600
<IfModule proxy_module>
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
    ProxyTimeout 600
</IfModule>

(php-fpm benim için 9001 portunda çalışıyor)

Ben de yerleştirerek denedim Timeoutve ProxyTimeoutde httpd.confhiçbir fark ile.

Görünen o ki, kendine özgü bir yerde zaman aşımı ayarı var mod_proxy_fcgiama bulamıyorum. Apache2 httpd'yi resmi tarball'dan yükledim, modların hiçbiri herhangi bir yapılandırma dosyası ile gelmedi.

Biri beni doğru yöne götürebilirse çok memnun olurum.

Yanıtlar:


32

Sonunda birkaç yapılandırma parametresini test ettikten sonra bu sorunu düzelttim. Daha önceki tüm değişiklikleri kaldırarak çözümü iki kez test ettim. Bunu düzeltmek için sadece bir parametreye ihtiyaç vardı.

Httpd ve mod_proxy_fcgi'nin en son sürümleri timeout=için ProxyPassMatchsatırın sonuna ekleyebilirsiniz , örneğin:

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

Eski versiyonlar için biraz daha karmaşıktı, örneğin:

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1

Zaman aşımını 30 dakikaya ayarlamak için Proxy direktifini eklemem gerekiyordu. Bazı uygulamalarda, genellikle veritabanı çalıştırırken, yürütülmesi 10 dakikadan fazla sürebilen rutinler vardır. Geçici olarak zaman aşımını 30 dakikaya ayarlayıp bitirmelerini sağlamak için. Çok fazla zaman alan yükleme sihirbazını kullanırken özellikle yararlıdır (benim düşünceme göre).

Bu arada, bu sorunu çözmeme yardımcı olan intial girdi aşağıdaki URL adresinde bulundu .


1
Apache, AH00526: ProxyPass / <Proxy> ve ProxyPassMatch / <ProxyMatch> 'in son sürümlerinde kırılmış gibi görünüyor, aynı işçi adıyla birlikte kullanılamaz
Stewart Adam

4
ProxyPassMatch satırının sonuna 'timeout = 120' parametresini ekleyerek yukarıdakileri çözdüm.
Stewart Adam

@Palantir bunu duyduğuma sevindim! Cevap olarak gönderildi .
Stewart Adam,

İhtiyacım olan iki şey daha: İlk önce, global apache yapılandırma dosyanızdaki "Timeout" ve "ProxyTimeout" öğelerini diğer FPM zaman aşımlarından daha uzun olacak şekilde ayarlayın. İkincisi, FPM havuzum bir unix soketinde dinliyordu ve SetHandler'ı şöyle kullandım: [SetHandler "proxy: unix: /var/run/php/example.com-php7.0-fpm.sock | fcgi: // localhost: 8000 "]. Ancak <Proxy>, SetHandler satırının fcgi: // localhost bölümünde (gerçekte bile kullanılmamış | | SONRA kısmı) eşleşir ve unix: / var / run / part ile eşleşmez. bu yüzden yukarıdaki kullanım için zaman aşımını yapılandırmak için: <Proxy fcgi: // localhost: 8000> ve <Proxy unix: / var / run / ...
Profesör Falken

9

Bu cevabın eski versiyonlar için harika çalışmasına rağmen , Apache 2.4'ün AH00526 hata koduyla son sürümlerinde kırıldığını belirtmek isterdim. ProxyPassve ProxyPassMatchveya <Proxy>ve <ProxyMatch>aynı işçi adına birlikte kullanılamaz. Bu sadece iyi çalışmak için kullanılır, bu yüzden tasarım tarafından değiştirilip değiştirilmediğini veya bir böcek olup olmadığını bilmeyin.

Her iki durumda da, bunu yalnızca 'timeout = 120' parametresi olan ProxyPassMatch kullanarak (veya istediğiniz değer ne olursa olsun) ayarlayabilirsiniz, örneğin:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120

6

Apache 2.4.6'ya sahibim, ancak düzeltmek için gereken yamalar Apache> = 2.4.8. Buradaki anahtar , çıktınızı hemen başlatmak , böylece Apache (mod_proxy_fcgi), bağlantının aktif olduğunu düşünüyor.

Örneğin, PHP kullanıyorum ve AJAX çağrım için DB sorgusu> 30 saniye sürüyor. Genel yanıtın "Content-Type: application / json" olacağını bildiğim için, bu başlığı hemen gönderirim.

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

2

Olmamalıydı:

<IfModule mod_proxy.c>

Php.ini ayarının max_execution_time ayarının da 600 olarak ayarlandığından emin olun. (Kullanılan gerçek değeri gördüğünüzden emin olmak için canlı sayfadaki phpinfo () kontrol edin)

Jenny'nin dediği gibi php-fpm ayarını yapın

request_terminate_timeout 610s

(sonunda s dikkat edin)

Apache sayfasında görebileceğiniz gibi, mod_proxy_fcgi ile yapılandırılacak fazla bir şey yok. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

Ayrıca php-fpm hata ayıklama günlüğünü açın, böylece nerede zaman aşımına uğradığını görebilirsiniz. http://php-fpm.org/wiki/Configuration_File (ayrıca catch_workers_output'u açar)

Ve apache 2.4 kullandığınızdan beri mod_proxy ve mod_proxy_fcgi modülleri için hata ayıklama seviyesi günlüğünü açın. Çok hoş bir özellik, sadece ihtiyacınız olan modüller için açın: http://httpd.apache.org/docs/current/mod/core.html#loglevel

Bunlar yardımcı olmazsa, php-fpm config dosyanızı kaydedin.

Son çare olarak, belki de bazı cennet uzun süren bir süreci öldürüyor?


2

PHP-FPM kullandığınızı belirttim. Ben de kullanıyorum, ancak Apache 2.4.6 ile.

Süre sorunu var olduğunu varsayarsak, onun için zaman aşımı değeri olduğunu gibi görünüyor mod_proxy_fcgiedilir sert kodlanmış . Burada ne bulduğumu yazdım


1

Zaman aşımı ayarlarını apache'de düzelttiğinden beri, sorun olmamalı. Bakılacak ikinci yer, herhangi bir ağ ekipmanı olacaktır, ancak kendi sunucunuza proxy sunucusu olduğunuzdan bu mümkün değildir. Bu yüzden bakılacak kalan yer arka uç sunucusunda.

Ih php-pfm için config dosyası, bak

; This is a hard kill switch on php execution.  It ignores the
; max_execution_time that can be set/changed with php_ini.  Basically
; it avoids timeout issues between apache and php-fpm.
request_terminate_timeout=30

Bu, apache'deki zamanaşımı ayarıyla aynı veya biraz altında olmalıdır.


1
request_terminate_timeout400'ü ayarladım , hala bir değişiklik yok :( Yapmam gereken bir şey olduğu hissine sahibim mod_proxy_fcgi, ancak herhangi bir yapılandırma
dosyasıyla gelmedi

0

Zaman aşımına ek olarak, enablereuse = off olarak ayarlayın. Uzun süredir çalışan senaryoların bazı istekleri olduğunda, doğru çalışacağını ve diğerlerinin erken öldürüldüğünü öğrendim.


0

Bu gönderi benim için anlaşmayı değiştirdi.

Apache'nin mod_reqtimeout'u varsayılan değeri kullanmayacak gibi gözüküyor .

Httpd.conf dosyanıza aşağıdaki satırları ekleyin :

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.