พร็อกซีข้อผิดพลาด 502“ เหตุผล: เกิดข้อผิดพลาดในการอ่านจากเซิร์ฟเวอร์ระยะไกล” พร้อม Apache 2.2.3 (Debian) mod_proxy และ Jetty 6.1.18


80

Apache กำลังรับคำขอที่พอร์ต: 80 และส่งไปยัง Jetty ที่พอร์ต: 8080

The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.

ภาวะที่กลืนไม่เข้าคายไม่ออกของฉัน:ทุกอย่างทำงานได้ตามปกติ (การร้องขออย่างรวดเร็วไม่กี่วินาทีหรือการร้องขอความยาวไม่กี่สิบวินาทีมีการประมวลผลok ) ปัญหาเกิดขึ้นเมื่อการประมวลผลคำขอใช้เวลานาน (ไม่กี่นาที)

หากฉันส่งคำขอโดยตรงไปยังท่าเทียบเรือที่พอร์ต: 8080 คำขอจะได้รับการดำเนินการตกลง ดังนั้นปัญหาที่เกิดขึ้นคือมีแนวโน้มที่จะนั่งที่ไหนสักแห่งระหว่าง Apache และท่าเทียบเรือที่ฉันใช้mod_proxy วิธีแก้ปัญหานี้

ฉันได้ลองใช้ "เทคนิค" บางอย่างที่เกี่ยวข้องกับการตั้งค่า KeepAlive โดยไม่มีโชค นี่คือการกำหนดค่าปัจจุบันของฉันคำแนะนำใด ๆ

#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 webmaster@mydomain.fi

    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>

นี่คือบันทึกการดีบักจากคำขอที่ล้มเหลว:

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

สวัสดี .. ฉันยังคงติดอยู่กับอันนี้ พยายามตั้งค่าทั้งหมดข้างต้นและเพิ่ม maxIdleTime ของท่าเทียบเรือไม่ได้ช่วย พอยน์เตอร์ใดที่ควรลองสิ่งต่อไป
มาร์ติน

คำตอบ:


91

ฉันแก้ไขปัญหาแล้ว Keepalive=Onควรจะแทรกเข้าไปในProxyPassสายการกำหนดค่า:

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

เห็นไหมว่า

Keepalive=On

มี? มันเป็นสิ่งสำคัญ;)


9
ฉันเชื่อว่าคุณสามารถทำเครื่องหมายคำตอบของคุณเองเป็นที่ยอมรับ มันทำเครื่องหมายคำถามตามที่ได้รับการแก้ไขในระบบเพื่อให้คนอื่นค้นพบ
sysadmin1138

คุณใส่สิ่งนี้ไว้ตรงไหน?
AlxVallejo

1
@AlxVallejo คุณควรหาไฟล์ปรับแต่งของคุณได้ที่นี่/etc/apache2/sites-enabled/هsitename Same.conf
Steven

1
เรามีข้อผิดพลาดพร็อกซีเดียวกันทั้งหมด เกิดขึ้นน้อยมาก (หนึ่งในคำขอพัน) ทำไมตรงนั้นเป็นKeepalive=Onสำคัญ?
dokaspar

เป็นไปไม่ได้timeout=600หรือretry=1ที่จะแก้ไขปัญหานี้แทน? (หรือคอมโบ)
MattBianco

4

คุณลองตั้งค่าแล้วsetenv proxy-initial-not-pooled 1หรือยัง

อ้างอิงที่นี่


ไม่มันไม่ได้ช่วยอะไร จากนั้นมันไม่เกี่ยวกับสภาพการแข่งขันมันใช้เวลานานและมีบางอย่างเกิดขึ้นระหว่างกัน (ความเข้าใจผิดบางอย่างระหว่าง Jetty และ mod_proxy)

4

ข้อผิดพลาดนี้ยังสามารถเกิดขึ้นได้ถ้าคุณไม่สิ้นสุด URL /พร็อกซีของคุณด้วย ทั้งสองพา ธ ควรลงท้ายด้วย a /หรือไม่ใช่


1

ดูบันทึกมีบางสิ่งบางอย่างที่หมดเวลา 5 นาที (= 300 วินาที) เป็นเวลาที่ค่อนข้างนานที่จะรอการตอบกลับ เมื่อคุณเข้าถึงเซิร์ฟเวอร์ Jetty โดยตรงทรัพยากรนี้ใช้เวลานานขนาดนั้นในการตอบสนองหรือไม่?

หากห้านาทีจริง ๆ อยู่ภายในเวลาตอบสนองที่เป็นไปได้คุณอาจลองปรับเปลี่ยนการกำหนดค่า ProxyTimeout

ขึ้นอยู่กับการตั้งค่าเครือข่ายของคุณอาจเป็นไปได้ว่าไม่มีเหตุผลที่จะลองใช้ระบบ keepalive ใด ๆ (มีไฟร์วอลล์ระหว่างเซิร์ฟเวอร์แอพและพร็อกซีซึ่งอาจถูกกำหนดค่าให้วางเซสชันที่ไม่ได้ใช้งานนานเกินไปหรือไม่) แต่ ProxyTimeout จะส่งผลกระทบต่อพฤติกรรมของพร็อกซีนั้นเอง

หากพร็อกซีเดียวกันยังให้บริการแบ็กเอนด์อื่น ๆ จะเป็นการดีกว่าที่จะเก็บ ProxyTimeout ปัจจุบันและกำหนดค่าการหมดเวลาในคำสั่ง ProxyPass (ดูที่เอกสารคู่มือ mod_proxy)

อย่างไรก็ตามหากการตอบกลับที่ไม่มีพร็อกซีนั้นเป็นสิ่งที่น้อยกว่าห้านาทีดูที่นี่เป็นขีด จำกัด ที่ถูกตัดออกจากนั้นอาจมีสัญญาณรบกวนแปลก ๆ ระหว่างพร็อกซีและแอพเซิร์ฟเวอร์ แต่คุณไม่ได้ให้อะไรเลย ค่าสำหรับการระบุว่ามันอาจจะเป็นอะไร


"เมื่อคุณเข้าถึงเซิร์ฟเวอร์ Jetty โดยตรงทรัพยากรนี้ใช้เวลานานขนาดนั้นในการตอบสนองหรือไม่?" - ใช่ ฉันยังลองตั้งค่า ProxyTimeout นี้เป็น 600 ไม่ช่วย ไม่มีไฟร์วอลล์ระหว่างพร็อกซีและท่าเทียบเรือ การหมดเวลามีการกำหนดค่าใน ProxyPass

"คุณไม่ได้ให้อะไรที่มีคุณค่าสำหรับการระบุว่ามันอาจจะเป็นอะไร": ฉันไม่รู้ว่ามันจะเป็นอะไร ทั้งหมดที่ฉันได้รับคือข้อความแสดงข้อผิดพลาดจากเซิร์ฟเวอร์: ข้อผิดพลาดของพร็อกซีเซิร์ฟเวอร์พร็อกซีได้รับการตอบกลับที่ไม่ถูกต้องจากเซิร์ฟเวอร์ต้นน้ำ พร็อกซีเซิร์ฟเวอร์ไม่สามารถจัดการคำขอ GET / ได้ สาเหตุ: เกิดข้อผิดพลาดในการอ่านจากเซิร์ฟเวอร์ระยะไกล

สำหรับการเพิ่มการหมดเวลาของพร็อกซีสิ่งนี้ก็เปลี่ยนเวลาที่เบราว์เซอร์ของคุณหมุนก่อนที่จะเกิดข้อผิดพลาด 502 หรือไม่?

จากนั้นไปยังวิธีที่คุณจะทราบได้ว่าเกิดอะไรขึ้นในเซิร์ฟเวอร์แอปพลิเคชัน: คุณสามารถใช้เธรดดัมและดูสิ่งที่กำลังดำเนินการเมื่อเบราว์เซอร์กำลังรออยู่ หรือเพิ่มคำสั่งการบันทึกการดีบักที่เพียงพอเพื่อให้สามารถติดตามรหัสของคุณเพื่อระบุสาเหตุของความช้า

ฉันรู้ว่าทำไมมันช้า ฉันไม่รู้ว่าทำไม apache proxy ปฏิเสธการตอบสนองเมื่อพร้อมในที่สุด

0

