new nginx module: notice

Igor Sysoev is at rambler-co.ru
Sat Jun 16 15:34:01 MSD 2007


On Fri, Jun 15, 2007 at 01:36:46PM -0700, Keith Rarick wrote:

> Hi, I'm Keith Rarick, and I recently wrote a small nginx module.
> 
> Find it at http://xph.us/software/nginx-notice/
> 
> Background:
> 
> Recently, facebook.com released an application framework so that
> anyone can develop an application to be used by any of facebook's
> users. We've made an application called "Causes". When the user
> requests an application page on facebook, the facebook server makes a
> request to the Causes server, reformats the response (adding a
> facebook menu and style) and returns it to the user.
> 
> Our situation:
> 
> Now, when we update our database schema, we want to show a static page
> during the downtime. We had been using something like this in
> nginx.conf:
> 
> if (-f /var/www/notice.html) {
>  rewrite ^(.*)$ /notice.html break;
>  break;
> }
> 
> location = /notice.html {
>  root /var/downtime;
>  break;
> }
> 
> Unfortunately, every request from facebook uses POST, regardless of
> the original request method from the user. The configuration above
> returns a 4xx error to POST requests, which makes sense according to
> the meaning of POST in HTTP. But since facebook is abusing POST, we
> must also abuse POST. I want nginx to return /var/downtime/notice.html
> with a 200 status in response to POST requests.
> 
> New module:
> 
> Therefore, I wrote a module that ignores the HTTP method and returns a
> fixed body for every request it handles. Our configuration now looks
> like this:
> 
> if (-f /var/www/notice.html) {
>  rewrite ^(.*)$ /notice.html break;
>  break;
> }
> 
> location = /notice.html {
>  notice /var/downtime/notice.html;
>  break;
> }
> 
> It works very well, but if there is a better or simpler way to
> accomplish this I would love to know it. Otherwise, I hope someone
> else may find this module useful.

    error_page  503  =200  /notice.html;

    location / {

        if (-f /var/www/notice.html) {
            return 503;
        }

        ...
    }
     
    location = /notice.html {
        root /var/downtime;
    }


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list