发布于 2026-01-06 7 阅读
0

了解 nginx(代理、反向代理、负载均衡)

了解 nginx(代理、反向代理、负载均衡)

这篇文章最初发布在我的博客legobox上。

背景

许多人认为 Nginx 只是一个 Web 服务器,没错,它就是一个 Web 服务器,但它的功能远不止于此。Nginx 首先是一个代理引擎和负载均衡服务器机制,它能够使用你想要的任何后处理解释器(无论是 uWSGI、php-fpm 等)作为 Web 服务器运行。

我们很多人都听说过 nginx,有些人很想了解它到底是什么,在本文中,我们将深入了解如何使用 nginx 作为负载均衡器和通用代理传递器。

先决条件

在开始使用 nginx 之前,通常需要(但并非强制要求)满足以下条件:

  • 你想学习和了解更多关于DevOps的知识。
  • 您对网络服务器的基本概念有所了解。
  • 你以前用过电脑。😏

如果这些都掌握了,那就万事俱备了。

代理

我们要了解的第一个场景和结构是代理的概念。简单来说,代理就是将一台服务器置于另一台服务器之前,所有发送到第二台服务器的请求都必须先经过第一台服务器。

在 nginx 中,这是通过使用proxy pass指令实现的。

    // basic proxy pass
    location / {
      proxy_pass http://ourserver2here.com
    }
Enter fullscreen mode Exit fullscreen mode

代理通行证有很多技巧,这些技巧对于理解如何设置代理通行证系统非常重要,让我们在书中看看其中的一些技巧。

匹配前缀

    location /match/here {
      proxy_pass http://ourserver2here.com;
    } 
Enter fullscreen mode Exit fullscreen mode

在上述配置中,代理传递定义中服务器地址末尾没有指定 URI。在这种情况下,例如/match/here/please这样的请求,会被发送到 ourserver2here,地址为https://ourserver2here/match/here/please。是不是很方便?

反向代理

这是一种特别有趣的代理类型。在这种代理系统中,发送到服务器(我们称之为 A)的请求实际上被发送到另一个服务器(我们称之为 B),该服务器位于第一个服务器(服务器 A)的前面,并将消息转发给 A,并像 A 本身一样做出响应。

以下是更正式的描述。

在计算机网络中,反向代理是一种代理服务器,它代表客户端从一个或多个服务器检索资源。然后,这些资源会返回给客户端,就好像它们直接来自 Web 服务器一样。

以下是虚拟描述

来源 - 维基百科 - 如此善良的人们

使用 nginx,我们可以实现这一点,甚至可以更进一步。你听说过 ngrok 吗?也许听说过,也许没有,无论如何。

Ngrok 是一项服务,它允许您通过域名代理来提供本地应用程序,并通过公共 URL 将其公开。

通过反向代理,并在您的网站上为这类企业设置子域名,您就可以拥有自己的 ngrok,而无需不断更改域名等。

要实现这一点,第一步是在您的服务器上设置 nginx,将来自您的特定子域或域(您觉得方便的任何一种)的连接代理到服务器上的特定端口。

    server {
      listen 80;

      server_name coolsubdomain.mainname.com;

      location / {
        proxy_pass http://127.0.0.1:5000; #in this case we picked the port 5000
      }
    }
Enter fullscreen mode Exit fullscreen mode

在您的计算机上,假设我们的应用程序运行在本地主机端口 8000 上(实际上可以是任何端口),继续使用 ssh,我们运行一个反向隧道到服务器上的端口。

    // run a reverse proxy to your server via ssh
    ssh -R 5000:127.0.0.1:8000 youruser@mainname.com
Enter fullscreen mode Exit fullscreen mode

这样就设置了反向代理,因此任何发送到 coolsubdomain.mainname.com 的请求实际上都会到达您的本地主机。

负载均衡

负载均衡是 nginx 能够独特地解决的另一个问题,它专为处理大量请求而设计,如果我们有多个服务器运行我们的项目,我们可以使用上游服务器在它们之间平衡负载。

Nginx 使用上游服务器来平衡负载,并且默认情况下有一些算法用于处理负载均衡机制。

这些算法由指令指定,可以概括如下。

  • (轮询):默认的负载均衡算法,当没有其他负载均衡指令时使用。上游上下文中定义的每个服务器会按顺序依次接收请求。

  • least_conn:指定新连接始终分配给活动连接数最少的后端。这在后端连接可能持续一段时间的情况下尤其有用。

  • ip_hash:这种负载均衡算法根据客户端的 IP 地址将请求分配到不同的服务器。它使用 IP 地址的前三个字节作为密钥来决定由哪个服务器处理请求。这样一来,客户端每次都倾向于由同一台服务器提供服务,从而有助于保持会话的一致性。

  • 哈希:这种负载均衡算法主要用于 Memcached 代理。服务器根据任意提供的哈希键的值进行划分。哈希键可以是文本、变量或它们的组合。这是唯一一种需要用户提供数据的负载均衡方法,该数据即为哈希键。

设置负载均衡时,可能看起来像这样。

    # http context
    upstream backend_hosts {
      least_conn;
      server host1.example.com;
      server host2.example.com;
      server host3.example.com;
    }

    # next we set up our server
    server {
      listen 80;
      server_name example.com;
      location /proxy-me {
        proxy_pass http://backend_hosts;
      }
    }
Enter fullscreen mode Exit fullscreen mode

我们甚至可以给特定主机增加权重,使其按照一定比例处理比其他主机更多的连接。

    ...
    upstream backend_hosts {
      least_conn;
      server host1.example.com weight=3;
      server host2.example.com;
      server host3.example.com;
    }
    ...

Enter fullscreen mode Exit fullscreen mode

结论

nginx 的功能远不止这些,这只是冰山一角。搭建 Web 服务器和代理服务器通常比较麻烦,但其实不必如此。

在本类别下的下一篇文章中,我将探讨如何使用 Caddy 来启动和运行它,Caddy 是一种 Web 服务器技术,旨在使设置 Web 服务器和代理引擎的过程变得更加容易。

文章来源:https://dev.to/legobox/understanding-nginx-proxying-reverse-proxying-load-balancing-1pjd