Nginx 反向代理与负载均衡

1,817 阅读3分钟

Nginx 是啥?

Nginx 是一个高性能的 Web 和反向代理服务器,它具有非常优越的特性:

  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,得益于 Nginx 选择了 epoll and kqueue 作为开发模。

  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

  • 作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器。

Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。

代理服务器

正向代理隐藏的是用户(客户端的代理),服务端不知道实际发起请求的客户端;反向代理隐藏的是服务器(服务器端的代理),客户端不知道实际提供服务的服务端。

正向代理

正向代理是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端。

比如:我们通过 Virtual Private Network(虚拟专用网络隧道)访问谷歌,如下图所示:

image-20220201144239353

正向代理隐藏了用户,用户的请求被代理服务器接收代替,到了服务器,服务器并不知道用户是谁。

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

比如:我们通过百度查询,百度肯定不是一台服务器,但我们都是通过 www.baidu.com 查询,我们也不知道它实际请求了那台服务器得到的结果,如下图所示:

image-20220201143944430

用户请求过多,服务器会有一个处理的极限。所以使用反向代理服务器接受请求,再用均衡负载将请求分布给多个真实的服务器。既能提高效率还有一定的安全性。

负载均衡

Nginx 提供的负载均衡策略有2种,内置策略和扩展策略。内置策略:轮询、加权轮询与 Ip hash。扩展策略:fair、url_hash 等。

首先给大家说下 upstream 这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。

upstream mysvr { 
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}
server {
    ....
    location  ~*^.+$ {         
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
    }
}

热备

如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....

upstream mysvr {
    server 127.0.0.1:8080; 
    server 127.0.0.1:8081 backup;  #热备     
}

轮询

nginx 默认就是轮询其权重都默认为1。服务器处理请求的顺序:ABABABABAB....

upstream mysvr {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

加权轮询

根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....

upstream mysvr {
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=2;
}

ip_hash

客户端请求的 ip 进行 hash 操作,然后根据 hash 结果将同一个客户端 ip 的请求分发给同一台服务器进行处理,可以解决session 不共享的问题。

upstream mysvr {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    ip_hash;
}

实战一下

window 环境下使用 nginx 做反向代理服务器,并配置负载均衡!

下载与安装

点击 nginx 下载,下载完成后解压就可以使用,无需安装。

image-20220201151826098

运行

双击 nginx.exe,浏览器访问 127.0.0.1 出现如下页面即可。

image-20220201152023376

配置反向代理

1.修改 nginx 的配置文件,在 conf 目录下的 nginx.conf。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
			proxy_pass  https://www.baidu.com;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2.修改了 nginx 的配置文件 nginx.conf 时,需要执行命令 nginx -s reload 即可让改动生效。

3.再次访问 127.0.0.1,出现了百度。如下图所示:

image-20220201154105432

配置负载均衡

1.修改 nginx 的配置文件,在 conf 目录下的 nginx.conf。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	
	upstream mysvr { 
		server 127.0.0.1:8081 weight=3;
		server 127.0.0.1:8080;
	}
	
	server {
		listen 8080;
		location / {
			proxy_pass https://www.baidu.com;
		}
	}
	
	server {
		listen 8081;
		location / {
			proxy_pass https://cn.bing.com;
		}
	}

    server {
        listen       80;
        server_name  mysvr;

        location / {
            proxy_pass http://mysvr;
			proxy_set_header Host mysvr;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header REMOTE-HOST $remote_addr;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2.修改了 nginx 的配置文件 nginx.conf 时,需要执行命令 nginx -s reload 即可让改动生效。

3.再次访问 127.0.0.1,出现了百度/必应,随着刷新浏览器变化。