在网站维护期间,有时需要closures我们的网站。
我们目前的方法是touch一个将触发Web服务器( nginx )的文件,将stream量redirect到Amazon S3中托pipe的维护页面。 将维护页面托pipe在外部服务器上很重要,因为在维护期间不能保证任何本地文件的可用性。
这是我们用于“维护模式”的nginxconfiguration:
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, eg 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; } ...
它工作很好。 但有一个不幸的副作用,我想知道是否可以避免?
Nginx使用302 http状态码来完成rewrite操作,将请求转发到Amazon S3站点。 因此,在维护模式下,我们没有返回503,我们返回302.这是不好的礼仪,如果谷歌机器人在计划的网站dowmtime期间爬行我们可能是坏的。 Googlebuild议使用503( 来源 )。
有没有一个nginx指令,我可以用来获得相同的效果,但没有302redirect?
这显示维护模式返回“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)...
我不相信你可以通过使用503redirect,因为它不打算redirect。
您需要将该特定文件托pipe在安全位置,以便不受任何维护系统影响,或使用proxy_pass,以便nginx从亚马逊获取页面,然后将其传递到客户端。
某些沿着这些线可能会做的伎俩。 有一段时间没有碰到nginx,但这可能会让你知道我在暗示什么:
error_page 503 @maintenance; location @maintenance { rewrite ^(.*)$ /maintenance.html break; proxy_pass http://mysite.s3-website-us-east-1.amazonaws.com; }
编辑:在引用谷歌的build议为503的网页上,有人评论了一个奇妙的想法,如何redirect到503.他提到它的Apache,但概念是相同的nginx:
嗨!
这可能有帮助。 在Apache服务器上,使用任何其他HTTP状态码(而不是3xx类)redirect用户通常是不可能的。
访问维护站点的用户应该得到一个有用的信息页面。
首先执行302redirect,导致503页输出503头(即通过PHP或Perl)。 这对Google来说工作的很好,因为Google会在遇到302(包括标题响应)时将所有目标页面属性分配给源页面。 我已经在虚拟主机上testing过了,它可以根据需要运行。 如果可以的话,select一个几乎没有请求服务操作的时间。
问候,托马斯