Soru Neden bir Apache Proxy 503 hatası alıyorum?


Sunucum dün kadar iyi yapıyordu. Koşuyordu Redmineve en mutlu küçük sunucuydu a kadar benim "arkadaşım" küçük adamımın alamayacağı bir SQL tablosu aldı. Ne yazık ki, lil adamın cevap vermesini sağlamak için bir saat sonra, ona güç vermek zorunda kaldık.

Şimdi yeniden başlattıktan sonra, Redmine'ye bağlı etki alanını ziyaret etmeye çalışırken 503 hatası alıyoruz. Bağlantılı melez daemon, ve Redmine'in çalıştığı limana tüm bağlantıları yönlendirmek için Apache Proxy kullanıyoruz.

Lynx'i sunucuda kullanma (http://localhost:8000) Ruby uygulamasının iyi çalıştığını görebilirsiniz. Ama bu biraz Apache yapılandırma dosyasımda çalışmıyor:

<VirtualHost *:80>
    ServerName sub.example.com
    ProxyPass / http://localhost:8000
    ProxyPassReverse / http://localhost:8000
    ProxyPreserveHost on
    LogLevel debug
</VirtualHost>

İşte Apache için hata kaydı çıktı:

[debug] mod_proxy_http.c (54): vekil sunucu: HTTP: canonicalising URL // localhost: 8000
[debug] proxy_util.c (1335): [client 216.27.137.51] proxy: http: bulundu worker http: // localhost: 8000 http: // localhost: 8000 / için
[debug] mod_proxy.c (756): Çalıştırma şeması http işleyicisi (girişim 0)
[debug] mod_proxy_http.c (1687): vekil sunucu: HTTP: URL adresi http: // localhost: 8000 /
[debug] proxy_util.c (1755): proxy: HTTP: (localhost) için bağlantı aldı
[debug] proxy_util.c (1815): vekil sunucu: http: // localhost: 8000 / localhost'a bağlanma: 8000
[debug] proxy_util.c (1908): vekil sunucu: localhost'a bağlı: 8000
[debug] proxy_util.c (2002): vekil sunucu: HTTP: localhost'a bağlanmak için oluşturulmuş fam 2 soketi

[error] (13) İzin reddedildi: proxy: HTTP: 127.0.0.1:8000 (localhost) adresine bağlanmayı denedi
[error] işçinin (localhost) için devre dışı bırakılması ap_proxy_connect_backend

[debug] proxy_util.c (1773): proxy: HTTP: (localhost) için bağlantı yayımladı

44
2018-03-25 19:20


Menşei


Hey Lütfen aşağıdaki yazıya geri dönün. Benzer bir hata olarak stackoverflow.com/questions/9461086/... - Ranjeet Ranjan


Cevaplar:


Apache, arka uç sunucusunun kapalı olduğunu algıladığında, en az 60 saniye boyunca 503'le yanıt verir. Bu varsayılan davranıştır. Örneğinizde olduğu gibi, arka uç sunucunuzu yeniden başlatırsanız (bu örnekte Rails) ve bir kişi Rails hazır olmadan önce Apache proxy'si üzerinden erişmeye çalışırsa, Apend'in arka ucunuz şu anda 'up' olmasına bakılmaksızın Apache 60 saniye için geri dönecektir. . ProxyPass'teki apache dokümanlarına bakın:

tekrar denemek 60

Bağlantı havuzu işçisi saniyeler içinde yeniden deneyin. Bağlantı havuzu çalışanı arka uç sunucusuna hata durumundaysa, Apache zaman aşımı süresi bitene kadar bu sunucuya herhangi bir istek iletmez. Bu, arka uç sunucusunun bakım için kapatılmasını ve daha sonra tekrar çevrimiçi duruma getirilmesini sağlar. 0 değeri, zamanaşımına uğramayan çalışanların her zaman hata durumunda yeniden denenmesi anlamına gelir.

Dolayısıyla, Proxy Pass’ınızı yeniden = 0 değerini dahil edecek şekilde ayarlarsanız, arka uç hizmetinizi yeniden başlattığınızda 503’leri görmezsiniz. Bu, Apache'yi geliştirme sırasında ters proxy olarak kullanırken de yararlıdır! Örneğin:

ProxyPass / http: // localhost: 8000 yeniden denemek = 0


79
2018-02-08 14:56



Referans için, bir bağlantı Apache 2.2 için ProxyPass belgeleri. - Pistos
Nginx ile aynı mı? - HFX


Aşağıdaki komutu çalıştır

# /usr/sbin/setsebool httpd_can_network_connect 1

VEYA

# /usr/sbin/setsebool httpd_can_network_connect true

ve bundan sonra httpd'yi yeniden başlat

# service httpd restart

35
2017-11-18 16:03



setsebool -P ... değişiklikleri devam ettirir. - Steve Bennett
Bu bana yardımcı olmuyor. Apache + melez Bu, SELinux'u devre dışı bırakıyor ve soruyla hiçbir ilişki göremiyorum. - Ivailo Bardarov


