Nginx 学习笔记 ·

Nginx反向代理-负载均衡

本文主要介绍一下nginx反向代理负载均衡配置方法,反向代理是指通过nginx暴露对外端口,然后由Nginx转发到本机或其他机器上的方式,例如我对外暴露域名为aa.com
本机通过nodejs启动服务,监听的是3000端口,,那么可以通过反向代理的方式,通过Nginx转到3000的服务上去,即通过访问aa.com就能访问3000的服务。

反向代理

如下为开启一个node服务示例

const http = require('http');

const port = normalizePort('3000');

const server = http.createServer();

server.listen(port);
server.on('listening', onListening);
server.on('request', function (req,res){
  res.statusCode = 200
  res.setHeader('Content-Type','text/html;charset=utf-8')

  res.end("这是一个测试页面")

})
function onListening() {
  const addr = server.address();
  const bind = typeof addr === 'string'
      ? 'pipe ' + addr
      : 'port ' + addr.port;
  console.log('Http server listening on port ' + port);
}

在控制在运行node node.js,
这样我们就启动了一个在3000端口运行的服务,直接访问http://127.0.0.1:3000即可,前期服务工作准备完成了,下面就开始对nginx的配置信息进行修改。

server {
        listen 80;
        server_name  aa.com;
        location / {
            root   html;
            proxy_set_header Host host;
            proxy_set_header X-Real-IPremote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 这里指将请求转发给3000端口的服务
            proxy_pass http://127.0.0.1:3000;
        }
    }

至此一个反向代理就基本完成了。

负载均衡

当前这个服务只是单服务,如果想做负载均衡,需要再启动一个node服务,我们将前面的node服务修改一下,监听3001端口,然后启动,这样,就会有两个相同的服务存在了。

然后在nginx配置上做一些修改,如下

upstream my_nginx_boot {
   # 当前用的是本机,此处IP可以是外网或内网其他机器的ip
    server 127.0.0.1:3000 weight=100 max_fails=2 fail_timeout=30s;
    server 127.0.0.1:3001 weight=200 max_fails=2 fail_timeout=30s;
}
server {
        listen 80;
        server_name  aa.com;
        location / {
            root   html;
            proxy_set_header Host host;
            proxy_set_header X-Real-IPremote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 这里指将请求转发给3000端口的服务
            proxy_pass http://my_nginx_boot;
        }
    }

上面的 my_nginx_boot 标识的是负载列表,在30秒内检查心跳发送两次包,未回复就代表该机器宕机了,请求分发权重比为2:1

如果其中一个机器未回复,则会自动转到另一台机器上,30秒内两次请求均失败的话在30秒内就不会在向该机器发送请求,当该机器启动后,在下一个30秒回再次收到请求。

Nginx请求分发原理

客户端发出的aa.com 最终回转变为http://aa.com:80,经过DNS解析后向目标IP发起请求
- 由于Nginx监听了当前服务器的80端口,所以最终该请求回找到Nginx进程;
- Nginx首先回根据配置的location规则进行匹配,根据客户端的请求路径/,会定位到location /{}规则
- 然后根据配置的proxy_pass 会再找到名为my_nginx_boot的upstream
- 最后根据upstream中配置的信息,将请求转发到运行的web服务的机器处理,由于配置了多个web服务,且配置了权重值,因为Nginx会依次根据权重比进行分发请求

参与评论