《前端运维》二、Nginx–4代理、负载均衡与其他

一、代理服务

用简单的话来说更容易理解。客户端访问服务器不是直接访问,而是通过中间代理服务器,代理服务器再访问服务器。就像一个中转站,不管怎样,只要从客户端到服务器,你都要经过我。

一)转发代理

正向代理是指代理服务器充当客户端的代理,也就是说,服务器不知道真正的客户端是谁,并通过代理服务器将请求发送给真正的服务器。例如,如果您通过公司网络在外网访问百度,公司的代理服务器将代理您的主机访问百度网站。百度服务器获取不到你的个人真实主机ip。

如上图。 web1、web2是你在公司的个人主机ip,然后通过公司的nginx代理服务器访问外网。

语法:

Syntax: proxy_pass URL
Default: --
Context: server,location

练习:

删除之前的配置,然后我们添加转发代理配置:

resolver 8.8.8.8; #谷歌的域名解析地址
location / {
    # $http_host 要访问的主机名 $request_uri请求路径
    proxy_pass http://$http_host$request_uri;
}

这样,nginx的转发代理配置其实就ok了,哦对了,别忘了重新加载nginx服务器。需要进行一些额外的修改,以便我们可以在本地进行测试。系统,修改本机的hosts文件,地址为:C:\\etc。里面有一个主机,通过编辑器打开,添加如下内容:

ip(你服务器的ip)(空格)域名(随便一个域名)

我添加后是这样的:

然后就可以正常访问百度了,或者其他域名地址,也可以通过curl访问。但我们其实无所谓,所以我们看一下nginx日志,在/var/log/nginx/.log中。

二)反向代理

反向代理,简单来说,代理服务器就是服务器,客户端不知道真正的服务器是什么。

nginx配置如下:

location ~ ^/api {

    proxy_pass http://localhost:3000;
    proxy_redirect default; #重定向
    proxy_set_header Host $http_host;        #向后传递头信息
    proxy_set_header X-Real-IP $remote_addr; #把真实IP传给应用服务器
    proxy_connect_timeout 30; #默认超时时间
    proxy_send_timeout 60;    # 发送超时
    proxy_read_timeout 60;    # 读取超时
    proxy_buffering on;             # 在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们 被写满或者数据被读取完(EOF)
    proxy_buffers 4 128k;           # proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size
    proxy_busy_buffers_size 256k;   # proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制的,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。
    proxy_buffer_size 32k;          # 用来存储upstream端response的header
    proxy_max_temp_file_size 256k; # response的内容很大的 话,Nginx会接收并把他们写入到temp_file里去,大小由proxy_max_temp_file_size控制。如果busy的buffer 传输完了会从temp_file里面接着读数据,直到传输完毕。
}

然后我们需要将它安装在服务器节点上,只需在node官网下载linux版本node的二进制包,通过ftp传输到服务器即可。然后解压node包,然后配置node环境变量。这个就不多说了,大家可以百度一下。

然后我们在服务器上新建一个节点http服务,端口号3000、4000、5000,对,创建三个文件。是在服务器上,其实和本地没有什么区别。

然后我们可以通过浏览器将你的 ip/api/xxx 代理到 3000 端口上的服务。哦对了,别忘了在服务器上启动你的节点服务。

二、负载平衡

我们先来看一张图:

使用集群是网站解决高并发、海量数据问题的常用方法。当服务器的处理能力和存储空间不足时,不要试图用更强大的服务器来代替它。对于一个大型网站来说,再强大的服务器也无法满足网站不断增长的业务需求。在这种情况下,增加一台服务器来分担原服务器的访问和存储压力更为合适。通过负载均衡调度服务器将来自浏览器的访问请求分发到应用服务器集群中的任意服务器。如果有更多用户,则将更多应用程序服务器添加到集群中以将负载放在应用程序服务器上。不再是整个网站的瓶颈。

