返回介绍

8.2 使用 Nginx 作为反向代理

发布于 2025-03-08 19:24:52 字数 3779 浏览 0 评论 0 收藏 0

一个代理服务器是一台中转客户端资源请求到适当的服务器的机器。一些网络安装使用代理服务器过滤或缓存本地网络机器到 Internet 的 HTTP 请求。因为我们将运行一些在不同 TCP 端口上的 Tornado 实例,因此我们将使用反向代理服务器:客户端通过 Internet 连接一个反向代理服务器,然后反向代理服务器发送请求到代理后端的 Tornado 服务器池中的任何一个主机。代理服务器被设置为对客户端透明的,但它会向上游的 Tornado 节点传递一些有用信息,比如原始客户端 IP 地址和 TCP 格式。

我们的服务器配置如图 8-1 所示。反向代理接收所有传入的 HTTP 请求,然后把它们分配给独立的 Tornado 实例。

图 8-1

图 8-1 反向代理服务器后端的 Tornado 实例

8.2.1 Nginx 基本配置

代码清单 8-1 中的列表是一个 Nginx 配置的示例。Nginx 启动后监听来自 80 端口的连接,然后分配这些请求到配置文件中列出的上游主机。在这种情况下,我们假定上游主机监听来自他们自己的环回接口上的端口的连接。

代码清单 8-1 一个简单的 Nginx 代理配置

user nginx;
worker_processes 5;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
}

proxy_next_upstream error;

upstream tornadoes {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
}

server {
    listen 80;
    server_name www.example.org *.example.org;

    location /static/ {
        root /var/www/static;
        if ($query_string) {
            expires max;
        }
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://tornadoes;
    }
}

这个配置示例假定你的系统使用了 epoll。在不同的 UNIX 发行版本中经常会有轻微的不同。一些系统可能使用了 poll、/dev/poll 或 kqueue 代替。

按顺序来看匹配 location /static/或 location /的请求可能会很有帮助。Nginx 把位于 location 指令中的字符串看作是一个以行起始锚点开始、任何字母重复结束的正则表达式。所以/被看作是表达式^/.*。当 Nginx 匹配这些字符串时,像/static 这样更加特殊的字符串在像/这样的更加的通用的字符串之前被检查。Nginx 文档中详细解释了匹配的顺序。

除了一些标准样板外,这个配置文件最重要的部分是 upstream 指令和服务器配置中的 proxy 指令。Nginx 服务器在 80 端口监听连接,然后分配这种请求给 upstream 服务器组中列出的 Tornado 实例。proxy_pass 指令指定接收转发请求的服务器 URI。你可以在 proxy_pass URI 中的主机部分引用 upstream 服务器组的名字。

Nginx 默认以循环的方式分配请求。此外,你也可以选择基于客户端的 IP 地址分配请求,这种情况下(除非连接中断)可以确保来自同一 IP 地址的请求总是被分配到同一个上游节点。你可以在 HTTPUpstreamModule 文档 中了解更多关于这个选项的知识。

还需要注意的是 location /static/指令,它告诉 Nginx 直接提供静态目录的文件,而不再代理请求到 Tornado。Nginx 可以比 Tornado 更高效地提供静态文件,所以减少 Tornado 进程中不必要的加载是非常有意义的。

8.2.2 Nginx 的 SSL 解密

应用的开发者在浏览器和客户端之间传输个人信息时需要特别注意保护信息不要落入坏人之手。在不安全的 WiFi 接入中,用户很容易受到 cookie 劫持攻击,从而威胁他们在流行的社交网站上的账户。对此,大部分主要的社交网络应用都默认或作为用户可配置选项使用安全协议。同时,我们使用 Nginx 解密传入的 SSL 加密请求,然后把解码后的 HTTP 请求分配给上游服务器。

代码清单 8-2 展示了一个用于解密传入的 HTTPS 请求的 server 块,并使用代码清单 8-1 中我们使用过的代理指令转发解密后的通信。

代码清单 8-2 使用 SSL 的 server 块

server {
    listen 443;
    ssl on;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/cert.key;

    default_type application/octet-stream;

    location /static/ {
        root /var/www/static;
        if ($query_string) {
            expires max;
        }
    }

    location = /favicon.ico {
        rewrite (.*) /static/favicon.ico;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://tornadoes;
    }
}

这段代码和上面的配置非常相似,除了 Nginx 将在标准 HTTPS 的 443 端口监听安全 Web 请求外。如果你想强制使用 SSL 连接,你可以在 server 块中包含一个 rewrite 指令来监听 80 端口的 HTTP 连接。代码清单 8-3 是这种重定向的一个例子。

代码清单 8-3 用于重定向 HTTP 请求到安全渠道的 server 块

server {
    listen 80;
    server_name example.com;

    rewrite /(.*) https://$http_host/$1 redirect;
}

Nginx 是一个非常鲁棒的工具,我们在这里仅仅接触到帮助 Tornado 部署的一些简单的配置选项。Nginx 的 wiki 文档 是获得安装和配置这个强有力的工具额外信息的一个非常好的资源。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文