uWSGI is an application server, it is tuned and has options to run custom code in the safer possibile way. nginx is a webserver, and it is tuned and optimized for this kind of job (serving static files and proxying). You can run uWSGI as a webserver too but you will lose the amount of features of nginx (or whatever webserver you want to use) and its efficience in serving static files. There is a massive amount of other reasons (included security) but the main one is the different scope. so you need both. By the way, this is a normal paradigm (web server proxying to application server) for pratically all of the modern deployment solutions.