ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx代理服务

2021-05-31 17:34:31  阅读:188  来源: 互联网

标签:http 代理服务 1.2 nginx 192.168 Nginx proxy conf


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就可以了
在这里插入图片描述


标签:http,代理服务,1.2,nginx,192.168,Nginx,proxy,conf
来源: https://blog.csdn.net/zps66/article/details/117399801

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有