接下来我们看看如何通过nginx服务器配置集群。首先,我们需要在 nginx 服务器上创建几个不同端口号的节点服务。节点服务的代码类似这样:

var http = require( 'http' );

var server =http.createServer( function ( request ,response ){
    response.end('server3 000');
} );
server.listen( 3000 ,function(){
console.log( 'HTTP服务器启动中,端口:3000' );
});

那么,nginx可以这样配置:

http{
upstream zhufeng {
    server 127.0.0.1:3000 weight=10;
    server 127.0.0.1:4000;
    server 127.0.0.1:5000;
}
server {
        location / {
            proxy_pass http://zhufeng;
        }
    }
}

然后,安装 pm2:

yum install pm2 -g

如果太慢,可以试试淘宝园。我不会在这里谈论如何配置它。然后安装好pm2后,通过pm2启动各个节点服务。 pm2 是节点应用程序的进程管理器。

然后,可以通过以下命令启动并查看节点服务进程:

# 启动node服务
pm2 start xxx.js name xxx

# 查看当前服务
pm2 list

后端服务器调试状态:

状态说明

向下

当前服务器不参与负载均衡

其他节点不可用时备份的服务器

请求失败的次数,达到最大次数后休眠

失败后暂停服务的时间,默认10秒

限制每个接收的最大连接数,高性能服务器可以有更多的连接

例子:

upstream webserver{
  server localhost:3000 down;
  server localhost:4000 backup;
  server localhost:5000 max_fails=1 fail_timeout=10s;
}

分发方式:

类型类型

轮询(默认)

对于每一个请求,按时间顺序一一分配给不同的后端服务器。如果后端服务器宕机,可以自动淘汰

(加权轮询)

指定轮询概率,与访问率成正比,用于后端服务器性能不均的情况

每个请求都根据访问ip的hash结果进行分配,这样每个访问者对后端服务器都有固定的访问权限,可以解决问题

任何连接数少的机器都会被分配给谁

(第三方)

根据访问的URL地址分发,每个URL都指向同一个后端服务器(缓存)

图片[1]-《前端运维》二、Nginx–4代理、负载均衡与其他-唐朝资源网

公平(第三方)

根据后端服务器的响应时间分配请求,响应时间短的优先级分配

正定义散列

哈希自定义键

示例:

upstream webserver{
  ip_hash;
  server 127.0.0.1:3000;
}
upstream webserver{
  least_conn;
  server 127.0.0.1:3000;
}
upstream webserver{
  url_hash;
  server 127.0.0.1:3000;
}
upstream webserver{
  fair;
  server 127.0.0.1:3000;
}
upstream webserver{
  hash $request_uri;
  server 127.0.0.1:3000;
}

三、其他一)缓存

首先,缓存有很多种,比如我之前学过的浏览器缓存,还有应用服务器缓存、代理缓存、客户端缓存等等等等。我们可以在nginx中使用来设置代理缓存.

http{  
    # 缓存路径 目录层级 缓存空间名称和大小 失效时间为7天 最大容量为10g
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:100m inactive=60m max_size=10g;  
}  

稍微复杂一点的方式如下:

    if ($request_uri ~ ^/cache/(login|logout)) {
      set $nocache 1;
    }
    location / {
       proxy_pass http://webserver;
    }
    location ~ ^/cache/ {
     proxy_cache cache;
     proxy_cache_valid  200 206 304 301 302 60m;   # 对哪些状态码缓存,过期时间为60分钟
     proxy_cache_key $uri;  #缓存的维度
     proxy_no_cache $nocache;
     proxy_set_header Host $host:$server_port;  #设置头
     proxy_set_header X-Real-IP $remote_addr;   #设置头
     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;   #设置头
     proxy_pass http://127.0.0.1:6000;
    }

然后,上面各个字段的含义如下:

键值含义

使用名为cache的对应缓存配置

200 206 304 301 302 10d;

© 版权声明
THE END
喜欢就支持一下吧
点赞108赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容