Nginx(4)nginx的反向代理

news2024/11/15 18:04:36

反向代理

  • 正向代理
  • 反向代理的常用指令
    • 反向代理实战
  • Nginx的安全控制
    • 使用SSL对流量进行加密
    • nginx添加SSL的支持
    • Nginx的SSL相关指令
      • 生成证书
  • 反向代理系统调优

正向代理代理的对象是客户端,反向代理代理的是服务端,这是两者之间最大的区别。Nginx即可以实现正向代理,也可以实现反向代理。

正向代理

先通过一个小案例演示下Nginx正向代理的简单应用,需求如下:
在这里插入图片描述
(1)服务端的设置:当客户端发送请求之后,需要在指定日志文件里面输出客户端的ip地址即可

http {
 #指定日志格式
  log_format main 'client send request=>clientIp=$remote_addr serverIp=>$host';
	server{
		listen 80;
		server_name	localhost;
		#指定日志文件位置 和格式
		access_log logs/access.log main;
		location {
			root html;
			index index.html index.htm;
		}
	}
}

(2)使用客户端访问服务端,打开日志查看结果
在这里插入图片描述
(3)代理服务器设置:获取到客户端要访问服务端的ip以及端口

server {
        listen  82;
        # 设置DNS的IP,用来解析proxy_pass中的域名
        resolver 8.8.8.8;
        location /{
                proxy_pass http://$host$request_uri;
        }
    }

(4)查看代理服务器的IP(192.168.200.146)和Nginx配置监听的端口(82)

(5)在客户端配置代理服务器
在这里插入图片描述
(6)设置完成后,再次通过浏览器访问服务端
在这里插入图片描述
通过对比,上下两次的日志记录,会发现虽然我们是客户端访问服务端,但是如何使用了代理,那么服务端能看到的只是代理发送过去的请求,这样的化,就使用Nginx实现了正向代理的设置。

但是Nginx正向代理,在实际的应用中不是特别多,所以我们简单了解下,接下来我们继续学习Nginx的反向代理,这是Nginx比较重要的一个功能。

反向代理的常用指令

nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析,该模块在安装Nginx的时候已经自己加装到Nginx中了,常用指令如下:
proxy_pass: 设置被代理服务器地址,可以是主机名称、IP地址加端口号形式

语法proxy_pass URL;
默认值
位置location

