nginx--反向代理

news2024/9/25 17:21:45

反向代理

指的是代理外网用户的请求到内部的指定web服务器器,并将数据返回给用户的一种方式,这是用的比较多的一种方式

 模块和功能

  • ngx_http_proxy_module: 将客户端的请求以http协议转发至指定服务器进行处理。
  • ngx_stream_proxy_module:将客户端的请求以tcp协议转发至指定服务器处理。
  • ngx_http_fastcgi_module:将客户端对php的请求以fastcgi协议转发至指定服务器助理。
  • ngx_http_uwsgi_module:将客户端对Python的请求以uwsgi协议转发至指定服务器处理

 逻辑调用关系

 

 生产部署结构

 实现http反向代理

 访问逻辑图

部署apache服务器

web1

yum install -y httpd 
echo "web2 192.168.33.171" > /var/www/html/index.html
systemctl enable --now httpd

web2

 yum install -y httpd
 echo "web2 192.168.33.149" > /var/www/html/index.html
 systemctl enable --now httpd

nginx反向代理参数

Module ngx_http_proxy_module

proxy_pass;用来设置将客户端请求转发给的后端服务器器的主机,可以是主机名、IP地址:端口的方式,也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持。

server {
  listen 80;
  listen       443 ssl;
  ssl_certificate  /apps/nginx/certs/www.fxq.com.crt;
  ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
  ssl_session_cache shared:sslcache:20m;
  ssl_session_timeout 10m;
  server_name www.fxq.com;
  location / {
     root /data/nginx/html/pc;
     index index.html;
    }
  location = /favicon.ico {
     root /data/nginx/html/pc;
  }
  location /web1{
     proxy_pass http://192.168.33.149:80/;带斜线,等于访问后端服务器器的http://http://192.168.33.149:80/index.html 内容返回给客户端
     index index.html;
    }
  
  location /web2{
     proxy_pass http://192.168.33.171:80;不带斜线将访问的/web,等于访问后端服务器http://http://192.168.33.171:80/web/index.html,即后端服务器配置的站点根目录要有web目录才可以被访问
     index index.html;}
  } 

proxy_hide_header field;用于nginx作为反向代理的时候,在返回给客户端http响应的时候,隐藏后端服务版本相应头部的信息,可以设置在http/server/location块,

 
  location /web2{
     proxy_pass http://192.168.33.171:80/;
     index index.html;
     proxy_hide_header Etag;
   } 
  }

proxy_pass_header field;  默认nginx在响应报文中不传递后端服务器器的首部字段Date,Server, X-Pad, X-Accel等参数,如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端。

proxy_pass_request_body on | off;是否向后端服务器发送HTTP包体部分,可以设置在http/server或location块,默认即为开启 

proxy_pass_request_headers on | off;是否将客户端的请求头部转发给后端服务器,可以设置在http/server或location块,默认即为开启

 proxy_set_header;可以更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器器想要获取客户端的真实IP的时候,就要更改每一个报文的头部

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr; 添加HOST到报文头部,如果客户端为NAT上网那么其值为客户端的共用的公网IP地址,常用于在日之中记录客户端的真实IP地址。

proxy_connect_timeout time;配置nginx服务器与后端服务器尝试建立连接的超时间,默认为60秒,⽤法如下:
proxy_connect_timeout 60s;60s为自定义nginx与后端服务器建立连接的超时

proxy_read_time time;配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时间,默认60s
proxy_send_time time;配置nginx项后端服务器或服务器组发起write请求后,等待的超间,默认60s 

proxy_http_version 1.0;用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0 

proxy_ignore_client_abort off;当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器忽略客户端中断并一直等着代理服务执行回,如果设置为off,则客户端中断后Nginx也会中断客户端请求并立即记录499日志,默认为off。 

proxy_headers_hash_bucket_size 128;当配置了了 proxy_hide_header和proxy_set_header的时候,用于设置nginx保存HTTP报文头的hash表的上限。
proxy_headers_hash_max_size 512; 设置proxy_headers_hash_bucket_size的最大可用空间
server_names_hash_bucket_size 512; server_name hash表申请空间大小
server_names_hash_max_szie 512; 设置服务器名称hash表的上限大小 

