Как переслать в Amazon S3 в режиме обслуживания с помощью nginx, используя 503?
Во время обслуживания сайта иногда необходимо отключить наш сайт.
Наш текущий метод заключается в touch
файл, который запускает веб-сервер ( nginx) для перенаправления трафика на страницу обслуживания, размещенную в Amazon S3. Важно разместить страницу обслуживания на внешнем сервере, потому что во время обслуживания не может быть никакой гарантии доступности локальных файлов.
Это конфигурация nginx, которую мы используем для "Режима обслуживания":
server {
...
# Redirect processing of 503 error pages into a named location:
error_page 503 @maintenance;
# "Maintenance Mode" is off by default - Use a nginx variable to track state.
set $maintenance off;
# Swith on "Maintenace Mode" if a certain file exists.
if (-f /var/www/mysite/shared/maintenanceON) {
set $maintenance on;
}
# Don't use "Maintenance Mode" for our own offices.
if ($remote_addr ~ (69.69.96.69|69.69.69.79)) {
set $maintenance off;
}
# Don't use "Maintenance Mode" for certain urls, e.g. the load-balancer ping page.
if ($uri ~ ^/(site\/ping|robots\.txt)$) {
set $maintenance off;
}
if ($maintenance = on) {
return 503; # 503 - Service unavailable
}
location @maintenance {
# Redirect the request to our maintenance page in Amazon S3.
rewrite ^(.*)$ http://mysite.s3-website-us-east-1.amazonaws.com/ break;
}
...
Работает отлично. Но есть неприятный побочный эффект, я задавался вопросом, можно ли избежать?
rewrite
выполняется Nginx с использованием кода состояния http 302 для пересылки запроса на сайт Amazon S3. Поэтому в режиме обслуживания мы не возвращаем 503, мы возвращаем 302. Это не очень хороший этикет и может быть плохим, если бот Google сканирует нас в течение запланированного периода времени простоя сайта. Google рекомендует 503 ( источник).
Есть ли директива nginx, которую я могу использовать, чтобы получить тот же эффект, но без 302 для перенаправления?
Это показывает, что режим обслуживания возвращает "302 Перемещено временно", а не "503 Сервис недоступен", который я бы предпочел:
> wget http://staging.example.com
--2013-11-13 10:00:47-- http://staging.example.com/
Resolving staging.example.com (staging.example.com)... 69.69.69.80
Connecting to staging.example.com (staging.example.com)|69.69.69.80|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: http://example.s3-website-us-east-1.amazonaws.com/ [following]
--2013-11-13 10:00:53-- http://example.s3-website-us-east-1.amazonaws.com/
Resolving example.s3-website-us-east-1.amazonaws.com (example.s3-website-us-east-1.amazonaws.com)...
1 ответ
Я не верю, что вы можете передать редирект, используя 503, так как он не предназначен для перенаправления.
Вам нужно будет либо разместить этот конкретный файл в безопасном месте, чтобы на него не влияла какая-либо система обслуживания, либо использовать proxy_pass, чтобы nginx извлекал страницу из amazon и затем передавал ее клиенту.
Что-то в этом роде может помочь. Давно не трогал nginx, но это может дать вам представление о том, что я предлагаю:
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
proxy_pass http://mysite.s3-website-us-east-1.amazonaws.com;
}
Изменить: На странице, на которой упоминается рекомендация Google для 503, кто-то прокомментировал фантастическую идею о том, как перенаправить с 503. Он упомянул это для Apache, но концепция с nginx такая же:
Привет!
Это может помочь. На серверах Apache обычно невозможно перенаправить пользователя с любым другим кодом состояния HTTP, кроме класса 3xx.
Пользователи, которые посещают сайт в процессе обслуживания, заслуживают того, чтобы получить полезную информационную страницу.
Сделайте это с перенаправлением 302 первым, что приведет к странице 503, которая выводит заголовок 503 (то есть через PHP или Perl). Это будет хорошо работать с Google, так как Google назначит все свойства целевой страницы исходной странице, когда они встретят 302 - включая ответ заголовка. Я проверил это на виртуальных хостах, и это работает как хотелось бы. Если вы можете, выберите время с несколькими запросами на действия службы.
С уважением, Томас