URL:是要设置的被代理服务器地址,包含传输协议(http,https://)、主机名称或IP地址加端口号、URI等要素。

举例:客户端:192.168.200.1 代理服务器192.168.221.199 服务器 192.168.221.198

代理服务器199的nginx配置

server {
     listen 8081;
     server_name localhost;
     location / {
     # 设置访问服务器的nginx
       proxy_pass http://192.168.221.198;
     }
}

在192.168.200.1上访问199的8081端口
在这里插入图片描述

在编写proxy_pass的时候,后面的值要不要加"/"?

接下来通过例子来说明刚才提到的问题:

server {
     listen 8081;
     server_name localhost;
     location / {
       #proxy_pass http://192.168.221.198;
		proxy_pass http://192.168.221.198/;
		#以上两个访问效果是一样的
     }
}
server {
     listen 8081;
     server_name localhost;
     location /server {
      
       #proxy_pass http://192.168.221.198;
       #会将server拼接到ip后面,访问的是http://192.168.221.198/server/index.html
		
		proxy_pass http://192.168.221.198/; 
	    #不拼接,访问的是http://192.168.221.198/index.html
     }
}

proxy_set_header: 更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器

语法proxy_set_header field value;
默认值proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
位置http、server、location

需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息。

被代理服务器: [192.168.221.198]

server {
   listen 8081;
   server_name localhost;
   location / {
     default_type text/plain;
     return 200 $http_username;
  }
}

代理服务器: [192.168.221.199]

server {
        listen  8081;
        server_name localhost;
        location /server {
                proxy_pass http://192.168.221.198:8081/;
                proxy_set_header username TOM;
        }
    }

访问测试
在这里插入图片描述

proxy_redirect: 重置头信息中的Location和Refresh的值。

语法proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
默认值proxy_redirect default;
位置http、server、location

服务端[192.168.221.198]

server {
    listen  8081;
    server_name localhost;
    # 请求资源不存在,临时重定向到index欢迎页面
   location / {
   			root html;
			index index.html index.htm;
  	 if (!-f $request_filename){
    	    return 302 http://192.168.221.198/;
    }
  }
}

代理服务端[192.168.221.199]

server {
	listen  8081;
	server_name localhost;
	location / {
	   # 请求跳转到198
		proxy_pass http://192.168.221.198:8081/;
	}
}

请求http://192.168.221.199:8081/abc.html时,页面不存在,返回302跳转到192.168.221.198,看到了真实服务器的地址,在现实开发中是不安全的
在这里插入图片描述
在这里插入图片描述
修改代理服务器[192.168.221.199]

server {
	listen  8081;
	server_name localhost;
	location / {
		proxy_pass http://192.168.221.198:8081/;
		# 将真实ip替换为代理服务器的ip地址
		proxy_redirect http://192.168.221.198/  http://192.168.221.199/;
	}
}
server {
	listen  80;
	server_name localhost;
	location / {
	    #将代理服务器的首页换成真实服务器的
		proxy_pass http://192.168.221.198/;
	}
}

在这里插入图片描述
在这里插入图片描述

proxy_redirect redirect replacement;

redirect:目标Location的值
replacement:要替换的值

proxy_redirect default;

default 有了默认选项
将location块的uri变量作为replacement,
将proxy_pass变量作为redirect进行替换

proxy_redirect off

关闭proxy_redirect的功能

反向代理实战

在这里插入图片描述
服务器1,2,3存在两种情况

第一种情况:三台服务器的内容不一样。
第二种情况: 三台服务器的内容是一样。
  1. 如果服务器1、服务器2和服务器3的内容不一样,可以根据用户请求来分发到不同的服务器。(根据端口区分不同服务器)
代理服务器 [192.168.221.199]
server {
        listen          8082;
        server_name     localhost;
        location /server1 {
                proxy_pass http://192.168.221.198:9001/;
        }
        location /server2 {
                proxy_pass http://192.168.221.198:9002/;
        }
        location /server3 {
                proxy_pass http://192.168.221.198:9003/;
        }
}

服务端[192.168.221.198]

server {
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.198:9001</h1>'
}

server {
        listen          9002;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.198:9002</h1>'
}

server {
        listen          9003;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.198:9003</h1>'
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 如果服务器1、服务器2和服务器3的内容是一样的,该如何处理?参考nginx负载均衡

Nginx的安全控制

关于web服务器的安全是比较大的一个话题,里面所涉及的内容很多,Nginx反向代理是如何来提升web服务器的安全呢?

通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。
在这里插入图片描述

使用SSL对流量进行加密

就是将常用的http请求转变成https请求,这两个之间的区别简单的来说两个都是HTTP协议,只不过https是身披SSL外壳的http。

HTTPS是一种通过计算机网络进行安全通信的传输协议。它经由HTTP进行通信,利用SSL/TLS建立全通信,加密数据包,确保数据的安全性。

  • SSL(Secure Sockets Layer)安全套接层
  • TLS(Transport Layer Security)传输层安全

上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS和SSL在传输层和应用层对网络连接进行加密。

为什么要使用https

http协议是明文传输数据,存在安全问题,而https是加密传输,相当于http+ssl,并且可以防止流量劫持。

Nginx要想使用SSL,需要满足一个条件即需要添加一个模块--with-http_ssl_module,默认没有支持,需要自己添加,该模块在编译的过程中又需要OpenSSL的支持,需提前准备【参考nginx源码安装】。

nginx添加SSL的支持

完成 --with-http_ssl_module模块的增量添加

拷贝nginx之前的配置信息
将原有/usr/local/nginx/sbin/nginx进行备份
在这里插入图片描述
在nginx的安装源码进行配置指定对应模块 ./configure --with-http_ssl_module
在这里插入图片描述

通过make模板进行编译
在这里插入图片描述

将objs下面的nginx移动到/usr/local/nginx/sbin下
在源码目录下执行 make upgrade进行升级,这个可以实现不停机添加新模块的功能
在这里插入图片描述

Nginx的SSL相关指令

该模块的指令都是通过ngx_http_ssl_module模块来解析的。

ssl: 用来在指定的服务器开启HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些。

语法ssl on | off;
默认值ssl off;
位置http、server
server{
	listen 443 ssl; #等值于 ssl on
}

ssl_certificate: 为当前这个虚拟主机指定一个带有PEM格式证书的证书。

语法ssl_certificate file;
默认值
位置http、server

ssl_certificate_key: 该指令用来指定PEM secret key文件的路径

语法ssl_ceritificate_key file;
默认值
位置http、server

ssl_session_cache: 该指令用来配置用于SSL会话的缓存

语法ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size]
默认值ssl_session_cache none;
位置http、server

off:禁用会话缓存,客户端不得重复使用会话
none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数
builtin:内置OpenSSL缓存,仅在一个工作进程中使用。
shared:所有工作进程之间共享缓存,缓存的相关信息用name和size来指定
name:缓存名称
size:缓存大小 提升缓存效率
ssl_session_timeout: 开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。

语法ssl_session_timeout time;
默认值ssl_session_timeout 5m;
位置http、server

ssl_ciphers: 指出允许的密码,密码指定为OpenSSL支持的格式

语法ssl_ciphers ciphers;
默认值ssl_ciphers HIGH:!aNULL:!MD5;
位置http、server

使用openssl ciphers查看openssl支持的格式
在这里插入图片描述
ssl_prefer_server_ciphers: 指定是否服务器密码优先客户端密码

语法ssl_perfer_server_ciphers on|off;
默认值ssl_perfer_server_ciphers off;
位置http、server

生成证书

需要生成带有PEM格式的证书和指定PEM secret key的证书

方式一:使用阿里云/腾讯云等第三方服务进行购买。
参考从阿里云上申请ssl证书,配置https

使用域名,去掉url地址栏不安全标示

# 地址栏访问https://www.nginx521.cn
server {
        listen       443 ssl;
        server_name  www.nginx521.cn; 

        ssl_certificate      /root/nginx_cert/www.nginx521.cn.key;
        ssl_certificate_key  /root/nginx_cert/www.nginx521.cn.pem;
      
        #会话缓存 共享缓存:缓存名称:缓存大小
        ssl_session_cache    shared:SSL:1m;
        #超时时间 5min
        ssl_session_timeout  5m;
        # 允许的密码格式
        ssl_ciphers  HIGH:!aNULL:!MD5;
        # 是否允许服务器密码优先于客户端密码
        ssl_prefer_server_ciphers  on;
    
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

# 不加https直接域名访问www.nginx521.cn
 server {
        listen       80;
        server_name  www.nginx521.cn;
        
        location / {
        #root html;
        #index index.html index.htm;
        rewirte ^(.*) https://www.nginx521.cn$1;

        }

方式二:使用openssl生成证书

确认当前系统是否有安装openssl

openssl version

在这里插入图片描述
按照下面的命令进行生成

mkdir /root/cert
cd /root/cert
#生存对应的server.key
openssl genrsa -des3 -out server.key 1024 
# 生存csr
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开启SSL实例

server {
        listen       443 ssl;
        server_name  localhost; 

        ssl_certificate      /root/cert/server.crt;
        ssl_certificate_key  /root/cert/server.key;
      
        #会话缓存 共享缓存:缓存名称:缓存大小
        ssl_session_cache    shared:SSL:1m;
        #超时时间 5min
        ssl_session_timeout  5m;
        # 允许的密码格式
        ssl_ciphers  HIGH:!aNULL:!MD5;
        # 是否允许服务器密码优先于客户端密码
        ssl_prefer_server_ciphers  on;
    
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

验证 访问https://192.168.221.199
在这里插入图片描述
在这里插入图片描述

反向代理系统调优

反向代理值Buffer和Cache,详情参考【nginx缓存】

Buffer翻译过来是"缓冲",Cache翻译过来是"缓存"。
在这里插入图片描述

相同点:
两种方式都是用来提供IO吞吐效率,都是用来提升Nginx代理的性能。
不同点:
缓冲主要用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓冲中的数据一旦此次操作完成后,就可以删除。
缓存主要是备份,将被代理服务器的数据缓存一份到代理服务器,这样的话,客户端再次获取相同数据的时候,就只需要从代理服务器上获取,效率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除.

Proxy Buffer相关指令

proxy_buffering : 用来开启或者关闭代理服务器的缓冲区

语法proxy_buffering on|off;
默认值proxy_buffering on;
位置http、server、location

proxy_buffers: 用来指定单个连接从代理服务器读取响应的缓存区的个数和大小

语法proxy_buffers number size;
默认值proxy_buffers 8 4k | 8K;(与系统平台有关)
位置http、server、location

number:缓冲区的个数
size:每个缓冲区的大小,缓冲区的总大小就是number*size

proxy_buffer_size: 用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffers中的size一致即可,当然也可以更小。

语法proxy_buffer_size size;
默认值proxy_buffer_size 4k | 8k;(与系统平台有关)
位置http、server、location

proxy_busy_buffers_size: 用来限制同时处于BUSY状态的缓冲总大小。

语法proxy_busy_buffers_size size;
默认值proxy_busy_buffers_size 8k|16K;
位置http、server、location

proxy_temp_path: 当缓冲区存满后,仍未被Nginx服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径

语法proxy_temp_path path;
默认值proxy_temp_path proxy_temp;
位置http、server、location

注意path最多设置三层。

proxy_temp_file_write_size: 用来设置磁盘上缓冲文件的大小。

语法proxy_temp_file_write_size size;
默认值proxy_temp_file_write_size 8K|16K;
位置http、server、location

通用网站的配置

proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

根据项目的具体内容进行相应的调节

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现发送电子邮件功能

大家好&#xff0c;以编程方式发送电子邮件可以成为自动化通信过程的一种强大方式&#xff0c;本文将探讨如何使用Python发送电子邮件&#xff0c;介绍如何设置SMTP服务器、为Gmail生成应用程序密码&#xff0c;并提供使用smtplib库发送电子邮件的逐步指南。 在深入研究编码之…

单链表【数据结构】

1、顺序表存在的问题 顺序表存在一些问题&#xff1a; &#xff08;1&#xff09;中间、头部的插入删除&#xff0c;时间复杂度为O(N)&#xff08;2&#xff09;增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。&#xff08;3&#xff09;增容…

剑指 Offer 42: 连续子数组的最大和

这道题多了第二句&#xff0c;并且作为nums[i]&#xff0c;当前值一定是要取的&#xff0c;只是要不要加上前面那个而已。

uniapp 之 uniapp app 与uniapp H5的通信 webview,以及处理H5页面的手机物理返回问题

目录 app给H5传参&#xff1a;通过h5地址传参app给H5传参&#xff1a;通过方法evalJS传参H5给app传参&#xff1a;通过web-view 组件的message绑定的方法处理H5页面的手机物理返回问题 APP端&#xff1a; <web-view :webview-styles"webviewStyles" :src"sr…

python学习之【继承、封装、多态】

#来评选你心中的TOP1编程语言# 前言 距离上篇文章 python学习之【类和对象】已有三个星期之久&#xff0c;这篇文章介绍 面向对象的三大特征——封装&#xff0c;继承&#xff0c;多态。 对于编程初学者来说&#xff0c;学习python应该是比较好入手的&#xff0c;文末会给大家…

计算机视觉:多相机硬件同步拍摄

计算机视觉&#xff1a;多相机硬件同步拍摄 传感器同步硬件同步信号FSYNC信号STROBE信号 硬件接线硬件设备接线步骤&#xff1a; 软件驱动参考文献 传感器同步 目前主要有两种方法来同步不同传感器的信息&#xff08;帧、IMU数据包、ToF等&#xff09;&#xff1a; 硬件同步&…

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?

2023-07-01&#xff1a;redis过期策略都有哪些&#xff1f;LRU 算法知道吗&#xff1f; 答案2023-07-01&#xff1a; 缓存淘汰算法&#xff08;过期策略&#xff09; 当Redis的内存超出物理内存限制时&#xff0c;内存中的数据就会频繁地与磁盘进行交换&#xff0c;这个过程…

二叉树的练习

文章目录 单值二叉树检查两颗树是否相同对称二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历另一颗树的子树通过前序遍历的数组构建二叉树判断二叉树是否是完全二叉树层序遍历k层节点数二叉树的销毁二叉树的整体 单值二叉树 单值二叉树&#xff0c;可以使用等式的传递…

Java基础---有了基本类型为什么还需要包装类

目录 缘由 基本类型和包装类型的区别 如何理解自动拆装箱 哪些地方会自动拆装箱 自动拆装箱与缓存 缘由 Java中有8种基本数据类型&#xff0c;这些基本类型又都有对应的包装类 因为Java是一种面向对象语言&#xff0c;很多地方都需要使用对象而不是基本数据类型比如&…

Domino Admin管理客户机中为每个管理域设置不同的图标

大家好&#xff0c;才是真的好。 一直在讲Domino管理中的单个网络 域&#xff0c;很少讲到多个Domino网络域的管理。其实&#xff0c;很多企业会有多个Domino网络域。因为以前多个部门或组织、企业等合并&#xff0c;或者隔离国内和国外的目录隔开等等&#xff0c;都会产生多个…

从0-1手写一个RPC框架

前言 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简言之就是像调用本地方法一样调用远程服务。目前外界使用较多的有gRPC、Dubbo、Spring Cloud等。相信大家对RPC的概念都已经很熟悉了&#xff0c;这里不做过多介绍。 为啥要自己写…

nvm 和 nrm安装使用

前端工具推荐&#xff1a;nvm&#xff08;Node 版本管理工具&#xff09; 和 nrm&#xff08;管理npm源&#xff09;&#xff1a; 一、nvm 1.1 nvm 是什么 1.2 安装 nvm 1.3 使用 nvm 二、nrm 2.1 nrm 是什么 2.2 安装 nrm 2.3 使用 nrm 一、nvm 如果直接将 node 安装到…

20230701:成电的“七年之痒”,毕业啦

毕业那些事儿 毕业随笔写在最后 毕业随笔 伴随着走完最后一道流程&#xff0c;成电7年&#xff0c;总算是毕业了。经济下行&#xff0c;行业寒冬&#xff0c;全被90后赶上了&#xff0c;庆幸学校的金字招牌让自己斩获了不少OFFER。荒废了半年的跑步和博客计划&#xff0c;接下…

【测试开发】概念基础

目录 一. 需求 1. 用户需求 2. 软件需求 3. 从测试人员的角度看需求 二. 测试用例 三. BUG 四. 开发模型 1. 软件的生命周期 2. 开发模型 2.1 瀑布模型 2.2 螺旋模型 2.3 增量&#xff0c;迭代模型 2.4 敏捷模型 SCRUM 五. 测试模型 1. V模型 2. W模型 (双V模…

开源免费的多数据库工具Chat2DB

Chat2DB使用 当前使用的版本为1.0.11。 一.Chat2DB介绍 Chat2DB 是一款开源免费的多数据库客户端工具。 能够将自然语言转换为SQL&#xff0c;也可以将SQL转换为自然语言。 支持windows、mac本地安装&#xff0c;也支持服务器端部署&#xff0c;web网页访问。 支持多种数据库…

Hexo基本建站

目录 一、前言 二、Hexo安装、新建、启动 三、架构说明 四、写博客 五、打包 六、发布到GitHub 1.新建仓库 2.安装插件 3.修改配置文件&#xff1a;_config.yml 4.部署github 5.查看仓库 6.访问网站 一、前言 安装 Git安装 Node.js 二、Hexo安装、新建、启动 # 安装 h…

智慧园区平台建设解决方案

智慧园区是指利用现代互联网物联网技术&#xff0c;对园区内的设施、设备和人员进行高效管理和智能化运营的一种模式。越来越多的城市开始致力于发展智慧园区&#xff0c;实现园区内的资源共享和高效利用。为了让智慧园区达到最佳的效果&#xff0c;我们需要从平台建设方面入手…

Prettier - Code formatter配置(vscode)

1.安装Prettier 2.设置-->搜索format on save 并打勾 3.搜索default format 并选择Prettier - Code formatter 4.点击右上角打开setting.json 5.看最后一行是否存在如下配置,有就说明配置成功,没有重新前面步骤重新设置一下 6.根目录是否存在.prettierrc.json,没有创建一下 …

vue3原理和源码分析 - watch 源代码

https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts 目录 Watch /packages/runtime-core/src/apiWatch.ts watch.dot https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts Watch /packages/runtime…

6.3 B树,B+树

多路平衡查找树 1.定义 B树的阶&#xff1a;B树中所有结点的孩子个数的最大值&#xff0c;表示成m m阶B树&#xff1a;空树或者满足如下特性的m叉树 特性&#xff1a; 1.树中每个结点最多子树 m 关键字m-1 2.根节点不是终端结点&#xff0c;至少有两棵子树 3.根结点除外&…