Set Variable from Content of Text File?
Nick Pearson
nick.pearson at gmail.com
Fri Jan 9 21:44:09 MSK 2009
Hi John,
I've not done any module development myself, so I don't know the specific
capabilities, but I don't see why this wouldn't be possible to accomplish.
Perhaps a module that does exactly as you say and sets a variable using the
contents of a file, or a module that could read the contents of a file
containing one or more variable declarations. It would be good to be able
to specify when the file should be reloaded. This could be set to a number
of requests between reloads, amount of time between reloads, or reloads
based on some condition of a request.
Although I've not come across this need myself yet, I can see where it could
be quite useful.
Nick
On Fri, Jan 9, 2009 at 12:17 PM, Resicow <resicow at gmail.com> wrote:
> Hi Nick,
>
> Thanks for your thoughts, I really appreciate it!
>
> I know nginx is all about speed, and reading a file each time can be a
> waste of resources (hence no htaccess). I'm not skilled in module
> development, but do you think it would be possible either as a custom
> module, or using the embedded perl module to accomplish this?
>
> There are a few things that I want to do besides the maintenance page, and
> basically they require the ability of setting a variable to the contents of
> a text file, which allows nginx to make some decisions, instead of checking
> for the existence of lots of files. Lets say I have 10 things I want nginx
> to do... wouldn't checking for the existence of 10 different files have more
> overhead than just reading the contents of one?
>
> http://wiki.codemongers.com/NginxHttpAccessKeyModule
>
> For example the access key module. Right now the access key signature is
> defined in the config file, and supports variables. So instead of changing
> the config file to change the signature, I could set the signature to a
> variable, and have that variable read each time from a text file, that could
> change anytime I wanted (and be different for different directories),
> without having to edit the config file and reload from command line.
>
> Thanks,
>
> John
>
>
>
>
>
> Nick Pearson wrote:
>
>> Hi John,
>>
>> That's an interesting problem. There's no way that I've seen that would
>> let you read the contents of a file from the nginx config. Maybe someone
>> else can shed some light on this.
>>
>> In any case, I'm not sure you'd want the overhead of opening and reading a
>> file on every request. However, you might be able to come up with a
>> solution using symlinks and/or a simple cron script that will make the
>> appropriate file available to nginx when necessary. A command like this
>> might work...
>>
>> if [ -s maintenance_file.txt ]; then ln -s `cat maintenance_file.txt`
>> maintenance.html; elif [ -f maintenance.html ]; then rm maintenance.html; fi
>>
>> I tested this out locally, and it works. If the maintenance_file.txt file
>> has text in it, it assumes the text is a filename and creates a symlink to
>> that filename (at a location where nginx would see the symlink and serve the
>> linked file as a maintenance page). If the maintenance_file.txt is empty
>> and the symlink exists, then the symlink is deleted. (This could be made
>> much more robust, but it works as is if the maintenance_file.txt is either
>> empty or contains a single line with no newline/return characters.)
>>
>> I realize this isn't exactly what you're going for, but it might
>> accomplish your goal. And ultimately, this will be more performant than
>> having nginx read the contents of a file on each request.
>>
>> Nick
>>
>>
>> On Fri, Jan 9, 2009 at 11:12 AM, Resicow <resicow at gmail.com <mailto:
>> resicow at gmail.com>> wrote:
>>
>> Hi Nick,
>>
>> Thanks for your response... I understand the response below, but I
>> was hoping for a way of doing this by reading the contents of the
>> text file... So something like this...
>>
>> if (-f $document_root/system/back_soon.txt) {
>>
>> set $file_to_load read /$document_root/system/back_soon.txt
>> rewrite ^(.*)$ $file_to_load last;
>> break;
>>
>> }
>>
>> So if the file exists read and set a variable based on the
>> contents of the file, and then rewrite to the variable path.
>>
>> Thanks,
>>
>> John
>>
>>
>>
>>
>>
>> Nick Pearson wrote:
>>
>> John,
>>
>> See Ezra's response in the thread here:
>>
>> http://thread.gmane.org/gmane.comp.web.nginx.english/8978/focus=8990
>>
>> That explanation is just for a single downtime notice, but you
>> can use a variation of his solution to accomplish what you
>> want. For example:
>>
>> server {
>> ...
>> if (-f $document_root/system/back_soon.html) {
>> rewrite ^(.*)$ /system/back_soon.html last;
>> break;
>> }
>> if (-f $document_root/system/down_for_a_while.html) {
>> rewrite ^(.*)$ /system/down_for_a_while.html last;
>> break;
>> }
>> ...
>> }
>>
>> This will show the back_soon.html page if it exists. If it
>> doesn't exist and the down_for_a_while.html page does, then
>> that will be displayed. Otherwise, processing will continue
>> normally.
>>
>>
>> On Thu, Jan 8, 2009 at 2:05 PM, Resicow <resicow at gmail.com
>> <mailto:resicow at gmail.com> <mailto:resicow at gmail.com
>> <mailto:resicow at gmail.com>>> wrote:
>>
>> Hello Nginx Community, and Happy New Year...
>>
>> Is it possible to set the value of a variable based on the
>> contents of a text file?
>>
>> So if there is site downtime, I can place a file in a directory
>> that nginx will see and will know to serve a downtime
>> notice, but
>> then can nginx read the contents of the file to determine which
>> downtime notice to serve?
>>
>> Thanks,
>>
>> John
>>
>>
>>
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx/attachments/20090109/c2a529f7/attachment.html>
More information about the nginx
mailing list