Nginx HTTP负载均衡和反向代理的配置与优化
阅读原文时间:2023年07月08日阅读:1

一、什么是负载均衡和反向代理

  负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器具有等价的地位,都可以单独提供服务而无需其他服务的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立的响应用户。负载均衡能够平均分配客户请求到服务器阵列,解决大量并发服务访问问题。

2.1反向代理

  反向代理是指以代理服务器来接收Internet上的请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求的连接客户端。

2.2正向代理

  正向代理用于拒绝其它外部访问方式并提供内部网络对外部网络的访问能力。

二、常见的Web负载均衡的方法

三、Nginx负载均衡与反向代理配置实例

#使用的用户和组
#user nobody;
#指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,例如两个4核CPU,则总核数为8)
worker_processes 1;

#错误日志存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#指定PID存放路径
#pid logs/nginx.pid;

events {
#允许的连接数
worker_connections 1024;
}

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

#log\_format  main  '$remote\_addr - $remote\_user \[$time\_local\] "$request" '  
#                  '$status $body\_bytes\_sent "$http\_referer" '  
#                  '"$http\_user\_agent" "$http\_x\_forwarded\_for"';

#access\_log  logs/access.log  main;

sendfile        on;  
#tcp\_nopush     on;

#keepalive\_timeout  0;  
keepalive\_timeout  65;

#gzip  on;

upstream test\_one {  
    server 10.194.101.240:80 weight=4 max\_fails=2 fail\_timeout=30s;  
    server 10.194.101.241:80 weight=4 max\_fails=2 fail\_timeout=30s;  
    server 10.194.101.242:80 weight=4 max\_fails=2 fail\_timeout=30s;  
}

upstream test\_two {  
    server 10.194.101.243:80 weight=4 max\_fails=2 fail\_timeout=30s;  
    server 10.194.101.244:80 weight=4 max\_fails=2 fail\_timeout=30s;  
    server 10.194.101.245:80 weight=4 max\_fails=2 fail\_timeout=30s;  
}

#include https\_params.conf;  
#虚拟主机1,反向代理test\_one这组服务器  
server {  
    listen       8888;  
    server\_name  www.testone.com;

    #charset koi8-r;

    #access\_log  logs/host.access.log  main;

    location / {  
        root   html;  
        index  index.html index.htm;  
    }

    location /test/ {  
        #如果后端返回502、504、超时等错误时,自动请求转发到upstream负载均衡池中的另一台服务器,实现故障转移  
        proxy\_next\_upstream http\_502 http\_504 error timeout invalid\_header;  
        proxy\_pass http://test\_one;  

       #用于在向反向代理的后端Web服务器发起请求时添加指定的Header头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Server-IP $server_name;
proxy_set_header X-Server-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;

        proxy\_connect\_timeout   30;  
        proxy\_send\_timeout      30;  
        proxy\_read\_timeout      300;  
    }  
}  
#虚拟主机2,反向代理test\_two这组服务器  
server {  
    listen       8888;  
    server\_name  www.testtwo.com;

    #charset koi8-r;

    #access\_log  logs/host.access.log  main;

    location / {  
        root   html;  
        index  index.html index.htm;  
    }

    location /test/ {  
        #如果后端返回502、504、超时等错误时,自动请求转发到upstream负载均衡池中的另一台服务器,实现故障转移  
        proxy\_next\_upstream http\_502 http\_504 error timeout invalid\_header;  
        proxy\_pass http://test\_two;  
        proxy\_set\_header Host $host;  
        proxy\_set\_header X-Real-IP $remote\_addr;  
        proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;  
        proxy\_set\_header X-Server-IP $server\_name;  
        proxy\_set\_header X-Server-Port $server\_port;  
        proxy\_set\_header X-Forwarded-Proto $scheme;

        proxy\_connect\_timeout   30;  
        proxy\_send\_timeout      30;  
        proxy\_read\_timeout      300;  
    }  
}  

}

四、Nginx负载均衡的HTTP Upstream模块

Upstream模块是nginx负载均衡的主要模块,它提供一个简单的方法来实现在轮询和客户端IP之间的后端服务器负载均衡,并可以对后端服务器进行健康检查。

upstream test_one {
ip_hash;
server 10.194.101.240:80 weight=4 max_fails=2 fail_timeout=30s;
server 10.194.101.241:80 weight=4 max_fails=2 fail_timeout=30s down;
server 10.194.101.242:80 weight=4 max_fails=2 fail_timeout=30s;
}

ip_hash指令能够将某一个请求通过hash算法定位到同一台后端服务器上。当某个用户在服务器A上登陆,当访问该站点其它url时,也保证请求到A服务器上,否则加入请求到B服务器上会显示未登陆。因此使用ip_hash无法保证服务器的负载均衡,建议采用服务器的session共享替代nginx的ip_hash指令。如果某一个后端服务器要从nginx负载均衡中摘除一段时间,应该使用down指令,而不是直接删除或者注释掉,直接删除或者注释掉,hash值会发生变化。

该指令用于指定后端服务器的名称和参数。服务气的名称可以使一个域名、一个IP地址、端口号或Unix Socket。在后端服务器名称之后可以跟以下参数:

该指令用于设置一组可以在proxy_pass和factcgi_pass指令中使用的代理服务器,默认的负载均衡方式为轮询。Upstream模块拥有以下变量: