Почему я получаю ошибку Apache Proxy 503?

мой сервер был в порядке до вчерашнего дня. Он работает в Redmine, и это был самый счастливый маленький сервер до мой "друг" импортировал таблицу SQL, которую мой маленький парень не мог взять. К сожалению, после часа попыток заставить лил ответить, нам пришлось включить его.

Теперь после перезагрузки мы получаем ошибку 503 при попытке посетить домен, подключенный к Redmine. Он подключен к дворняга демон, и мы используйте прокси-сервер Apache для направления всех подключений к порту, на котором работает Redmine.

использование Lynx на сервере (http://localhost:8000) Вы можете видеть, что приложение Ruby работает нормально. Но этот бит не работает в моем файле конфигурации Apache:

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

вот вывод журнала ошибок для Apache:

[debug] mod_proxy_http.c(54): proxy: HTTP: canonicalising URL //localhost:8000
[debug] proxy_util.c(1335): [client 216.27.137.51] proxy: http: found worker http://localhost:8000 for http://localhost:8000/
[debug] mod_proxy.c(756): Running scheme http handler (attempt 0)
[debug] mod_proxy_http.c(1687): proxy: HTTP: serving URL http://localhost:8000/
[debug] proxy_util.c(1755): proxy: HTTP: has acquired connection for (localhost)
[debug] proxy_util.c(1815): proxy: connecting http://localhost:8000/ to localhost:8000
[debug] proxy_util.c(1908): proxy: connected / to localhost:8000
[debug] proxy_util.c(2002): proxy: HTTP: fam 2 socket created to connect to localhost

[error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8000 (localhost) failed
[error] ap_proxy_connect_backend disabling worker for (localhost)

[debug] proxy_util.c(1773): proxy: HTTP: has released connection for (localhost)

7 ответов


Apache будет реагировать с 503 в течение не менее 60 секунд каждый раз, когда он обнаруживает, что серверный сервер не работает. Это поведение по умолчанию. Как и в вашем примере, если вы перезагрузите бэкэнд-сервер (Rails в этом примере), и кто-то попытается получить к нему доступ через прокси-сервер Apache до того, как Rails будет готов, Apache вернет 503 в течение следующих 60 секунд, независимо от того, если ваш бэкэнд теперь "вверх". См. документы apache на ProxyPass, где указано:

повтор 60

работник пула соединений повторяет тайм-аут в секундах. Если работник пула соединений с серверной частью находится в состоянии ошибки, Apache не будет пересылать запросы на этот сервер до истечения времени ожидания. Это позволяет завершить работу бэкэнд-сервера для обслуживания и вернуть его в оперативный режим позже. Значение 0 означает, что работники всегда повторяют попытку в состоянии ошибки без таймаута.

поэтому, если вы установите свой пропуск прокси для включения retry=0 вы не будет видеть 503 при перезапуске бэкэнд-службы. Это также полезно при использовании Apache в качестве обратного прокси-сервера во время разработки! Например:

ProxyPass / http://localhost:8000 повтор=0


выполнить следующую команду

# /usr/sbin/setsebool httpd_can_network_connect 1

или

# /usr/sbin/setsebool httpd_can_network_connect true

и после этого перезапустите httpd

# service httpd restart

вы уверены, что они перезапускаются в правильном порядке? У меня были странные проблемы, когда начинается Apache, затем начинается Mongrel, и хотя Mongrel работает, Apache все еще выдает ошибку прокси.

Я решил это в прошлом с различными заклинаниями и перезапусками Apache, и в конечном итоге боги счастливы. Кажется, что иногда процессы Mongrel должным образом не закрываются, поэтому вам нужно вручную убить их. Вот ссылке с [возможным] помощь.

Я закончил тем, что добавил опцию "убить" в мой /etc/init.d/ сценарий шавки, потому что это произошло так много. Он остановил дворнягу, убил все сессии дворняги, запустил дворнягу и перезапустил Apache.

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

вероятно, не очень хорошее решение, но зло ушло.


попробуйте запустить monit для мониторинга ваших полукровок за Apache, и таким образом он может перезапустить полукровок для вас, если они умрут или слишком голодны для памяти. Если по какой-либо причине Apache все еще путается, вам, возможно, просто придется изящно перезапустить apache, и он должен решить себя, но в 99% случаев, когда monit наблюдает за вашими дворнягами, это должно избежать этого снова. Другой вариант-заглянуть в Phusion Passenger.


сначала проверьте, прослушивает ли порт 8080 следующую команду

netstat -tlpn

Если нет, то перезапустите сервер jenkins следующей командой

sudo /etc/init.d/jenkins start

Он должен работать сейчас. Надеюсь, это поможет.


кулак, вы должны установить selinux: (SELinux означает защищенный Linux.)

apt-get install selinux

после этого вы можете включить политику безопасности SElinux, выполнив команду:

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

обратите внимание:

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

Final, перезапустить apache!


чтобы заставить это работать, мне нужно было повернуть SELinux, а затем добавить конечные косые черты в строки "localhost:8000".

вот код для отключения SELinux:

echo 0 >/selinux/enforce