在网站维护期间,有时需要关闭我们的网站。
我们当前的方法是touch
创建一个文件,该文件将触发 Web 服务器 ( 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 使用 302 http 状态代码将请求转发到 Amazon S3 站点完成的。因此,在维护模式期间,我们不会返回 503,而是返回 302。这不是一个好的礼仪,如果 google bot 在计划的站点停机时间期间抓取我们,可能会很糟糕。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)...
我不相信您可以使用 503 传递重定向,因为它不用于重定向。
您需要将该特定文件托管在安全位置,使其不受任何有效维护系统的影响,或者使用 proxy_pass 以便 nginx 从亚马逊获取页面,然后将其传递给客户端。
沿着这些路线的东西可能会奏效。有一段时间没有接触 nginx,但这可能会让您了解我的建议:
编辑:在关于谷歌推荐 503 的页面上,有人评论了一个关于如何使用 503 重定向的绝妙想法。他提到了 Apache,但这个概念与 nginx 相同: