一、前言
在 分布式架构(一)中,我们通过编排工具docker-compose,创建了一组服务,其中:
服务容器 | IP | 对宿主机暴露的端口号 | 作用 |
---|---|---|---|
宿主机 | 192.168.78.104 | 提供对外访问 | |
swoft_110 | 172.22.22.110 | 18110 | 提供业务服务 |
swoft_120 | 172.22.22.120 | 18120 | 提供业务服务 |
swoft_130 | 172.22.22.130 | 18130 | 提供业务服务 |
nginx1.21 | 172.22.22.20 | 81 | 提供代理服务、负载均衡 |
consul1.10 | 172.22.22.30 | 8500 | 提供服务注册、发现,配合Nginx提供动态负载均衡 |
本节,会先介绍单纯的Nginx负载均衡,下一节会介绍使用consul配合Nginx进行动态负载均衡。
二、编辑Nginx配置文件 nginx.conf
worker_processes 4;
worker_cpu_affinity auto; #自动绑定cpu跟进程的关系
events {
worker_connections 100000; #设置单个worker连接数
}
error_log logs/error.log error;
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream swoft_server {
server 172.22.22.110:18306 max_fails=2 fail_timeout=30s;
server 172.22.22.120:18306 max_fails=2 fail_timeout=30s;
server 172.22.22.130:18306 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
root /www;
location / {
proxy_pass http://swoft_server;
}
}
}
三、访问宿主机IP:81,查看结果
为了验证确实是已经负载均衡了,可以在swoft框架中的app/Http/Controller/HomeController.php文件中,添加一个test方法,输出提供服务的ip
/**
* @RequestMapping("/test")
*/
public function test()
{
exec("ifconfig", $out, $stats);
return $out;
}
这时,访问192.168.78.104:81/test
,连续访问三次,会依次得到结果
inet 172.22.22.110
inet 172.22.22.120
inet 172.22.22.130
证明现在已经实现了负载均衡。
首先,通过宿主机访问81端口,因为宿主机的81端口映射着nginx容器的80端口,所以实际上访问的是nginx容器的80端口。
之后,nginx又做了一次负载均衡,由于没有设置权重和hash等,所以是轮询访问upstream中配置的ip地址,也就是三台swoft服务。
这里需要注意的是宿主机已经关掉了防火墙或开放了81端口,否则会访问不了。