

Nginx and Lua - transmit101
http://devblog.mixlr.com/2012/09/01/nginx-lua/

======
Lasher
Different application area but we implemented Lua into a MUD (online RPG) as
the scripting interface for all area builder development and it was probably
the single most valuable change we ever made. Check out the 'lua coding'
section on Aardwolf.com if you want to see some examples. Over 200,000 lines
of lua now, millions of prog executions per hour and still as fast as ever.

------
jot
Can you provide us with an idea of how much this improved performance or how
many more requests it allowed you to handle? Were there time or cost savings
compared to alternative approaches?

~~~
transmit101
There's no single self-contained solution in the post really, it's more an
illustration of a number of useful things that Lua can be used for. I might
try to put another post together at some stage though.

For us our main goal is to prevent the majority of requests from even reaching
the Rails stack. We've done this by introducing full page caching across the
site, for both logged in and logged out users. This means that only a small
percentage of requests at peak times need to touch Rails or any database at
all - everything is served by Nginx.

This hasn't been without its challenges. The last section of this post might
give a clue as to how we've solved the most difficult ones. I will think about
a post tackling this whole subject but I need to think about how to get it
across, it's not easy.

~~~
themgt
Yeah, we're using this to map hosts->upstream servers/redirects in a redis DB,
and then there's no need for managing vhost files to add/remove/scale sites
(or adding/swapping nginx servers). Writing code instead of config files is
very powerful

------
slurgfest
Is there any reason in principle why this has to be done with Lua and not with
other interpreted languages?

Once you are writing interpreted code which reads request data and interacts
with Redis you are not that far from what a normal Ruby or Python web app does
anyway.

~~~
justincormack
1\. Lua is designed to be embedded, it is much easier than trying to embed
Ruby or Python into a web server. 2\. It is a way off an app as it runs in the
same process as the web server. 3\. Lua is very small and very fast, so it is
fine to use it just for doing tiny things like reading cookies, there is no
real overhead (most people use LuaJIT so it is compiled anyway). Remember that
the point of many of these examples is to offload from Ruby as it is too
slow...

Also, Lua is a very nice language, easy to learn (there is not much of it),
and most of the functionality exposed is simply the built in functionality of
nginx (async http), plus some libraries, so having the libraries that come
with other languages is not that useful as you can't use anything blocking
(like with Node) inside Nginx.

~~~
slurgfest
I don't question that Lua is a nice language, but it seems to be repeatedly
implied in this thread that it is not possible to do this with other
languages, although there doesn't appear to be any evidence for that.

Embedding Python in a web server is quite doable and has nothing to do with
having libraries available.

I'm really not seeing why everyone should switch to Lua for these tasks. That
is quite different from saying that people who like Lua shouldn't use it.

~~~
justincormack
The libraries thing is just you dont need the libraries, which are the main
advantage.

Python is a 3MB binary, while Lua is 175k, for a start. This is for Nginx
which is 960k. Embedding something three times the size of the host is not
really an embed...

Lua is embedded in all sorts of stuff, Nginx, Apache, Redis in web space for
example. Python is a great language, but just not a good choice for that.

But feel free to give a Python embed a go.

------
justincormack
There is an introductory talk (video and slides) from the London Lua meetup
group on Nginx and Lua here
<http://www.londonlua.org/scripting_nginx_with_lua/index.html>

~~~
transmit101
This is a very good talk. Thanks for posting.

------
kyrra
So the idea is interesting, but I think adding something like this onto Nginx
could lead to problems in the future.

For what you're trying to do, I feel like implementing your reverse proxy in
Go may prove to be less prone to errors. Go has ReverseProxy stuff already
built in: <http://golang.org/pkg/net/http/httputil/#ReverseProxy>

Go already has a pretty strong following doing near exactly what you are doing
here with Nginx + Lua. But that would require learning a new language and
screwing with infrastructure, which always is a giant pain.

~~~
vidarh
Nginx is "battle tested" as one of the most used web servers, particularly as
a reverse proxy. Lua is battle tested as an embedded language for just this
type of thing.

In comparison, Go is a pretty much unknown quantity.

I'm curious as to what problems you think that this might lead to that aren't
just as likely or more likely with a Go based implementation.

------
rotation1
Bit off topic but you might want to 301 redirect to the right page instead of
just disallowing search engines on your subdomains. This way if someone links
to the wrong page you will still get the link juice.

I might have misunderstood that first bit though, since it looks like you do
redirect anyway.

~~~
transmit101
I can imagine a scenario where we wanted a sub-domain which didn't redirect,
but also wasn't crawlable. But I agree the example is a little bit contrived
;)

------
sciurus
It's nice to see how tight the lua integration into nginx is. It reminds me of
Apache and mod_perl.

