Nginx(4)nginx的反向代理

反向代理

  • 正向代理
  • 反向代理的常用指令
    • 反向代理实战
  • 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 / {# 设置访问服务器的nginxproxy_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.htmlproxy_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 / {# 请求跳转到198proxy_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;#超时时间 5minssl_session_timeout  5m;# 允许的密码格式ssl_ciphers  HIGH:!aNULL:!MD5;# 是否允许服务器密码优先于客户端密码ssl_prefer_server_ciphers  on;location / {root   html;index  index.html index.htm;}}# 不加https直接域名访问www.nginx521.cnserver {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;#超时时间 5minssl_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.hqwc.cn/news/4152.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java应用在线debug--bistoury介绍

Bistoury介绍 Bistoury 是去哪儿网开源的一个对应用透明&#xff0c;无侵入的java应用诊断工具&#xff0c;用于提升开发人员的诊断效率和能力&#xff0c;可以让开发人员无需登录机器或修改系统&#xff0c;就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面…

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

文章目录 1. 实验节点规划表2. 安装Prometheus3. 安装node_exporter4. 配置prometheus.yml文件5. 安装Grafana6. 安装Altermanager监控告警 采用 "PrometheusGrafana"的开源监控系统&#xff0c;安装部署K8S集群监控平台。 并使用Altermanager告警插件&#xff0c;配…

CentOS Linux的替代品(四)_openEuler 22.03-LTS基础安装教程

文章目录 1 openEuler 22.03-LTS简介1.1 系统安装1.1.1 发布件1.1.2 最小硬件要求1.1.3 硬件兼容性 1.2 关键特性1.2.1 openEuler 22.03-LTS基于 Linux Kernel 5.10内核构建, 在进程调度、内存管理等方面带来10余处创新1.2.2 新介质文件系统1.2.3 内存分级扩展1.2.4 用户态协议…

LLM - 第2版 ChatGLM2-6B (General Language Model) 的工程配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131445696 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优…

Scrapy框架之下载中间件(详解)

目录 Scrapy中下载中间件 概念 方法 process_request(self, request, spider) 参数: process_response(self, request, response, spider) 参数 基本步骤 示例代码 注意 Scrapy 中 Downloader 设置UA 开发UserAgent下载中间件 代码 三方模块 配置模块到Settin…

GeneGPT:用领域工具增强大型语言模型,以改善对生物医学信息的访问

文章目录 一、论文关键信息二、主要内容1. Motivations2. 解决方案关键3. 实验和结果 三、总结与讨论 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题&#xff1a;GeneGPT: Augmenting Large Language Models with Domain …

Python3 标准库概览 | 菜鸟教程(十八)

目录 一、Python3 标准库中的模块 &#xff08;一&#xff09;os 模块 &#xff08;二&#xff09;sys 模块 &#xff08;三&#xff09;time 模块 &#xff08;四&#xff09;datetime 模块 &#xff08;五&#xff09;random 模块 &#xff08;六&#xff09;math 模块…

PostgreSQL13.1

目录 1. PostgreSQL简介1.1 PostgreSQL是什么&#xff1f;1.2 PostgreSQL数据库的优缺点是什么&#xff1f;1.2.1 PostgreSQL的主要优点如下&#xff1a;1.2.2 PostgreSQL的应用劣势如下&#xff1a; 1.3 PostgreSQL不同大版本之间的特性比较1.4OpenGauss与PostgreSQL的对比1.4…

互联网编程之多线程/线程池TCP服务器端程序设计

目录 需求 多线程TCP服务器 线程池TCP服务器 测试 日志模块 需求 多线程TCP服务器&#xff08;30分&#xff09;&#xff1a; 设计编写一个TCP服务器端程序&#xff0c;需使用多线程处理客户端的连接请求。客户端与服务器端之间的通信内容&#xff0c;以及服务器端的处理…

Linux中创建sftp用户并限制目录权限

注意两点&#xff1a; 一是禁止该用户通过ssh登录&#xff0c;二是不需要创建家目录。家目录简单来说&#xff0c;就是在/home下的用户命令&#xff0c;默认每个用户在/home中都是有与用户名一样的文件夹。 1.创建组 groupadd sftp 2. 创建用户 useradd -g sftp -s /sbin/…

API 网关 vs 负载均衡:选择适合你的网络流量管理组件

由于互联网技术的发展&#xff0c;网络数据的请求数节节攀升&#xff0c;这使得服务器承受的压力越来越大。在早期的系统架构中&#xff0c;通常使用负载均衡来将网络流量平摊到多个服务器中&#xff0c;以此减轻单台服务器的压力。但是现如今&#xff0c;后端服务的种类在不断…

vue进阶-elementPlus

Element Plus官网 Element Plus 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。减少开发者关注css&#xff0c;重心关注业务逻辑。 1. 入门 1.1 安装 npm install element-plus --save1.2 快速开始 1、main.js 引入并 use element-plus import { createApp } from …