12.应用程序网关
本文简单解释如何将NGINX配置为uWSGI和Django的应用程序网关。
NGINX还可以充当安全的应用程序网关,提供许多专用的内置接口,将流量从用户传递到应用程序。 在这方面,NGINX不仅可以将HTTP和HTTPS流量代理到支持HTTP的应用程序容器,还可以通过在FastCGI,Memcached,scgi和uwsgi等模块中实现的优化应用程序网关接口直接与大多数流行的轻量级应用程序服务器和Web框架通信。
最常用的应用程序容器具有具有某些路由功能的嵌入式外部 HTTP 接口,但使用 NGINX 作为应用程序网关的一个重要原因是它为 HTTP 连接管理、负载平衡、内容缓存和流量安全提供了一体化解决方案。应用程序后端安全地位于NGINX后面,以获得更好的可扩展性和性能。将应用程序实例群集在NGINX后面以构建高度可用的应用程序也非常容易。
关于“专用接口(specialized interfaces)”,尽管 HTTP 很有用,但它从未针对现代、轻量级应用程序部署方案进行优化。近年来,许多标准化接口已经 发展到可以与各种应用程序框架和应用程序容器一起使用。其中一个接口是Web服务器网关接口(Web Server Gateway Interface WSGI),它是Web服务器/代理和基于Python的应用程序之间的接口。
提供 uwsgi 协议(它自己的 WSGI 协议实现)的最常用应用程序服务器之一是 uWSGI 应用程序服务器容器。除此之外,uWSGI应用服务器支持HTTP,FastCGI和SCGI - uwsgi协议被推荐为与应用程序通信的最快方式。
配置 NGINX 与 uWSGI 和 Django 一起使用
Django可能是最常用的Python Web框架,所以为了简单起见,该示例为Python应用程序使用了基于Django的设置。Django 文档提供了有关如何配置 Django 环境的大量信息。
仅出于说明目的,这是可以使用 Django 调用 uWSGI 服务器的一种方式:
--chdir=/var/django/projects/myapp \
--module=myapp.wsgi:application \
--env DJANGO_SETTINGS_MODULE=myapp.settings \
--master --pidfile=/usr/local/var/run/uwsgi/project-master.pid \
--socket=127.0.0.1:29000 \
--processes=5 \
--uid=505 --gid=505 \
--harakiri=20 \
--max-requests=5000 \
--vacuum \
--daemonize=/usr/local/var/log/uwsgi/myapp.log
有了这些选项,下面是一个用于 Django 项目的示例 NGINX 配置:
http {
# ...
upstream django {
server 127.0.0.1:29000;
}
server {
listen 80;
server_name myapp.example.com;
root /var/www/myapp/html;
location / {
index index.html;
}
location /static/ {
alias /var/django/projects/myapp/static/;
}
location /main {
include /etc/nginx/uwsgi_params;
uwsgi_pass django;
uwsgi_param Host $host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
}
}
}
该配置定义了一个名为 django 的upstream。组中服务器上的端口号 29000 与 uWSGI 服务器绑定到的端口号匹配,如示例 uwsgi命令中的 socket参数所指定。
静态内容的提供被卸载(offloaded)到 NGINX ,后者直接从 /var/django/projects/myapp/static 提供服务。/main 处的应用程序的流量从 HTTP 代理并桥接到 uwsgi 协议,并传递到 uWSGI 应用程序容器内运行的 Django 应用程序。