nginx缓存功能

参数详解

proxy_cache zone | off; 默认off 指明调用的缓存,或关闭缓存机制;Context:http, server, location

 proxy_cache_key string; 缓存中用于“键”的内容

默认值:proxy_cache_key $scheme $proxy_host $request_uri

 proxy_cache_valid [code ...] time; 定义对特定响应码的响应内容的缓存时长,定义在http{...}中

proxy_cache_valid 404 1m;

proxy_cache_path;
定义可用于proxy功能的缓存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time] [purger_threshold=time];

例如:配置http定义缓存信息

proxy_cache_path /var/cache/nginx/proxy_cache 定义缓存保存路径,proxy_cache会自动创建
levels=1:2:2 定义缓存目录结构层次,1:2:2可以⽣生成2^4x2^8x2^8=1048576个目录
keys_zone=proxycache:20m 指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)
inactive=120s; 缓存有效时间
max_size=1g; 最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值

调⽤用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多⻓长时间
proxy_cache_valid any 1m;

 proxy_cache_use_stale error http_502 http_503; 在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默认是off

 proxy_cache_methods GET | HEAD | POST ...; 对哪些客户端请求方法对应的响应进行存,GET和HEAD方法总是被缓存

案例

非缓存场景压测

web配置

 cd /var/www/html/

 cp /var/log/messages /var/www/html/index.html

 systemctl restart httpd

ab命令使用

参考:https://www.cnblogs.com/niuben/p/18139837

命令格式: ab [选项] [URL]

选项包括:
-n 请求总数:指定要发送的请求数量。
-c 并发数:指定同时发送请求的并发数量。
-t 测试时间:指定测试的时间长度。
-p POST文件:使用POST方法时,指定包含POST数据的文件。
-T POST内容类型:指定POST数据的内容类型。
-k 保持连接:启用HTTP KeepAlive功能,允许单个连接发送多个请求。
-v 显示详细输出:显示每个请求的详细结果。
-i 忽略不可用的输出:在输出中忽略无效的请求。
-x 提供代理服务器信息:使用代理服务器进行测试。
-X 代理认证类型:指定代理服务器的认证类型。
-C 提供Cookie信息:发送Cookie到服务器。
-H 添加请求头:添加自定义的HTTP请求头。
-A 添加认证信息:添加认证信息到请求头中。
-m HTTP方法:指定HTTP方法,如GET、POST等。
-s 超时时间:指定每个请求的超时时间。
-g 生成gnuplot格式的输出:将结果保存为gnuplot格式的文件。
-e 输出CSV格式:将结果保存为CSV格式的文件。
-f HTML输出:将结果保存为HTML格式的文件。

