Saya memiliki Apache2 dengan PHP + PHP-FPM yang dikonfigurasi sesuai dengan:
http://wiki.apache.org/httpd/PHP-FPM
Saya menulis sebuah skrip yang akan membutuhkan waktu lama untuk dieksekusi pada Vhost internal, tetapi terus waktunya, semuanya berjalan dengan sempurna jika skrip dijalankan dalam waktu kurang dari 30 detik.
Log apache saya memberi tahu saya:
[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:
Saat mencoba menjalankan skrip, saya diberikan 503 Service Unavailable
waktu eksekusi tepat 30 detik. Secara logis ini berarti saya memiliki arahan batas waktu atau pengaturan yang diatur ke 30 detik, tetapi saya memilikinya di konfigurasi Vhost saya:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
(php-fpm berjalan pada port 9001 untuk saya)
Saya juga telah mencoba menempatkan Timeout
dan ProxyTimeout
di httpd.conf
dengan tidak ada perbedaan.
Tampaknya ada pengaturan batas waktu lain di suatu tempat yang khusus untuk mod_proxy_fcgi
, tetapi saya tidak dapat menemukannya. Saya menginstal Apache2 httpd dari tarball resmi, tidak ada mod yang tampaknya datang dengan file konfigurasi.
Kalau ada yang bisa mengarahkan saya ke arah yang benar itu akan sangat dihargai.
sumber
Saya ingin menunjukkan bahwa walaupun jawaban ini bekerja dengan baik untuk versi yang lebih lama, itu rusak di bawah versi terbaru dari Apache 2.4 dengan kode kesalahan AH00526.
ProxyPass
danProxyPassMatch
atau<Proxy>
dan<ProxyMatch>
tidak dapat digunakan bersama dalam nama pekerja yang sama. Ini digunakan untuk berfungsi dengan baik, jadi tidak tahu apakah itu diubah oleh desain atau apakah itu bug.Apa pun itu, Anda dapat memperbaikinya dengan hanya menggunakan ProxyPassMatch dengan parameter 'batas waktu = 120' (atau apa pun nilai yang Anda inginkan), mis::
sumber
Saya memiliki Apache 2.4.6, tetapi tambalan untuk memperbaikinya disediakan di Apache> = 2.4.8. Kuncinya di sini adalah untuk memulai output Anda segera sehingga Apache (mod_proxy_fcgi) menganggap koneksi sedang aktif.
Misalnya, saya menggunakan PHP dan permintaan DB untuk panggilan AJAX saya membutuhkan> 30 detik. Karena saya tahu bahwa respons keseluruhan akan menjadi "Tipe Konten: aplikasi / json", saya segera mengirim tajuk itu.
sumber
Bukankah seharusnya:
Pastikan pengaturan php.ini max_execution_time diatur ke 600 juga. (periksa phpinfo () di laman langsung untuk memastikan Anda melihat nilai aktual yang digunakan)
Seperti kata Jenny, atur pengaturan php-fpm
(catat di akhir)
Tidak banyak yang bisa dikonfigurasikan dengan mod_proxy_fcgi sendiri, seperti yang Anda lihat di halaman apache. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html
Aktifkan debug debug php-fpm juga sehingga Anda dapat melihat di mana waktu di luar sana. http://php-fpm.org/wiki/Configuration_File (aktifkan juga catch_workers_output)
Dan nyalakan debug level logging untuk modul mod_proxy dan mod_proxy_fcgi karena Anda menggunakan apache 2.4. Fitur yang sangat bagus, nyalakan hanya untuk modul yang Anda butuhkan: http://httpd.apache.org/docs/current/mod/core.html#loglevel
Jika itu tidak membantu, kirim file konfigurasi php-fpm Anda.
Sebagai upaya terakhir, mungkin beberapa daemon membunuh proses yang berjalan lama?
sumber
Saya mencatat bahwa Anda menggunakan PHP-FPM. Saya juga menggunakannya, tetapi dengan Apache 2.4.6.
Dengan asumsi bahwa masalah telah ada selama beberapa waktu, tampaknya nilai batas waktu untuk itu
mod_proxy_fcgi
adalah kode sulit . Saya menulis apa yang saya temukan di sinisumber
Karena Anda telah memperbaiki pengaturan waktu tunggu di apache, itu seharusnya tidak menjadi masalah. Tempat kedua untuk dilihat adalah peralatan jaringan apa pun, tetapi karena Anda melakukan proxy ke server Anda sendiri, itu juga tidak mungkin. Jadi tempat yang tersisa untuk melihat adalah di server backend.
Ih file konfigurasi untuk php-pfm, cari
Ini harus diatur ke yang sama dengan, atau sedikit di bawah, pengaturan batas waktu di apache.
sumber
request_terminate_timeout
ke 400, masih tidak ada perubahan :( Saya punya perasaan bahwa ada sesuatu yang perlu saya aturmod_proxy_fcgi
, tetapi sepertinya tidak datang dengan file konfigurasi.Selain batas waktu, setel enablereuse = off. Saya menemukan ketika itu pada beberapa permintaan untuk skrip yang berjalan lama akan bekerja dengan benar dan yang lainnya akan dibunuh lebih awal.
sumber
Posting ini mengubah seluruh kesepakatan untuk saya.
Tambahkan baris berikut ke file httpd.conf Anda :
sumber