Nginx; if is evil, but Lua rocks

Nginx is a web server that is designed on asynchronous, non-blocking, event-driven connection handling algorithm. As of this writing according to W3Techs Nginx serves around 32.2% websites known to them. At Wego we use Nginx as our primary web server.

Recently Wego launched its mobile website as a Progressive Web App: PWA, for significant visible speed and performance gains. This replaced our previous version of adaptive website. The challenge on the Nginx side for the launch was to keep serving the users under same domains i.e. over 50 domains for Wego, and redirecting users to PWA site for Mobile and the Desktop user to the current version.

Previously we have had a similar situation implementing a security system at our proxy level where we had to route our requests through a system sitting beside our proxy. For that we used Nginx if statement in each location block, and I can not reiterate enough on its evilness and the unexpected behaviour that it brings along its implementation, considering the size of our configurations, it was an excruciating task, since then we don't use the builtin if anymore. In Nginx's own word if is evil, so it is better to avoid their use.

So what is it that we use other than the available command set ? one solution was to have new end points for mobile user or redirect them from old landing pages to the new urls or solve the whole thing by redirecting them to a separate mobile (sub)domains, such practices are quite common where you see, m.xyz.com or xyz.com/mobile for new launched/demo products. We didn't want the user experience to be effected, for that the new PWA based mobile website was to be served seamlessly under the same domains and urls. The major advantage that this brought was the SEO and SEM campaigns that were currently in place , with significant amount invested to generate traffic they didn't go obsolete and were able to draw traffic to the new PWA website.

Concluding on how if's are evil and that user experience takes precedence over all. The solution was to use a lesser known brilliance that Nginx supports i.e Lua. Not many know and not much is available on the internet either about how Lua can be used to make Nginx respond to your requirements. The flavour of Nginx that has the lua-nginx-module built into it is Openresty, if you want you can compile and build Nginx with the module(s) as well. With Lua support you can assign variables, add logging, update/change request/response variables and select proxy_pass dynamically. All with the freedom and reliability of knowing it performs the way you expect it to. With Lua added to our stack we continue to achieve more and solve new challenges.