URL:测试的目标URL,[http[s]://]hostname[:port]/path。
Server Software:        Apache  		#服务器软件
Server Hostname:        json.im   #域名
Server Port:            80 				#请求端口号

Document Path:          /   			#文件路径
Document Length:        40888 bytes 	#页面字节数

Concurrency Level:      10   			#请求的并发数
Time taken for tests:   27.300 seconds  #总访问时间
Complete requests:      1000   			#请求成功数量
Failed requests:        0      			#请求失败数量
Write errors:           0
Total transferred:      41054242 bytes  #请求总数据大小(包括header头信息)
HTML transferred:       40888000 bytes  #html页面实际总字节数
Requests per second:    36.63 [#/sec] (mean)  #每秒多少请求,这个是非常重要的参数数值,服务器的吞吐量
Time per request:       272.998 [ms] (mean)     #用户平均请求等待时间 
Time per request:       27.300 [ms] (mean, across all concurrent requests)
												# 服务器平均处理时间,也就是服务器吞吐量的倒数 
Transfer rate:          1468.58 [Kbytes/sec] received  #每秒获取的数据长度

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       43   47   2.4     47      53
Processing:   189  224  40.7    215     895
Waiting:      102  128  38.6    118     794
Total:        233  270  41.3    263     945

Percentage of the requests served within a certain time (ms)
  50%    263    #50%用户请求在263ms内返回
  66%    271    #66%用户请求在271ms内返回
  75%    279    #75%用户请求在279ms内返回
  80%    285    #80%用户请求在285ms内返回
  90%    303    #90%用户请求在303ms内返回
  95%    320    #95%用户请求在320ms内返回
  98%    341    #98%用户请求在341ms内返回
  99%    373    #99%用户请求在373ms内返回
 100%    945 (longest request)

 ab -n 2000 -c200 http://www.fxq.com/web1/index.html

 

 配置缓存设置

vim /apps/nginx/conf/nginx.conf

···
http {
    include       mime.types;
    default_type  application/octet-stream;
    proxy_cache_path /data/nginx/proxycache levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
···
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
  listen 80;
  listen       443 ssl;
  ssl_certificate  /apps/nginx/certs/www.fxq.com.crt;
  ssl_certificate_key /apps/nginx/certs/www.fxq.com.key;
  ssl_session_cache shared:sslcache:20m;
  ssl_session_timeout 10m;
  server_name www.fxq.com;
  location / {
     root /data/nginx/html/pc;
     index index.html;
    }
  location = /favicon.ico {
     root /data/nginx/html/pc;
  }
  location /web1{
     proxy_pass http://192.168.33.149:80/;
     index index.html;
    }
  
  location /web2{
     proxy_pass http://192.168.33.171:80/;
     index index.html;
     proxy_hide_header Etag;

     proxy_cache proxycache;
     proxy_cache_key $request_uri;
     proxy_cache_valid 200 302 301 1h;
     proxy_cache_valid any 3m;
   } 
  }

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

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

相关文章

自学错误合集--MessageSource国际化接口

java后端自学错误总结 一.MessageSource国际化接口总结 一.MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口,提供了国际化信息的能力。MessageSource用于解析 消息,并支持消息的…

hadoop启动后没有namenode,datanode等解决方法

之前用的是虚拟机,在虚拟机上安装的hadoop,但是后来,电脑恢复出厂设置了,什么都重新开始。就在本地安装 Linux 子系统。 但是,有时候start-dfs.sh后,jps出现错误。 像这种拒绝连接 解决办法就是如下&…

智慧隧道建设中,如何提升隧道广播清晰度,解决隧道广播有效发布问题

近年来,我国高速公路智慧隧道建设步伐加快,全国各地高速公路运营单位纷纷加大投资力度,进行智慧隧道建设,提高隧道智能化水平。通过高清视频监控、AI视频识别、雷视融合、全域轨迹、激光雷达、火灾报警、气体检测、亮度检测、自动…

倪海厦(二)以果决其行,放空自己。

研究任何学问(事物),批判去看,假设--验证--结果。以果决其行!!!放空自己。学而后思,思学并进。 其实总结下来,也正如倪老师所说,以果决其行,我们…

STM32F1之FLASH闪存

目录 1. 简介 2. 闪存模块组织 3. FLASH基本结构 4. FLASH解锁 5. 使用指针访问存储器 6. 程序存储器全擦除 7. 程序存储器页擦除 8. 程序存储器编程 9. 选项字节 1. 简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过…

第 129 场 LeetCode 双周赛题解

A 构造相同颜色的正方形 枚举&#xff1a;枚举每个 3 3 3\times 3 33的矩阵&#xff0c;判断是否满足条件 class Solution {public:bool canMakeSquare(vector<vector<char>>& grid) {for (int i 0; i < 2; i)for (int j 0; j < 2; j) {int c1 0, c…

一款 NodeJS 版本管理工具 NVM (Windows)

一、简介 Node Version Manager&#xff08;NVM&#xff09;是一种用于管理多个 NodeJS 版本的工具。在日常工作中&#xff0c;我们可能同时在进行多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;依赖与不同版本的NodeJS 运行环境。这种情况下&#xff0c;维护…

通过DataGrip将mysql表结构信息转存excel 复制select结果的insert插入语句

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展&#xff0c;在这个系列专栏中记录了博主在学习期间总结的大块知识点&#xff0c;以及日常工作中遇到的各种技术点 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 查询表结构信息&#xff0c;并…

巴菲特称AI与核武器一样可怕,并调侃AI诈骗可能成下一个增长产业|钛媒体AGI | 最新快讯

总的来看&#xff0c;巴菲特对于 AI 有所知晓&#xff0c;希望它能够是件好事&#xff0c;而且认为AI会颠覆和改变这个世界&#xff0c;但是他并不是很了解&#xff0c;也言下之意表示&#xff0c;他并不会在 AI 领域进行投资。 &#xff08;图片来源&#xff1a;由 AI 生成的巴…

C++中的内存管理(上)

一、C中的内存分布 我们先来看下下面的代码&#xff1a; int globalvar 1; static int staticGlobalvar 1; void test() {static int staticVar 1;int localvar 1;int num1[10] { 1, 3, 2, 4 };char char2[] "abcd";const char* pChar3 "abcd";in…

常见的零拷贝技术

传统IO 基于传统的IO方式&#xff0c;底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区&#xff0c;再复制到用户缓冲区&#xff1b;然后再通过write()写入到socket缓冲区&#xff0c;最后写入网卡设备。整个过程发生了4次用户态和内核态的上…

【前端开发---Vue2】史上最详细的Vue入门教程(五) --- 细讲‘生命周期’

什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09;&#xff0c;本篇将详细讲解vue中的核心 --- 生命周期&#xff0c;并提供具体案例来让小伙伴们加深理解、彻底掌握…

# 从浅入深 学习 SpringCloud 微服务架构(九)

从浅入深 学习 SpringCloud 微服务架构&#xff08;九&#xff09; 一、微服务网关引入 1、在微服务架构中&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c; 如果让客户端直接与各个微服务通讯&#xff0c;可能会有很多问题&#xff0c;如&#xff1a; 1&#…

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你&#xff0c;一定会刷到过这样的直播间&#xff1a; 现在大家明白了&#xff0c;这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看&#xff0c;高大上&#xff0c;也想做一个这样的图像&#xff0c;来当自己的微信头像。 做这样的图像需要排队刷…

Jenkins自动化搭建记录

每一份努力都是有一份期盼&#xff0c;每一份付出都是为了有更多的收获。 本文记录一次搭建Jenkins自动参数化打包APK的实现过程和碰到的问题&#xff0c;实现了在Windows和Mac系统下的自动化打包流程。 因为Jenkins的安装过程在网上的教程很多&#xff0c;这里就不在赘述。 …

手动实现简易版RPC(三)

手动实现简易版RPC(三) 往期内容 手动实现简易版RPC&#xff08;一&#xff09;&#xff1a;RPC简介及系统架构 手动实现简易版RPC&#xff08;二&#xff09;&#xff1a;简单RPC框架实现 前言 接上两篇博客我们实现了最简易RPC框架&#xff0c;接下来的几期重点在简易版…

深入解析C#特殊字符:概念、分类与使用方法

文章目录 前言一、特殊字符的定义二、特殊字符的分类与作用1.转义字符2. 格式字符3. 逻辑运算符4. 运算符5. 字符串6. 注释 三、$&#xff1a;字符串内插&#xff08;String Interpolation&#xff09;四、&#xff1a;逐字字符串&#xff08;Verbatim Strings&#xff09;五、…

ai绘画的今天,新人还能入行吗?

现在24年了&#xff0c;大趋势已经很明显&#xff0c;ai绘画现阶段处于如日中天的时候&#xff0c;无论是绘画&#xff0c;电商&#xff0c;小说推文。等等一系列的行业都能用到ai绘画&#xff01; 说明一下&#xff0c;我自己就是23年初偶然间刷到了ai绘画这个赛道&#xff0c…

SpringDI方式及Redis应用场景的分享

1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示&#xff0c;在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)&#xff1b;但是使用Resource却不会…

Git笔记-常用指令

Git笔记-常用指令 一、概述二、仓库管理二、缓存区操作1. 添加文件到缓存区2. 取消缓存文件3. 忽略列表 三、日志状态信息四、分支操作五、六、 一、概述 这里记录一些git常用的指令。 二、仓库管理 # 本地仓库初始化 git init# 克隆仓库 git clone git_url # git clone ht…