Nginx代理服务

Nginx代理服务概述

代理我们往往并不陌⽣, 该服务我们常常⽤到如(代理租房、代理收货等等)
火车票代售点、代购、第三方

在这里插入图片描述

那么在互联⽹请求⾥⾯, 客户端⽆法直接向服务端发起请求, 那么就需要⽤到代理服务, 来实现客户端和服务通信

在这里插入图片描述

Nginx 作为代理服务可以实现很多的协议代理, 我们主要以 http 代理为主

在这里插入图片描述

正向代理(内部上⽹) 客户端<–>代理->服务端
1、客户端知道代理服务器的存在
2、一般用于公司客户端上网

在这里插入图片描述

反向代理 客户端->代理<–>服务端
1、客户端不知道代理的存在
2、代理一般是由服务端设置,加快客户端的访问速度

在这里插入图片描述

代理区别
区别在于代理的对象不⼀样
正向代理代理的对象是客户端
反向代理代理的对象是服务端


Nginx代理配置语法

1.Nginx 代理配置语法

Syntax: proxy_pass URL; 
Default: — 
Context: location, if in location, limit_except 

http://localhost:8000/uri/ 
http://192.168.1.2:8000/uri/ 
http://unix:/tmp/backend.socket:/uri/

2.类似于 nopush 缓冲区

//尽可能收集所有头请求, 
Syntax: proxy_buffering on | off; 
Default: 
proxy_buffering on; 
Context: http, server, location

//扩展: 
proxy_buffer_size 
proxy_buffers 
proxy_busy_buffer_size

3.跳转重定向

Syntax: proxy_redirect default; 
proxy_redirect off;proxy_redirect redirect replacement; 
Default: proxy_redirect default; 
Context: http, server, location

Nginx的proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改。
以例子说明: 

   server { 
       listen       80; 
       server_name  test.abc.com; 
       location / { 
            proxy_pass http://10.10.10.1:9080; 
       } 
   }
这段配置一般情况下都正常,但偶尔会出错, 错误在什么地方呢? 
抓包发现服务器给客户端的跳转指令里加了端口号,如 Location: http://test.abc.com:9080/abc.html 。
因为Nginx服务器侦听的是80端口,所以这样的URL给了客户端,必然会出错.针对这种情况, 加一条proxy_redirect指令: proxy_redirect http://test.abc.com:9080/ / ,把所有“http://test.abc.com:9080/”的内容替换成“/”再发给客户端,就解决了。 

proxy_redirect     http://test.abc.com:9080/      /

   server { 
       listen       80; 
       server_name  test.abc.com; 
       proxy_redirect http://test.abc.com:9080/ /; 
       location / { 
            proxy_pass http://10.10.10.1:9080; 
       } 
   }

4.头信息

Syntax: proxy_set_header field value; 
Default: proxy_set_header Host $proxy_host; 
proxy_set_header Connection close; 
Context: http, server, location 
//扩展: 
proxy_hide_header 
proxy_set_body

客户端请求web服务,客户端:
ip:192.168.1.3
Nginx作为反向代理服务器:
192.168.1.1
Nginx作为后端web服务器:
192.168.1.2

proxy_set_header Host $host;  $host就是Nginx代理服务器,也就是客户端请求的host。
proxy_set_header Host $proxy_host; proxy_host就是代理服务器请求的host也就是后端服务器208

proxy_set_header X-Real-IP $remote_addr; $remote_addr的值为客户端的ip

proxy_set_header Host $host:$proxy_port; $host代表转发服务器,$proxy_port代表207转发服务器请求后端服务器的端口,也就是80

5.代理到后端的 TCP 连接超时

Syntax: proxy_connect_timeout time; 
Default: proxy_connect_timeout 60s; 
Context: http, server, location 
//扩展 
proxy_read_timeout //以及建⽴ 
proxy_send_timeout //服务端请求完, 发送给客户端时间

演示:

实验环境:准备两台Nginx服务武器和一台Linux客户机

代理192.168.1.1
服务器192.168.1.2
客户机192.168.1.3

代理:

vi /usr/local/Nginx/conf/Nginx.conf

        location /zps {
            root   html;
            index  index.html index.htm;
            proxy_pass http://192.168.1.2:8081/zps;
        }

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

服务器:

vi /usr/local/Nginx/conf/Nginx.conf
        listen       8081;

在这里插入图片描述

cd /usr/local/Nginx/html/
mkdir zps
cp index.html zps/
systemctl restart Nginx

客户机访问:

curl -I http://192.168.1.1/zps

在这里插入图片描述


显示端口8081
代理

vi /usr/local/Nginx/conf/Nginx.conf
            proxy_redirect off;

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

客户机再访问:

curl -I http://192.168.1.1/zps

在这里插入图片描述


Fiddler安装包点击下载
提取码: t9tj

打开fiddler进行抓包
打开浏览器访问http://192.168.1.1/zps

