Nginx反向代理总结

nginx,反向,代理,总结 · 浏览次数 : 53

小编点评

**1. LVS 的方案** LVS 是一个反向代理,它可以用来将多个服务提供给一个应用程序。LVS 使用一个共享存储系统来缓存请求和响应,这可以提高性能。 **2. DNS 轮询 的方案** DNS 轮询是一种网络协议,它可以帮助应用程序从多个 DNS 服务器中获取域名名的 IP 地址。DNS 轮询可以确保应用程序始终连接到可用的服务,即使有一个服务服务器发生故障。 **3. Nginx 的 4层代理** Nginx 的 4层代理是一种反向代理,它可以将请求转发给多个服务服务器。4层代理可以使用多种算法来实现负载均衡,例如 Round Robin 和 least-conn。 **4. Nginx 的 7层代理** Nginx 的 7层代理是一种高级反向代理,它可以使用多种技术来实现负载均衡,例如 IP 地址和端口绑定、缓存和 SSL 握手。 **5. 网络 NAT 的处理 Nginx 的反向代理** 网络地址翻译 (NAT) 是一个技术,它可以将多个服务服务器的 IP 地址映射到一个公共 IP 地址。Nginx 的 7层代理可以用于提供 NAT 服务,从而让多个服务服务器可以访问同一个 IP 地址。

正文

反向代理的种类

1. LVS的方案
2. DNS轮询的方案
3. Nginx的4层代理
4. Nginx的7层代理
5. 网络NAT的处理

Nginx的反向代理-四层`

编译时增加 --with-stream 就可以.
然后可以使用 stream 四层反向代理
可以代理 mysql redis 以及一些其他的内容配置. 
但是四层反向代理缺少很多语法, 比如七层反向代理来的适用面广
一个四层反向代理的标准处理为:

stream {
    upstream backend {
        # 指定负载均衡算法,这里是一致性hash算法,以$remote_addr作为hash的键.
        hash $remote_addr consistent;

        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }
    server {
        # 指定监听的端口,tcp/udp
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        # 代理至backend服务器组
        proxy_pass backend;
    }

关于四层反向代理的几个负载均衡算法

round-robin:  默认情况下,NGINX使用循环算法对流量进行负载均衡,将其顺序​​定向到配置的上游组中的服务器。
              因为它是默认方法,没有round-robin指令; 只需upstream在顶层stream上下文中创建一个
              配置块并添加上server一步中描述的指令。
least_conn : NGINX选择当前活动连接数较少的服务器。
least_time : NGINX选择平均延迟最小,活动连接数最少的服务器。
             最低平均延迟是基于以下参数中的哪一个包括在least_time指令上计算的:
    connect - 连接到上游服务器的时间
    first_byte - 接收数据的第一个字节的时间
    last_byte - 从服务器接收完整响应的时间
hash       : NGINX基于用户定义的密钥选择服务器,例如源IP地址
所述散列负载平衡方法还用于配置会话持久性。
于散列函数基于客户端IP地址,来自给定客户端的连接始终传递到同一服务器,
除非服务器关闭或以其他方式不可用。指定一个可选consistent参数以应用ketama一致性散列方法:

四层的负载均衡的范例

upstream backend {
    laset_conn ; 
}
upstream backend {
    least_time first_byte; 
}
upstream stream_backend {
    hash   $remote_addr consistent;
}
# 能够实现客户端绑定到具体的服务器端. 

http负载均衡

除了四层反向代理, 用的最多的是 七层反向代理. 

http {
    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com;
        server 192.0.0.1 backup;
    }

    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

区别

四层反向代理是在 stream 的配置节里面
七层反向代理是在 http   的配置节里面

四层反向代理  可以指定 udp和tcp两种协议. 
七层反向代理  可以指定 https等. 

http 的负载均衡算法

与四层负载均衡对应, 七层负载均衡也有很多算法. 
least_conn; 
ip_hash;
hash $request_uri consistent;
least_time header; (header,last_byte)

可以增加 weight=xxx 的比重,如果服务器配置不同,可以进行一定程度的区分. 

关于sitcky以及ip_hash

ip_hash 是 nginx 开源版就支持的负载均衡粘滞模式.
最大的区别是, 他是基于内核里面的ip地址进行计算来的. 
具体算法是:
注意代码的位置为:src/http/modules/ngx_http_upstream_ip_hash_module.c
注意修改 : addrlen 的参数 从 3 修改为 4 就可以进行全部ipv4段的负载均衡.
但是需要注意如果是VPN 过来的IP电话, 或者是如下hash算法的处理的结果一致
依旧会路有到相同的后端服务器上面. 


    for ( ;; ) {

        for (i = 0; i < (ngx_uint_t) iphp->addrlen; i++) {
            hash = (hash * 113 + iphp->addr[i]) % 6271;
        }


关于sticky

最开始是一个组件, 需要编译时显示指定. 
怀疑最近nginx plus 企业版将其纳入了使用范围. 
开源版本的支持边的越来越有线. 
1.22.x的版本还是支持的, 但是1.23.0就不在支持比较奇怪
具体的写法有如下几种:
注意如果比较简单 直接写 sticky;也可以. 

     sticky cookie srv_id expires=1h domain=.example.com path=/;

     sticky route $route_cookie $route_uri;

     sticky learn
       create=$upstream_cookie_examplecookie
       lookup=$cookie_examplecookie
       zone=client_sessions:1m
       timeout=1h
       sync;

关于负载均衡的性能

反向代理, 其实是 一方面做为服务端提供服务, 一方面作为客户端连接后端服务的过程. 

worker进程core绑定
对应网卡的中断绑定
作为服务端提供长连接服务
作为客户端提供对后端服务的长连接服务.
需要注意作为客户端时 必须保证 客户端的超时时间, 以及超时客户端的数量小于后端服务器.
但是也可以这样计算. 
如果我方向代理 4个服务器, 设置长连接40个, 超时时间 60s 那么建议每个后端服务
至少也设置为40个以上的长连接, 60秒以上的超时时间. 
避免如果负载不均衡是不会出现严重的问题. 

长连接参数配置

http {
    keepalive_timeout 6000; # 作为服务端的超时时间
    keepalive_requests 10000; # 长连接的个数. 注意不能太大. 
     upstream myapp{
     ip_hash;
     keepalive 300; # 这是是联系反向代理服务器的设置. 
     server 127.0.0.1:5200 ;
     server 127.0.0.1:5201 ;   
   }
   server {
        listen 8080 default_server;
        server_name "";
        location /  {
            proxy_http_version 1.1; # 注意这个是必须的参数
            # proxy_set_header Connection ""; 
            # 注意 我加上这个参数. 登录就失败了, 建议不使用这个参数. 
        }
}

注意内核参数的设置

1. TCP相关内核的参数:
tw,port_range,somaxconn,tw_reuse
等核心参数.
2. TCP拥塞算法的选择. 是否启用tcp的聚合等处理. 
3. 网卡软中断的绑核. 建议与nginx在同一个sockets,但是不在同一个core上面来提高吞吐量. 
4. tcp 内存设置参数, 可以适当调大, 便于进行处理. 
5. 如果延时敏感性, 可以关闭部分网卡的GSO,TSO 等参数,提高响应速度.不过会浪费一点带宽. 

与Nginx反向代理总结相似的内容:

Nginx反向代理总结

反向代理的种类 1. LVS的方案 2. DNS轮询的方案 3. Nginx的4层代理 4. Nginx的7层代理 5. 网络NAT的处理 Nginx的反向代理-四层` 编译时增加 --with-stream 就可以. 然后可以使用 stream 四层反向代理 可以代理 mysql redis 以及

