Proxy Error 502 "Alasan: Kesalahan membaca dari server jauh" dengan Apache 2.2.3 (Debian) mod_proxy dan Jetty 6.1.18

80

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:::

sumber
Hai .. Saya masih terjebak dengan yang ini. Semua pengaturan di atas mencoba dan juga meningkatkan maxIdleTime jetty tidak membantu. Adakah petunjuk apa yang harus dicoba selanjutnya?
Martin

Jawaban:

91

Saya sudah memecahkan masalah. Itu Keepalive=Onharus dimasukkan ke dalam ProxyPassbaris konfigurasi:

ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On

Lihat itu

Keepalive=On

sana? Sangat penting;)

Martin
sumber
9
Saya yakin Anda dapat menandai jawaban Anda sendiri sebagai Diterima. Ini menandai pertanyaan yang diselesaikan dalam sistem untuk ditemukan orang lain.
sysadmin1138
Di mana tepatnya Anda meletakkan ini?
AlxVallejo
1
@AlxVallejo Anda harus menemukan file config Anda di sini /etc/apache2/sites-enabled/[sitename[.conf
Steven
1
Kami memiliki kesalahan proxy yang persis sama. Mereka jarang terjadi (satu dari seribu permintaan). Mengapa hal itu Keepalive=Onsangat penting?
dokaspar
Mungkinkah itu bukan timeout=600atau retry=1yang memperbaiki ini? (atau kombo)
MattBianco
4

Sudahkah Anda mencoba pengaturan setenv proxy-initial-not-pooled 1?

Referensi di sini

TCampbell
sumber
Tidak, ini tidak membantu. Maka ini bukan tentang kondisi balapan, ini penundaan yang lama dan sesuatu terjadi di antaranya (semacam kesalahpahaman antara Jetty dan mod_proxy).
4

Kesalahan ini juga dapat terjadi jika Anda tidak mengakhiri url proxy Anda dengan a /. Kedua jalur harus diakhiri dengan /atau tidak.

Menandai
sumber
1

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
"Ketika Anda mengakses server Jetty secara langsung, apakah sumber daya ini benar-benar membutuhkan waktu lama untuk menghasilkan respons?" -- IYA. Saya juga mencoba mengatur ProxyTimeout ini ke 600. Tidak membantu. Tidak ada firewall antara proxy dan jetty. Timeout dikonfigurasi juga di ProxyPass.
"Anda tidak memberikan apa pun yang berharga untuk mengidentifikasi apa yang mungkin terjadi": Saya tidak tahu apa itu. Yang saya dapatkan hanyalah pesan kesalahan dari server: Kesalahan Proxy Server proxy menerima respons yang tidak valid dari server upstream. Server proxy tidak dapat menangani permintaan GET /. Alasan: Kesalahan membaca dari server jauh
Sedangkan untuk meningkatkan batas waktu proxy, apakah ini juga mengubah waktu browser Anda berputar sebelum mendapatkan kesalahan 502?
Kemudian dengan cara bagaimana Anda bisa mengetahui apa yang terjadi di server aplikasi: Anda bisa mengambil beberapa dump thread, dan melihat dari mereka apa yang sedang dieksekusi ketika browser sedang menunggu. Atau, tambahkan pernyataan debug logging yang cukup untuk dapat melacak kode Anda untuk menunjukkan penyebab lambatnya.
Saya tahu mengapa ini lambat. Saya tidak tahu mengapa proksi apache menolak respons ketika akhirnya siap.
0

Bagi saya menghapus nilai header yang disebut Transfer-Encoding" (binary)di server-app (PHP) saya memecahkan masalah untuk:

[proxy_http: error] [pid 17623] (22) Argumen tidak valid: [client 127.0.0.1:44929] AH01102: baris status pembacaan kesalahan dari server jauh 0.0.0.0:80

Semua saran lain suka SetEnv proxy-initial-not-pooledatau Keep-Alivetidak.

stackoverclan
sumber
0

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.

CommaToast
sumber
1
setiap perpustakaan membawa fitur yang berbeda, tidak perlu terkait dengan proksi
Arnold Roa