在这里插入图片描述


客户机进行抓包:

curl -I http://192.168.1.1/zps

在这里插入图片描述


可以看到可以通过抓包知道我们访问的是代理服务器
我们看到访问http://192.168.1.1/zps/ 会直接跳转到http://192.168.1.2:8081/zps/
但是一般情况下是不允许别人抓到这些信息的
所以修改代理服务器上的Nginx.conf配置文件
代理:

vi /usr/local/Nginx/conf/Nginx.conf
            proxy_redirect http://192.168.1.2:8081/zps /zps;

在这里插入图片描述


客户端再抓包:

curl -I http://192.168.1.1/zps

在这里插入图片描述


服务器获取客户机真实ip

查看服务器的访问日志

cat /usr/local/Nginx/logs/access.log

在这里插入图片描述


我们可以看到web服务器 只能获取 代理服务器的ip地址
实验步骤:
代理:

vi /usr/local/Nginx/conf/Nginx.conf
            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;
        }

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

服务器:
去掉注释

vi /usr/local/Nginx/conf/Nginx.conf
#    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;

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

客户机再访问

curl -I http://192.168.1.1/zps

查看服务器的访问日志我们可以看到成功获取到了客户机的真实ip

cat /usr/local/Nginx/logs/access.log

在这里插入图片描述


Nginx正向代理示例

Nginx 正向代理配置实例:
配置服务器1.2访问限制,只允许代理1.1访问
在服务器1.2上配置就允许代理1.1访问图片

服务器:

vi /usr/local/Nginx/conf/Nginx.conf
        listen       80;
        
        location ~ .*\.(jpg|gif|png) {
            allow 192.168.1.1;
            deny all;
        }     

在这里插入图片描述

然后进入网页认目录上传一张图片

cd /usr/local/Nginx/html/

yum -y install lrzsz
rz                            ##上传

在这里插入图片描述

vi index.html
<h1>192.168.1.2</h1>
<img src="1.jpg" />
systemctl restart Nginx   ##重启Nginx服务

客户机访问 发现访问不了图片
http://192.168.1.2

在这里插入图片描述


代理:
现在只有代理服务器可以访问服务器的图片

vi /usr/local/Nginx/conf/Nginx.conf
            proxy_pass http://$http_host$request_uri;
            #$http_host   是一个变量,指的是客户端请求的目标ip地址
            #$request_uri  是客户端请求的目标资源          
            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;
        }

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

客户机浏览器设置
打开ie浏览器:

设置代理服务器ip地址 再次访问1.2的80端口

在这里插入图片描述


客户机再次访问:
http://192.168.1.2

在这里插入图片描述


做完测试我们要把浏览器的代理及时去除 不然的话就访问不了其他网页了 就像这样:
因为我们这个测试的代理服务器是没有连接网络的

在这里插入图片描述


Nginx反向代理示例

反向代理配置
代理:

vi /usr/local/Nginx/conf/Nginx.conf
            proxy_pass http://192.168.1.2:8080;
        }

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

服务器:
Web站点修改监听的端口号为8080

vi /usr/local/Nginx/conf/Nginx.conf
        listen       8080;

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

客户机:

在这里插入图片描述


访问测试:
http://192.168.1.1
http://192.168.1.2

在这里插入图片描述


在这里插入图片描述


2.Nginx负载均衡

提升吞吐率, 提升请求性能, 提⾼容灾
Nginx中用到了反向代理,不一定会用负载均衡
Nginx中用到了负载均衡,一定会用反向代理
真正实现反向代理的是,负载均衡算法

在这里插入图片描述


负载均衡按范围划分:GSLB全局负载均衡、SLB

在这里插入图片描述


Nginx 是⼀个典型的 SLB

在这里插入图片描述


负载均衡按层级划分: 分为四层(传输层)负载均衡和七层(应用层)负载均衡
Nginx 是⼀个典型的七层 SLB
LVS: 四层的负载均衡
Haproxy:既支持四层又支持七层

在这里插入图片描述

2.1Nginx负载均衡配置场景

Nginx 负载均衡模块upstream 需要跟Nginx反向代理模块proxy_pass结合起来使用
Nginx 实现负载均衡⽤到了 proxy_pass 代理模块核⼼配置, 将客户端请求代理转发⾄⼀ 组 upstream 虚拟服务池

在这里插入图片描述

代理:
weight=1 他的意思就是那台服务器性能更好就可以在后面把weight的数值调高一些
比如:weight=5

vi /usr/local/Nginx/conf/Nginx.conf
    upstream zps {
       server 192.168.1.2:80 weight=5;
       server 192.168.1.3:80 weight=5;
    }
            proxy_pass http://zps;

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

服务器1.2和1.3上准备两个页面

cd /usr/local/Nginx/html/

