Apache menerima permintaan di port: 80 dan mem-proxy-kannya ke Jetty di port: 8080
The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.
Dilema saya: Semuanya berfungsi normal secara normal (permintaan cepat, beberapa detik atau beberapa puluh detik permintaan panjang diproses ok ). Masalah terjadi ketika pemrosesan permintaan memakan waktu lama (beberapa menit?).
Jika saya mengeluarkan permintaan sebagai gantinya langsung ke Jetty di port: 8080 permintaan diproses OK. Jadi masalah cenderung duduk di suatu tempat antara Apache dan Jetty di mana saya menggunakan mod_proxy . Bagaimana cara mengatasinya?
Saya sudah mencoba beberapa "trik" terkait pengaturan KeepAlive, tanpa hasil. Ini konfigurasi saya saat ini, ada saran?
#keepalive Off ## I have tried this, does not help
#SetEnv force-proxy-request-1.0 1 ## I have tried this, does not help
#SetEnv proxy-nokeepalive 1 ## I have tried this, does not help
#SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help
KeepAlive 20 ## I have tried this, does not help
KeepAliveTimeout 600 ## I have tried this, does not help
ProxyTimeout 600 ## I have tried this, does not help
NameVirtualHost *:80
<VirtualHost _default_:80>
ServerAdmin [email protected]
ServerName www.mydomain.fi
ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com
ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600
ProxyPassReverse / http://www.mydomain.fi:8080/
RewriteEngine On
RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi
RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L]
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature On
</VirtualHost>
Berikut ini juga log debug dari permintaan yang gagal:
74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
Jawaban:
Saya sudah memecahkan masalah. Itu
Keepalive=On
harus dimasukkan ke dalamProxyPass
baris konfigurasi:Lihat itu
sana? Sangat penting;)
sumber
Keepalive=On
sangat penting?timeout=600
atauretry=1
yang memperbaiki ini? (atau kombo)Sudahkah Anda mencoba pengaturan
setenv proxy-initial-not-pooled 1
?Referensi di sini
sumber
Kesalahan ini juga dapat terjadi jika Anda tidak mengakhiri url proxy Anda dengan a
/
. Kedua jalur harus diakhiri dengan/
atau tidak.sumber
Melihat log, ada sesuatu yang habis dalam 5 menit (= 300 detik). Itu waktu yang cukup lama untuk menunggu jawaban. Ketika Anda mengakses server Jetty secara langsung, apakah sumber daya ini benar-benar membutuhkan waktu lama untuk menghasilkan respons?
Jika lima menit benar-benar dalam waktu respons yang memungkinkan, Anda dapat mencoba mengubah arahan konfigurasi ProxyTimeout.
Bergantung pada pengaturan jaringan Anda, mungkin tidak ada alasan untuk mencoba menggunakan sistem keepalive (apakah ada firewall antara server aplikasi dan proksi yang mungkin dikonfigurasikan untuk menghentikan sesi yang terlalu lama menganggur?) , tetapi ProxyTimeout akan memengaruhi perilaku proxy itu sendiri.
Jika proksi yang sama juga melayani backend lain, akan lebih baik untuk menjaga ProxyTimeout saat ini, dan mengkonfigurasi batas waktu dalam arahan ProxyPass (lihat dokumentasi mod_proxy).
Namun, jika respons tanpa proxy secara konsisten kurang dari lima menit yang dilihat di sini sebagai batas cut-off, maka mungkin benar-benar ada beberapa gangguan aneh antara proxy dan server aplikasi, tetapi Anda tidak memberikan apa pun dari nilai untuk mengidentifikasi apa yang mungkin terjadi.
sumber
Bagi saya menghapus nilai header yang disebut
Transfer-Encoding" (binary)
di server-app (PHP) saya memecahkan masalah untuk:Semua saran lain suka
SetEnv proxy-initial-not-pooled
atauKeep-Alive
tidak.sumber
Jika solusi di atas tidak berfungsi, satu hal yang dapat Anda coba adalah mengaktifkan semua modul apache Anda untuk memastikan bahwa tidak ada beberapa modul yang Anda butuhkan yang entah bagaimana dinonaktifkan secara tidak sengaja.
Misalnya, bagaimana saya menemukan penyebab masalah saya adalah mengganti semua instance #LoadModule dengan LoadModule di semua file konfigurasi Apache saya. Karena itu memecahkan masalah bagi saya, maka saya tahu bahwa masalah saya bukanlah argumen direktif "KeepAlive" yang hilang, melainkan masalah saya adalah ketergantungan yang hilang.
Karena, ingat, file .so pada dasarnya adalah pustaka statis. Memiliki modul yang diaktifkan tidak berarti akan digunakan, tetapi memiliki satu dinonaktifkan berarti tidak dapat digunakan, dan karena itu, apa pun yang bergantung padanya pasti akan gagal.
Catatan: jawaban ini telah menerima beberapa suara turun karena fakta bahwa jawaban awal saya sepertinya menyarankan agar semua modul diaktifkan, selamanya. Meskipun secara teoritis Anda bisa melakukan itu tanpa harus merusak apa pun, itu jelas bukan solusi praktik terbaik.
Jadi, harap dipahami, saya hanya menyarankan ini sebagai langkah pemecahan masalah, bukan solusi akhir.
Juga, harap dicatat: Saya menggunakan proyek git khusus untuk melacak semua file konfigurasi apache mesin lokal saya. Dengan begitu saya bisa melakukan operasi pencarian dan ganti global semacam ini di direktori kerja konfigurasi apache saya, sebagai langkah pemecahan masalah. Jika mengaktifkan semua modul berhasil, coba nonaktifkan lagi satu per satu dan mulai ulang apache di antaranya, hingga Anda menemukan modul mana yang perlu tetap diaktifkan. Setelah Anda mengetahuinya, maka reset repo kembali ke keadaan semula, dan hanya aktifkan satu modul yang perlu tetap diaktifkan.
Anda juga akan menemukan bahwa menggunakan git untuk melacak file konfigurasi apache Anda membersihkan direktori-direktori tersebut, karena Anda tidak akan memerlukan file-file .bak dan .default yang kuno lagi.
sumber