了解 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
}
代理通行证有很多技巧,这些技巧对于理解如何设置代理通行证系统非常重要,让我们在书中看看其中的一些技巧。
匹配前缀
location /match/here {
proxy_pass http://ourserver2here.com;
}
在上述配置中,代理传递定义中服务器地址末尾没有指定 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
}
}
在您的计算机上,假设我们的应用程序运行在本地主机端口 8000 上(实际上可以是任何端口),继续使用 ssh,我们运行一个反向隧道到服务器上的端口。
// run a reverse proxy to your server via ssh
ssh -R 5000:127.0.0.1:8000 youruser@mainname.com
这样就设置了反向代理,因此任何发送到 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;
}
}
我们甚至可以给特定主机增加权重,使其按照一定比例处理比其他主机更多的连接。
...
upstream backend_hosts {
least_conn;
server host1.example.com weight=3;
server host2.example.com;
server host3.example.com;
}
...
结论
nginx 的功能远不止这些,这只是冰山一角。搭建 Web 服务器和代理服务器通常比较麻烦,但其实不必如此。
在本类别下的下一篇文章中,我将探讨如何使用 Caddy 来启动和运行它,Caddy 是一种 Web 服务器技术,旨在使设置 Web 服务器和代理引擎的过程变得更加容易。
文章来源:https://dev.to/legobox/understanding-nginx-proxying-reverse-proxying-load-balancing-1pjd
