Linux-nginx反向代理和负载均衡详解和配置

nginx反向代理

1.什么是反向代理

  • 代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理。
  • 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器。

2.nginx可以当做反向代理服务器使用

  • 我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理
  • 当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能
  • 客户端在访问时会先把请求发到nginx,http的默认端口是80,而nginx一直监听80端口,nginx收到请求后根据域名解析,映射到不同路径,实现反向代理。我们在浏览器访问时就不需要再用ip+端口的方式访问而是通过域名的方式,这样就不用暴露ip和端口,肯定更加安全。在架构上可以实现前后端的分离。

反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的机器是哪台,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端;

我们请求www.baidu.com时,这www.baidu.com就是反向代理服务器,真实提供服务的服务器有很多台,反向代理服务器会把我们的请求分/转发到真实提供服务的各台服务器。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

3.nginx Proxy配置

代理配置

代理
Syntax:     proxy_pass URL;                   #代理的后端服务器URL
Default:     —
Context:     location, if in location, limit_except

host: www.qf.com
remote_addr: 10.8.165.79
client-->nginx proxy-->real-server

头信息
Syntax:     proxy_set_header field value;
Default:     proxy_set_header Host $proxy_host;        #设置真实客户端地址
            proxy_set_header Connection close;
Context:     http, server, location

超时
Syntax:     proxy_connect_timeout time;
Default:     proxy_connect_timeout 60s;                #链接超时
Context:     http, server, location

Syntax:     proxy_read_timeout time;
Default:     proxy_read_timeout 60s;
Context:     http, server, location

Syntax:     proxy_send_timeout time; #nginx进程向fastcgi进程发送request的整个过程的超时时间
Default:     proxy_send_timeout 60s;
Context:     http, server, location

4.启用nginx proxy代理

需要两台安装nginx的虚拟机,一台作为代理服务器:nginx-1,一台作为真实服务器web-1

1.nginx-1启动代理程序

编辑配置文件   我这里是编辑的子配置文件,也可以编辑在主配置文件里

子配置文件   /etc/nginx/conf.d/default.conf      主配置文件  /etc/nginx/nginx.conf

[root@nginx-1 ~]# vim /etc/nginx/conf.d/default.conf



server {
    listen       80;
    server_name  localhost;

    location / {
    proxy_pass http://192.168.126.142:80;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    }
}

2.nginx proxy具体配置详解

proxy_pass :真实服务器的地址,可以是ip也可以是域名和url地址
proxy_set_header:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP :启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For:记录代理地址

proxy_connect_timeout:后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间,就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout :nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接

5.配置web-1

为了不影响访问先把主配置文件里的server块注释掉

然后再http块里添加一个加载子配置文件的命令语句   路径一定要是你自己的子配置文件所在路径

include /etc/nginx/conf.d/*.conf;

 然后我们设置子配置文件,如果没有可以自己创建目录创建文件,文件一定要以  .conf结尾

[root@web-1 ~]# vim /etc/nginx/conf.d/nginx.conf


server {
        listen 80;
        server_name 192.168.126.142;
        location / {
               root /home/www/html;
               index index.html index.hml;
        }
}

编写index.html,没有文件夹的先自己创建

[root@web-1 ~]# vim /home/www/html/index.html



<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
<img src="https://ts3.cn.mm.bing.net/th?id=OIP-C.Md86Wi2EYiKHNPldRZiD4gHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2">
</body>
</html>

6.测试

查看访问日志

nginx-1的访问日志

web-1的访问日志

nginx负载均衡

我们需要用到三台机器,代理服务器nginx-1,真实服务器web-1,web-2

上面做好的可以继续使用,在加一台web-2就行

我这里是直接重做一遍

1.负载均衡的作用

如果你的Nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序关闭造成web不能访问,那么Nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就大大折扣

如果负载均衡中其中web2发生这样的情况,Nginx首先会去web1请求,但是Nginx在配置不当的情况下会继续分发请求到web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。

 2.upstream配置

这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。upstream依照轮询(默认)方式进行负载,每一个请求按时间顺序逐一分配到不同的后端服务器。假设后端服务器down掉。能自己主动剔除。

例如

upstream junheng{
                server 192.168.126.142:80;
                server 192.168.126.133:80;
        }


server {
    listen       80;
    server_name  localhost;

    location / {
    proxy_pass http://junheng;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    }
}

upstream配置必须在http块里,sever块外

我这里的upstream添加在主配置文件里,然后测试用到的server在子配置文件里,也可以都放在主配置文件里

3.配置web-1

为了不影响访问先把主配置文件里的server块注释掉,

 然后再http块里添加一个加载子配置文件的命令语句   路径一定要是你自己的子配置文件所在路径

 include /etc/nginx/conf.d/*.conf;

然后我们设置子配置文件

[root@web-1 ~]# vim /etc/nginx/conf.d/nginx.conf

如果没有可以自己创建目录创建文件,文件一定要以  .conf结尾

server {
        listen 80;
        server_name 192.168.126.142;
        location / {
               root /home/www/html;
               index index.html index.hml;
        }
}

server_name   后面是web-1的ip

root    后面的路径是访问的index.html的文件路径,可以自己设置,自己写index.html的页面也可以,路径是我自己创建的

 编写index.html

没有文件夹的先自己创建

[root@web-1 ~]# vim /home/www/html/index.html



<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
<img src="https://ts3.cn.mm.bing.net/th?id=OIP-C.Md86Wi2EYiKHNPldRZiD4gHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2">
</body>
</html>

开启或者加载一下nginx,然后进行测试

 web-1配置成功

4.配置web-2

和web-1配置一样 先注释掉主配置的server,然后添加加载子配置文件的语句即可

这里我的子配置文件还是在/etc/nginx/conf.d/下。

设置子配置文件

[root@web-2 ~]# vim /etc/nginx/conf.d/default.conf


server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

设置访问页面

[root@web-2 ~]# vim /usr/share/nginx/html/index.html


<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is a paragraph.</p>
<img src="https://ts3.cn.mm.bing.net/th?id=OIP-C.ZkoPhpKfJwsvGmpm8RsragHaFp&w=286&h=218&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2">
</body>
</html>

访问测试

 到这里web服务器设置完成,没有出错,如果后面的代理服务器代理失败,那也与web无关,只能是代理服务器的问题

5.配置代理服务器nginx-1

我这里依旧是用子配置文件设置的

先在主配置文件的http块内,server块外添加upstream

[root@nginx-1 ~]# vim /etc/nginx/nginx.conf

upstream junheng{
                server 192.168.126.142:80;
                server 192.168.126.133:80;
        }

然后在主配置文件里添加

[root@nginx-1 ~]# vim /etc/nginx/conf.d/default.conf


server {
    listen       80;
    server_name  localhost;

    location / {
    proxy_pass http://junheng;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    }
}

然后进行测试

在浏览器输入nginx-1的ip

第一次访问

 刷新,第二次访问

两次访问,一次分配到web-1,一次分配搭配web-2

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值