Doğru sırada yeniden başlattıklarından emin misiniz? Apache'nin başladığı tuhaf sorunlar yaşadım, sonra Mongrel başladı ve Mongrel koşuyor olsa da, Apache hala proxy hatasını atar.

Bunu geçmişte çeşitli utançlarla ve Apache'nin yeniden başlatmasıyla çözdüm ve sonunda tanrılar mutlu oldu. Görünüşe göre, bazen Mongrel süreçleri düzgün bir şekilde kapanmıyor, dolayısıyla onları elle öldürmeniz gerekiyor. İşte bir bağlantı bazı [mümkün] yardım ile.

"Öldür" seçeneği ekledim /etc/init.d/ mongrel script çünkü çok oldu. Mongrel'i durdurdu, tüm Mongrel oturumlarını öldürdü, Mongrel'i başlattı ve Apache'yi yeniden başlattı.

<snip>
    kill)
      echo "Stopping, killing, starting, and restarting Apache..."
      mongrel_cluster_ctl stop -c $CONF_DIR --clean
      killall -u mongrel
      mongrel_cluster_ctl start -c $CONF_DIR --clean
      /etc/init.d/httpd restart
      RETVAL=$?
  ;;
</snip>

Muhtemelen çok iyi bir çözüm değil ama kötülük gitti.


2
2018-03-25 19:25



ne yazık ki çalışmıyor :( - damon
exshovelrydr'ın cevabı, siparişin neden başlayacağını ve Apache yapılandırmasının nasıl değiştirileceğini açıklar. değil madde. - Warren Young


Apache'nin arkasındaki mongel'leri izlemek için monit çalıştırmayı deneyin ve bu şekilde eğer ölürseniz veya hafızada çok acıkırsanız mongrelleri sizin için yeniden başlatabilirsiniz. Herhangi bir nedenle Apache'nin hala kafası karışırsa, apache'yi yeniden güzelce yeniden başlatmanız gerekebilir ve kendini çözmesi gerekir, ancak mongelilerinizin monit saatini izleyen vakaların% 99'u bu durumdan tekrar kaçınmalıdır. Diğer seçenek Phusion Yolcusu'na bakmak.


1
2018-03-26 01:06



lol hiçbir açıklama olmadan 6 yaşındaki bir cevapta bir düşüş. - nitecoder


Önce port 8080'in aşağıdaki komutla dinlenip dinlenmediğini kontrol edin.

netstat -tlpn

Jenkins sunucusunu aşağıdaki komutla yeniden başlatmazsa

sudo /etc/init.d/jenkins start

Şimdi çalışmalı. Umarım yardımcı olur.


0
2017-10-21 08:06





Yumruk, yüklemelisin selinux: (SELinux, Güvenlik Geliştirilmiş Linux anlamına gelir.)

apt-get install selinux

Bundan sonra, SElinux Güvenlik Politikası'nı aşağıdaki komutu kullanarak etkinleştirebilirsiniz:

sed -i 's/SELINUX=.*/SELINUX=permissive/' /etc/selinux/config 

Uyarı:

#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.

Final, apache'yi yeniden başlat!


0
2018-06-14 08:45



Cevabınız SELINUX ayarını iki kez mi değiştiriyor? Selinux'u kapatmak zaten kabul edilmiş bir cevaptır - Ne eklediğinizi tam olarak bilmiyorum. Ayrıca, lütfen cevabınızın ne yaptığını açıklayın / açıklayın - bu SO'nun uzun vadeli değerini geliştirir. - Andy Jones
Üzgünüm, İngilizce benim ana dilim değil, bu yüzden metin yorumlamada biraz sıkışıp kaldım :) - D. Hung
- Bu hatayla karşılaştım ve yukarıdaki ifadeyle düzelttim. SELinux, Güvenlik Geliştirilmiş Linux'u temsil eder. Sunucu güvenliğini iyileştirmenin bir yoludur. SELinux etkinleştirildiğinde, Apache Apache politikası yerine SELinux politikasını kullanacaktır. - D. Hung
Cevabımı düzenledim, teşekkürler @AndyJones - D. Hung


Bunun işe yaraması için SELinux'u çevirmem gerekti ve daha sonra "localhost: 8000" satırlarına sondaki eğik çizgileri ekledim.

İşte SELinux'u kapatmak için kod:

echo 0 >/selinux/enforce

-1
2018-03-25 22:33



Bu bir güvenlik deliği. - Antonio
Ayrıca, uygulamanın neden bir süredir çalıştığını açıklamıyor, ardından yeniden başlatmada başarısız oldu. Bu mümkünOP, SELinux devre dışıyken çalışıyordu, ardından yeniden başlatıldığında otomatik olarak etkinleştirildi, ancak exshovelrydr yanıtında verilen durum çok daha olası. - Warren Young
Selinux'u kapatmamalısın, sadece politikayı devre dışı bırak. / usr / sbin / setsebool httpd_can_network_connect true - Rick Smith