A newbie question regarding regex in nginx conf

Hi list,

I have a question regarding regex in nginx conf, and believe it must
have been brought up before, yet after googling for it, I could not find
an answer.

Specifically, is it possible to use curly braces in nginx conf?

For example, for some url like: /photos/123456

I would want to rewrite it to: /path/to/photos/12/1234/123456.png

in apache’s conf rewrite rule, I could use something like:

[0-9]{2}[0-9]{2}[0-9]{2} /path/to/photos/$1/$1$2/$1$2$3.png

But it seems curly braces are reserved for nginx conf file’s own use,
and not recognized by the regex processing.

So is there any way to use curly braces in regex? If so, could some one
kind enough to provide a link or short explanation of how to do it?

Thanks in advance,

Yining

Hello!

On Wed, Sep 03, 2008 at 11:33:15PM +0800, Zhang Y. wrote:

I would want to rewrite it to: /path/to/photos/12/1234/123456.png

in apache’s conf rewrite rule, I could use something like:

[0-9]{2}[0-9]{2}[0-9]{2} /path/to/photos/$1/$1$2/$1$2$3.png

But it seems curly braces are reserved for nginx conf file’s own use,
and not recognized by the regex processing.

So is there any way to use curly braces in regex? If so, could some one
kind enough to provide a link or short explanation of how to do it?

Just quote the regex, i.e:

rewrite “([0-9]{2})([0-9]{2})([0-9]{2})”
/path/to/photos/$1/$1$2/$1$2$3.png;

(single quotes will do the trick too).

It’s documented in
http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#rewrite
(in russian), but not (yet) in english wiki. Feel free to update
http://wiki.codemongers.com/NginxHttpRewriteModule#rewrite.

Maxim D.

I’m curious about your breaking up the filename into a path like that.
If using ext3 filesystem is there any advantage speed wise to doing
that? I thought it could handle large file counts without a problem
using indexing but I may be wrong and I am quite interested as I expect
to have thousands of image files as well and if it’s going to be slow on
ext3 then I would also want to split up directories like this.
Chris :slight_smile:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Maxim,

Thanks for the prompt reply!

Maxim D. wrote:

So is there any way to use curly braces in regex? If so, could some one
kind enough to provide a link or short explanation of how to do it?

Just quote the regex, i.e:

rewrite “([0-9]{2})([0-9]{2})([0-9]{2})”
/path/to/photos/$1/$1$2/$1$2$3.png;

(single quotes will do the trick too).

Ah I see! Why didn’t I think of trying that before posting the question?

It’s documented in
http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#rewrite
(in russian), but not (yet) in english wiki. Feel free to update
http://wiki.codemongers.com/NginxHttpRewriteModule#rewrite.

Done.

Maxim D.


Zhang Y.
URL: http://www.zhangyining.net | http://www.yining.org
mailto: [email protected] | [email protected]
Fingerprint: 25C8 47AE 30D5 4C0D A4BB 8CF2 3C2D 585F A905 F033
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIvr5XPC1YX6kF8DMRAupRAJwJyK4VHjux1Pc9tjA38vx58AfOSACeJBxr
sxQG4vj7bPv+Q1mQbOWmot4=
=jy7G
-----END PGP SIGNATURE-----

i try to keep directories to less than 10,000 files apiece,
personally. i think nearly every filesystem it’s a good idea to put a
limit on it, especially if you ever use “rm” and such - eventually the
argument list gets too long too :slight_smile:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Chris,

Chris S. wrote:

I’m curious about your breaking up the filename into a path like that.
If using ext3 filesystem is there any advantage speed wise to doing
that? I thought it could handle large file counts without a problem
using indexing but I may be wrong and I am quite interested as I expect
to have thousands of image files as well and if it’s going to be slow on
ext3 then I would also want to split up directories like this.
Chris :slight_smile:

First of all, I simplified the question a little, all url’s are actually
ended with “-(L|M|S|Q|T)” denoting different sizes (large, medium,
small, square, thumbnail), so that’s multiplication by five :slight_smile:

Secondly, yes, it’s ext3 (on my dev pc), but I split files this way is
more for ease of management and some flexibility instead of from purly
performance stand point.

I don’t have hard data and facts right now, but in my understanding,
splitting up does help in terms of performance. I will share more info
when I have some more.


Zhang Y.
URL: http://www.zhangyining.net | http://www.yining.org
mailto: [email protected] | [email protected]
Fingerprint: 25C8 47AE 30D5 4C0D A4BB 8CF2 3C2D 585F A905 F033
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIvsU8PC1YX6kF8DMRAk5NAKCJh/2C3xGHwgIsZDkJpeV9UmDQyQCfVAU1
nos9cAElZSsXHS/0zt1q0Uo=
=4LIA
-----END PGP SIGNATURE-----

On Wed, Sep 03, 2008 at 07:58:35PM +0400, Maxim D. wrote:

Just quote the regex, i.e:

rewrite “([0-9]{2})([0-9]{2})([0-9]{2})”
/path/to/photos/$1/$1$2/$1$2$3.png;

(single quotes will do the trick too).

Some addition on quotes: nginx treats single and double quotes similary,
the both quote types do not affect on variable evaluation, etc.

The different quotes are simply the way to use one characters inside
others:

“some ‘text’”
‘some “text”’

On Wed, Sep 3, 2008 at 10:11 AM, Zhang Y. [email protected]
wrote:

First of all, I simplified the question a little, all url’s are actually
ended with “-(L|M|S|Q|T)” denoting different sizes (large, medium,
small, square, thumbnail), so that’s multiplication by five :slight_smile:

ha! i am doing the same thing, but _l _m _s _sq and a copy of the
original :slight_smile:

Thanks Zhang.
I was just wondering as I’m building a photo site as well and expect the
number of images to grow over time to be large. I also have directories
for s/ m/ p/ l/ f/ - and was thinking I may split into subdirectories
but just wasn’t sure it made any difference. I’d be interested to know
if you ever find info about that. I do know that some command line tools
are hard to use with large numbers of files but I didn’t really expect
to have to go in manually to browse them. Also my files are replicated
up onto Amazon S3.
Chris :slight_smile: