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




apache установка (5)

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

повторная попытка 60

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

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

ProxyPass / http: // localhost: 8000 retry = 0

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

Теперь после перезагрузки мы получаем ошибку 503 при попытке посетить домен, подключенный к Redmine. Он подключен к демону Mongrel , и мы используем Apache Proxy для направления всех подключений к порту 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)

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

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

Я закончил добавление опции «kill» к моему /etc/init.d/ скрипту mongrel, потому что это произошло так много. Он остановил Mongrel, убил все сессии Mongrel, начал Mongrel и перезапустил 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>

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


Кулак, вы должны установить selinux : (SELinux означает Security-Enhanced 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.

Финал, перезапустите apache!


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


Чтобы заставить это работать, мне нужно было свернуть SELinux, а затем добавить трейлинг-косые черты в строки «localhost: 8000».

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

echo 0 >/selinux/enforce






apache