下面是实现多台服务器负载均衡的完整攻略。
1. 安装配置Nginx
首先,我们需要安装 Nginx,并进行配置。可以使用以下命令在 Debian / Ubuntu 上安装 Nginx:
sudo apt update
sudo apt install nginx -y
安装完成后,您将在以下位置找到 Nginx 的主配置文件:
/etc/nginx/nginx.conf
我们需要修改此文件,以便实现多台服务器的负载平衡。以下是一个示例配置:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
upstream backend {
server 192.168.1.2;
server 192.168.1.3;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
在上面的配置中,我们通过 upstream
声明了一个名为 backend
的集群,在其中以逗号分隔指定了 2 台服务器的 IP 地址。
2. 进行测试
配置完成后,我们需要测试是否能够实现负载平衡。我们可以使用 ab
命令(apache bench)模拟多个用户同时访问服务器。以下是一个示例命令:
ab -n 1000 -c 10 http://example.com/
这个命令将发出 1000 个请求,每次并发 10 个请求,并记录服务器的响应时间,成功率等数据。您可以根据需要调整 -n
和 -c
参数。
3. 使用Nginx实现动态负载均衡
上面的示例将配置固定在 Nginx 的配置文件中,如果需要调整集群成员,则需要手动修改配置文件。为了更加智能地实现负载平衡,我们可以添加动态负载平衡模块,例如 nginx-upsync-module
。
使用这个模块,我们可以在 Nginx 配置中使用 upsync
命令自动获取集群成员。以下是一个示例配置:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
upstream backend {
upsync 192.168.1.4:8080/get_backend;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 8080;
location /get_backend {
content_by_lua '
-- 从数据库或其他数据源获取集群成员列表
local backend_servers = {
"192.168.1.2",
"192.168.1.3"
}
-- 输出成员列表
ngx.say(table.concat(backend_servers, "\n"))
';
}
}
}
在上面的配置中,upsync
命令将调用 /get_backend
接口获取集群成员列表。同时,在 Nginx 中添加了一个 /get_backend
接口,该接口将实现从数据库或其他数据源动态获取集群成员列表。这个示例仅仅是一个简单的 Lua 脚本模拟了这个过程。
示例一
我曾经在一家公司,他们需要高可用性,因此部署了多台服务器来实现负载均衡,同时他们还需要实现动态添加服务器节点或者删除服务器节点。根据他们的需求我实现了一个可动态加载服务器节点的 Nginx 配置文件。其架构如下:
- 使用 Nginx 的 upstream 指令来指定了后端服务器的地址,upstream 后面的 server 指令依次指定了后端服务器的地址。
- 添加一个 server 块(如果你知道 Nginx 配置文件的话,就应该知道 server 块是由 listen 指令构成)指定了代理服务器所使用的 IP 地址和监听的端口号。
- 在 nginx.conf 中的 http 块中添加了一些额外的指令,使 Nginx 能够接受客户端的请求并将其转发到后端的服务器上。
在这个文件中,backend 是一个代理的服务器,替换为实际使用的服务器名或 IP 地址。listen 80 表示 Nginx 将监听客户端的 80 端口的 HTTP 请求。
配置文件中有一个 get_backend 地址,用于传输节点信息的地址。以下是包含 Lua 脚本的示例:
upstream backend {
upsync http://192.168.1.10/get_backend interval=2m;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 8080;
location /get_backend {
content_by_lua_block {
local function get_upstream_servers()
-- some lua code to get the list of upstream servers from anywhere
return {
"192.168.1.2:8080",
"192.168.1.3:8080",
"192.168.1.4:8080",
}
end
ngx.say(table.concat(get_upstream_servers(), "\n"))
}
}
}
其中 upstream 块声明了我们需要负载均衡的后端服务器列表,并使用 upsync 指令从指定的 get_backend 地址获得节点信息。location 块是对外访问地址指令,这里指定了 Nginx 监听的 80 号端口。
示例二
下面是 Guzzle HTTP 客户端可以在 PHP 中使用来解析为您提供负载均衡支持的 Nginx 配置中的节点列表:
use GuzzleHttp\Client;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
class NginxUpstreamServers {
public static function getServers(string $nginxUrl, string $cacheFile = null): array {
if ($cacheFile) {
$cache = new FilesystemAdapter('', 3600, $cacheFile);
$servers = $cache->getItem('nginx_upstream_servers')->get();
if ($servers) {
return $servers;
}
}
$client = new Client([
'base_uri' => trim($nginxUrl, '/') . '/',
'timeout' => 10.0,
]);
$res = $client->request('GET', 'get_backend');
$servers = explode("\n", (string)$res->getBody());
$servers = array_map(function($server) {
return trim($server);
}, $servers);
$servers = array_filter($servers);
if ($cacheFile) {
$cache->getItem('nginx_upstream_servers')->set($servers);
}
return $servers;
}
}
这个 PHP 类当中使用了 Guzzle HTTP 客户端来向 Nginx 的节点获取地址列表,支持缓存以及超时等参数设置,并返回一个节点列表的数组。你可以在你的代码中使用这个类来访问上述 nginx 配置文件中的 get_backend 接口地址,获取动态更新的节点地址列表。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nginx配置之实现多台服务器负载均衡 - Python技术站