Nginx 面试题总结大全

转载请注明出处: 1 介绍下nginx特点与常用模块 2 nginx特点详细 3 反向代理和正向代理 4 负载均衡策略有哪些 5 Nginx如何实现动静分离? 6 Nginx 常用命令有哪些? 7 Nginx 进程模型 8 nginx是四层协议还是七层的 9 nginx如何自定义负载均衡 10 如何

[转帖]nginx反向代理时保持长连接

https://www.cnblogs.com/liufarui/p/11075630.html ·【场景描述】 HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。 如果我们使用了nginx去作为反

[转帖]Nginx 反向代理地址后,session丢失,不能登录的问题

https://www.cnblogs.com/fan-yuan/p/14417255.html 设置反向代理后,session丢失无法正常登录,需按照如下格式设置即可location /aaaaa/bbbbbb { #代理跳转的路径 proxy_pass http://localhost:8080

[转帖]nginx 反向代理中proxy_set_header的含义

https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请求头是传递给后端服务器的 2.ngixn反向代理中proxy_set_header的设置: prox

[转帖]Nginx 反向代理解决跨域问题

https://juejin.cn/post/6995374680114741279 编写代码两分钟,解决跨域两小时,我吐了。 如果对跨域还不了解的朋友,可以看这篇:【基础】HTTP、TCP/IP 协议的原理及应用 最近一段时间,在搞一个 SDK 的项目,使用的 TS + rollup。rollup

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]Nginx反向代理中使用proxy_redirect重定向url

https://www.cnblogs.com/kevingrace/p/8073646.html 在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]关于nginx 反向代理upstream中的 keepalive配置

一、关于nginx upstream 在nginx的模块中,分为3种类型,分别是handler,filter和upstream,其中upstream可以看做一种特殊的handler,它主要用来实现和后端另外的服务器进行通信,由于在nginx中全部都是使用非阻塞,并且是一个流式的处理,所以upstre