สำหรับฉันลบค่าส่วนหัวที่เรียกว่าTransfer-Encoding" (binary)ในเซิร์ฟเวอร์ของฉัน - แอพ (PHP) แก้ปัญหาสำหรับ:

[proxy_http: error] [pid 17623] (22) อาร์กิวเมนต์ไม่ถูกต้อง: [ไคลเอ็นต์ 127.0.0.1:44929] AH01102: ข้อผิดพลาดในการอ่านบรรทัดสถานะจากเซิร์ฟเวอร์ระยะไกล 0.0.0.0:80

คำแนะนำอื่น ๆ ทั้งหมดเช่น SetEnv proxy-initial-not-pooledหรือKeep-Aliveไม่


0

หากวิธีการข้างต้นไม่ทำงานสิ่งหนึ่งที่คุณสามารถลองได้คือการเปิดใช้งานโมดูล Apache ทั้งหมดของคุณเพื่อให้แน่ใจว่าไม่มีโมดูลบางอย่างที่คุณต้องการซึ่งจะปิดใช้งานโดยไม่ตั้งใจ

ตัวอย่างเช่นวิธีที่ฉันพบสาเหตุของปัญหาของฉันคือการแทนที่ #LoadModule ทั้งหมดด้วย LoadModule ในไฟล์ Apache config ทั้งหมดของฉัน ตั้งแต่ที่แก้ปัญหาสำหรับฉันดังนั้นฉันรู้ว่าปัญหาของฉันไม่ได้เป็นข้อโต้แย้ง "KeepAlive" ที่ขาดหายไป แต่ปัญหาของฉันคือการพึ่งพาที่ขาดหายไป

เพราะจำไว้ว่า. so ไฟล์เป็นไลบรารีแบบสแตติก การมีโมดูลที่เปิดใช้งานไม่ได้หมายความว่ามันจะถูกใช้ แต่การปิดใช้งานอย่างใดอย่างหนึ่งหมายความว่ามันไม่สามารถใช้งานได้ดังนั้นสิ่งใดก็ตามที่ขึ้นอยู่กับว่ามันจะล้มเหลว

หมายเหตุ: คำตอบนี้ได้รับการโหวตลดลงเนื่องจากความจริงที่ว่าคำตอบเริ่มต้นของฉันดูเหมือนจะแนะนำให้ออกจากโมดูลทั้งหมดที่เปิดใช้งานตลอดไป ในขณะที่คุณสามารถทำสิ่งนั้นได้โดยไม่จำเป็นต้องทำลายอะไรเลยมันก็ไม่ใช่ทางออกที่ดีที่สุด

ดังนั้นโปรดเข้าใจฉันเพียงแค่บอกว่านี่เป็นขั้นตอนการแก้ไขปัญหาไม่ใช่วิธีแก้ไขปัญหาขั้นสุดท้าย

นอกจากนี้โปรดทราบ: ฉันใช้โครงการ git พิเศษเพื่อติดตามไฟล์ apache config ของเครื่องท้องถิ่นของฉัน ด้วยวิธีนี้ฉันสามารถดำเนินการค้นหาและแทนที่ระดับโลกเหล่านี้ในไดเรกทอรีการทำงาน apache config ของฉันเป็นขั้นตอนการแก้ไขปัญหา หากเปิดใช้งานโมดูลทั้งหมดสำเร็จให้ลองปิดใช้งานโมดูลเหล่านั้นแบบตัวต่อแบบและรีสตาร์ท apache ใหม่จนกว่าคุณจะพบโมดูลที่จำเป็นต้องเปิดใช้งาน เมื่อคุณทราบแล้วให้รีเซ็ต repo กลับสู่สถานะเดิมและเปิดใช้งานเพียงหนึ่งโมดูลที่ต้องเปิดใช้งาน

นอกจากนี้คุณยังจะพบว่าการใช้ git เพื่อติดตามไฟล์ apache ของคุณจะทำการล้างไดเรกทอรีเหล่านั้นเนื่องจากคุณจะไม่ต้องการไฟล์. bak และ. default ที่ล้าสมัยอีกต่อไป


1
ห้องสมุดแต่ละแห่งมีคุณสมบัติที่แตกต่างกันซึ่งไม่เกี่ยวข้องกับพร็อกซี
อาร์โนลด์โรอา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.