vi index.html
<html> 
<title>Nginx1</title> 
<body bgcolor="red"> 
<h1>Nginx1</h1> 
</body> 
</html>


vi index.html
<html> 
<title>Nginx2</title> 
<body bgcolor="blue"> 
<h1>Nginx2</h1> 
</body> 
</html>

使用浏览器访问:http://192.168.1.1

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


2.2Nginx负载均衡状态配置

后端服务器在负载均衡调度中的状态

在这里插入图片描述


测试 backup 以及 down 状态

比如:

server 192.168.1.2:80 weight=5 down;                                         ##当前192.168.1.2服务器暂时不参与负载均衡
server 192.168.1.2:80 weight=5 backup;                                       ##当前192.168.1.2服务器不参与负载均衡 充当备份的角色 只有另一台服务器坏掉时才会生效
server 192.168.1.2:80 weight=5 max_fails=2 fail_timeout=10s max_conns=5;     ##允许请求失败两次 失败后暂停时间为10秒 最大连接数为5

2.3Nginx负载均衡调度策略

在这里插入图片描述


Nginx负载均衡权重轮询具体配置

upstream zps {
        server 192.168.1.2:80 weight=1;
        server 192.168.1.3:80 weight=5;
        server 192.168.1.4:80;
}

Nginx负载均衡 ip_hash 具体配置

upstream zps {
        ip_hash;
        server 192.168.1.2:80;
        server 192.168.1.3:80;
        server 192.168.1.3:80;
}

Nginx负载均衡url_hash具体配置

upstream zps {
        hash    $request_uri;
        server 192.168.1.2:80;
        server 192.168.1.3:80;
        server 192.168.1.4:80;
}

3.Nginx动静分离

动静分离,通过中间件将动态请求和静态请求进⾏分离, 分离资源, 减少不必要的请求消耗, 减少请 求延时。
好处: 动静分离后,即使动态服务不可⽤, 但静态资源不会受到影响
通过中间件将动态请求和静态请求分离

在这里插入图片描述

Nginx动静分离应⽤案例
环境准备:

服务地址
proxy192.168.1.1
Nginx192.168.1.2
tomcat192.168.1.3

代理:

vi /usr/local/Nginx/conf/Nginx.conf
    upstream static {
       server 192.168.1.2:80 weight=5;
    }
    upstream java {
       server 192.168.1.3:8080 weight=5;
    }

            proxy_pass http://static;
        }
        location ~ .*\.(jsp|gif|png|css)$ {
            proxy_pass http://java;
        }

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

客户机浏览器访问:

在这里插入图片描述


访问代理服务器的ip会跳到192.168.1.2web服务器的静态页面
http://192.168.1.1

在这里插入图片描述


要想访问动态页面需要再代理服务器的ip后面加上(jsp|gif|png|css)等等后缀
比如http://192.168.1.1/index.jsp

在这里插入图片描述


根据访问不同⽬录, 代理不同的服务器

认动态,静态直接找设置的static,上传找upload
代理:

vi /usr/local/Nginx/conf/Nginx.conf
    upstream static {
       server 192.168.1.2:80 weight=5;
    }
    upstream java {
       server 192.168.1.3:8080 weight=5;
    }
        location /zps {
            root   html;
            index  index.html index.htm;
            proxy_pass http://static;
        }
        location /alex {
            proxy_pass http://java;
        }    

在这里插入图片描述

systemctl restart Nginx   ##重启Nginx服务

Nginx服务器1.2准备页面

cd /usr/local/Nginx/html/
mkdir zps
echo "<h1>192.168.1.2</h1>" > zps/index.html 

给tomcat服务器1.3准备页面

cd /usr/local/tomcat/webapps/ROOT/
mkdir /root/alex
mv /usr/local/tomcat/webapps/ROOT/* /root/alex/
mv /root/alex/ /usr/local/tomcat/webapps/ROOT/

客户机访问:
http://192.168.1.1/zps/

在这里插入图片描述


http://192.168.1.1/alex/

在这里插入图片描述


域名恶意绑定和防止

恶意绑定实验:
首先我们准备一个可以正常访问的web网站
修改我们客户机的hosts文件

在这里插入图片描述


拿浏览器访问www.zps.com就可以了

那我们在公司出现这种情况很危险的那怎么防止呢
很简单
代理:
vi /usr/local/Nginx/conf/Nginx.conf

在这里插入图片描述


拿浏览器再访问www.zps.com就可以了

在这里插入图片描述


相关文章

Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一...
本地项目配置 1 复制 luffy/settings/dev.py为prop.py 修改l...
nginx不仅可以隐藏版本信息,还支持自定义web服务器信息 先看...
一 、此次漏洞分析 1 nginx HTTP/2漏洞 [nginx-announce] ng...
###进入nginx 目录cd /usr/local/nginx###递归显示 2 级目录...
在cmd命令窗口输入下面命令进行查看 tasklist /fi "ima...