当前位置: 首页 > news >正文

Nginx代理配置详解

一、什么是代理

1、正向代理(forward proxy)

正向代理,简单的说就像是一个跳板,它隐藏了真实的请求客户端(IP),服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器来代替请求。

举个例子来说:众所周知,国内的用户无法访问谷歌,但是因为某些原因,我们必须要访问谷歌,这个时候我们会有一个“梯子”,既然我们无法直接访问谷歌,我们就麻烦“梯子”帮助我们访问谷歌。
事实上我们还是没法访问谷歌,只是这个“梯子”能够访问,它只是将访问结果返回给我们而已。这里的“梯子”就是一个正向代理,它是帮助客户端也就是我们用户来代理的。

正向代理对象是客户端,客户端转发给代理客户端,由代理客户端去真正访问服务器,正向代理隐藏了真实客户端的身份(IP)。

客户端<==转发==>代理客户端的服务器<----------->服务器

当正向代理出现多个请求客户端时,如图所示:

在这里插入图片描述

简单来说,正向代理指的是一对一或者多对一,服务端不知道发送请求的客户端是哪些人。

2、反向代理(reverse proxy)

反向代理恰好跟正向代理相反。反向代理指的是一对多或者多对多,客户端不知道响应请求的服务端是哪些服务。

反向代理对象是服务端,客户端真正访问的是代理服务器,反向代理隐藏了真实的服务端的身份(IP)。

客户端<----------->代理服务器的服务器<==转发==>服务器

在这里插入图片描述

反向代理一般是负载均衡(Load Balance)的一个原理。代理服务器会将大量的请求分摊给多台提供相同服务的服务器或集群。
负载均衡的策略跟 nginx使用的负载均衡算法有关,默认使用轮询算法,nginx还提供各种参数给负载均衡调优。

3、反向代理和正向代理的区别

两者根本的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。
总而言之:

  • 正向代理为客户端服务,对服务端是透明的。
  • 反向代理为服务端服务,对客户端是透明的。
  • 梯子的原理就是正向代理,负载均衡的原理就是反向代理。

二、Nginx实现反向代理

1、Tomcat实战

实现效果:打开浏览器,在浏览器的地址栏中输入www.proxy123.com,回车之后就会访问 Linux系统中运行的 Tomcat服务器的主页面。

1.1 安装启动Tomcat

Tomcat依赖JDK。Linux 安装JDK详细步骤:https://blog.csdn.net/qq_42402854/article/details/108164936

然后在 Linux中安装 Tomcat,Tomcat使用端口号8080。一次执行下面命令:

# 下载Tomcat
wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.105/bin/apache-tomcat-7.0.105.tar.gz# 解压即安装
tar -zxvf apache-tomcat-7.0.105.tar.gz# 移动到local目录下
mv apache-tomcat-7.0.105 /usr/local/tomcat# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
  • 如果需要关闭防火墙:systemctl stop firewalld
  • 如果需要关闭tomcat:/usr/local/tomcat/bin/startup.sh

浏览器直接访问 Tomcat服务器,192.168.xxx.xxx:8080

在这里插入图片描述

1.2 修改 Windows中的 hosts域名映射

打开 C:\Windows\System32\drivers\etc\,在该目录下有一个hosts文件,将该文件进行拷贝备份,避免修改后不知道怎么改回去,打开hosts文件,添加以下配置代码:

#虚拟机域名          映射的网址
192.168.xxx.xxx    www.proxy123.com

1.3 修改Nginx的配置文件并启动Nginx

第一步:编辑nginx.conf

编辑内容如下:vi /usr/local/nginx/conf/nginx.conf

server {listen       80; # 指定虚拟主机的服务端口server_name  192.168.xxx.xxx;   # 指定虚拟主机的IP,或者外网域名# URL匹配location / {root  html #定位localtion匹配的url资源路径proxy_pass http://127.0.0.1:8080;  # 代理转发index  index.html index.htm;  # 定义页面显示html}
}

配置文件不熟悉的,可查看文章:https://blog.csdn.net/qq_42402854/article/details/132843413

第二步:Nginx启动

编辑完成之后保存退出,启动Nginx命令:/usr/local/nginx/sbin/nginx

如果Nginx已经启动,那么就使用重新加载配置文件的命令:/usr/local/nginx/sbin/nginx -s reload

[root@centos7 jdk]# /usr/local/nginx/sbin/nginx
nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
[root@centos7 sbin]# mkdir /var/run/nginx/
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx
[root@centos7 sbin]#

Nginx启动报错如下:nginx启动报错:nginx: [error] open() “/var/run/nginx/nginx.pid“ failed (2: No such file or directory) 的解决:https://blog.csdn.net/qq_39244882/article/details/120058404

第三步:浏览器访问OK

启动 Nginx和 Tomcat之后,在浏览器通过 www.proxy123.com就可以通过 nginx代理访问 Tomcat服务的界面啦。

在这里插入图片描述

第四步:关闭服务

关闭Tomcat命令:/usr/local/tomcat/bin/shutdown.sh

关闭Nginx命令:/usr/local/nginx/sbin/nginx -s stop

三、Nginx反向代理相关指令

1、listen指令

该指令用于配置网络监听。主要有如下三种配置语法结构:

1.1 配置监听的IP地址

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred][accept_filter=filter] [bind] [ssl];

1.2 配置监听端口

listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl];

1.3 配置 UNIX Domain Socket

listen unix:path [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ssl];

上面的配置看似比较复杂,其实使用起来是比较简单的:

listen  *:80 | *:8080      #监听所有80端口和8080端口
listen  IP_address:port   #监听指定的地址和端口号
listen  IP_address        #监听指定ip地址所有端口
listen  port              #监听该端口的所有IP连接

下面分别解释每个选项的具体含义:
1、address:IP地址,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。
2、port:端口号,如果只定义了IP地址,没有定义端口号,那么就使用80端口。
3、path:socket文件路径,如 var/run/nginx.sock等。
4、default_server:标识符,将此虚拟主机设置为 address:port 的默认主机。(在 nginx-0.8.21 之前使用的是 default 指令)。
5、 setfib=number:Nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起作用,不常用。
6、backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在 FreeBSD 中默认为 -1,其他平台默认为511。
7、rcvbuf=size:设置监听socket接收缓存区大小。
8、sndbuf=size:设置监听socket发送缓存区大小。
9、deferred:标识符,将accept()设置为Deferred模式。
10、accept_filter=filter:设置监听端口对所有请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以设置为 dataready 或 httpready 。
11、bind:标识符,使用独立的bind() 处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,Nginx 服务器将只使用一个监听指令,并使用 bind() 处理端口相同的所有连接。
12、ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。

2、server_name指令

该指令用于虚拟主机的配置。通常分为以下两种:

2.1 基于名称的虚拟主机配置

语法格式如下:server_name name …;

1)对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。

server_name   123.com www.123.com

2)也可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。

server_name   *.123.com www.123.*

3)还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。

server_name   ~^www\d+\.123\.com$;

该表达式“~”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个0~9之间的数字,在紧跟“.123.co”,最后跟着“m”($表示结尾)。

以上匹配的顺序优先级如下:

1、准确匹配 server_name
2、通配符在开始时匹配 server_name 成功
3、通配符在结尾时匹配 server_name 成功
4、正则表达式匹配 server_name 成功

2.2 基于 IP 地址的虚拟主机配置

语法格式如下:server_name 192.168.1.1

语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。

3、location指令

该指令用于匹配 URL。语法格式如下:

1 location [ = | ~ | ~* | ^~] uri {
2 
3 }

URL匹配通配符:

  • /:通用匹配,任何请求都可以匹配
  • :开头表示精确匹配
  • =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
  • ~:用于表示uri包含正则表达式,并且区分大小写。
  • ~*:用于表示uri包含正则表达式,并且不区分大小写。
  • ^~:用于不包含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri与请求字符串做匹配。
  • !~和!~*:分别表示区分大小写不匹配和不区分大小写不匹配的正则
    优先级:= --> ^~ --> /* #当有多个包含/进行正则匹配时,选择正则表达式最长的location配置执行。

多个location配置的情况下匹配顺序为: 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

注意:如果uri包含正则表达式,则必须要有 ~ 或者 ~ 标识。

4、proxy_pass指令

该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。

语法结构如下:proxy_pass URL;

URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。例如:

proxy_pass  http://www.123.com/uri;

5、index指令

该指令用于设置网站的默认首页。

语法结构如下:index filename …;

后面的文件名称可以有多个,中间用空格隔开。例如:

index  index.html index.jsp;

通常该指令有两个作用:

  • 一个是用户在请求访问网站时,请求地址可以不写首页名称;
  • 一个是可以对一个请求,根据请求内容而设置不同的首页。

– 求知若饥,虚心若愚。

相关文章:

Nginx代理配置详解

一、什么是代理 1、正向代理(forward proxy) 正向代理&#xff0c;简单的说就像是一个跳板&#xff0c;它隐藏了真实的请求客户端&#xff08;IP&#xff09;&#xff0c;服务端不知道真实的客户端是谁&#xff0c;客户端请求的服务都由代理服务器来代替请求。 举个例子来说…...

DAG 的深度优先搜索标记

/**\ | DAG 的深度优先搜索标记 | INIT: edge[][] 邻接矩阵 ; pre[], post[], tag 全置 0; | CALL: dfstag(i, n); pre/post: 开始 / 结束时间 \**/ int edge[V][V], pre[V], post[V], tag; void dfstag( int cur, int n) { // vertex: 0 ~ n-1 pre[cur] tag; for…...

网络存储解决方案:选择与配置

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

java中BigDecimal除法运算指定小数点保留位数和取舍规则

java中使用BigDecimal进行相除运算时&#xff0c;为了避免抛出ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。最好指定小数点保留位数和取舍规则。 取舍规则 ROUND_CEILING: 舍位时向正无穷方向取值。即&#xff1a;向上取…...

车联网远程监控管理提升车辆调度效率,实现高效运营

随着智慧城市建设与物联网技术发展&#xff0c;车辆使用4G工业路由器网络实现车联网&#xff0c;并对车上视频监控、GPS定位以及温湿度传感器等信息进行数据采集和实时传输。这些数据的采集和监测将通过4G网络上传到管理平台&#xff0c;为车辆调度和运行效率的优化提供了有力的…...

数据治理-数据建模和设计

定义 发现、分析和确定数据需求的过程&#xff0c;用一种称为数据模型的精确形式表示和传递这些数据需求。过程是循环迭代的&#xff0c;可能包括概念、逻辑和物理模型。 常见的6种数据模型 关系模式、多维模式、面向对象模式、事实模式、时间序列模式、NoSQL模式。根据描述详…...

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…...

常用的辅助类(必会)

1.CountDownLatch package com.kuang.add;import java.util.concurrent.CountDownLatch;//计数器 减法 public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {//总数是6&#xff0c;必须要执行任务的时候&#xff0c;再使用…...

Java常用类之 String、StringBuffer、StringBuilder

Java常用类 文章目录 一、字符串相关的类1.1、String的 不可变性1.2、String不同实例化方式的对比1.3、String不同拼接操作的对比1.4、String的常用方法1.5、String类与其他结构之间的转换1.5.1、String 与基本数据类型、包装类之间的转换1.5.2、String 与char[]的转换1.5.3、…...

linux在所有文件中查找某一个字符串

linux在所有文件中查找某一个字符串 有时候我们需要在大量文件中查找某一个字符串&#xff0c;手工一个一个打开文件查找非常耗时&#xff0c;我们可以使用 find 和 xargs 两个命令来实现查找指定字符串。 命令详解 find <directory> -type f -name "*.c" |…...

WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)

Websocket和Server-Sent Events 对比推送数据给前端及各自的实现 二者对比WebSocket&#xff1a;Server-Sent Events (SSE)&#xff1a;选择 WebSocket 还是 SSE&#xff1a; Websocket 实现使用原生 WebSocket API&#xff1a;使用 Netty 创建 WebSocket&#xff1a;总结和选择…...

Redis从入门到精通(二:数据类型)

数据存储类型介绍 Redis 数据类型&#xff08;5种常用&#xff09; string hash list set sorted_set/zset&#xff08;应用性较低&#xff09; redis 数据存储格式 redis 自身是一个 Map&#xff0c;其中所有的数据都是采用 key : value 的形式存储 数据类型指的是存储的数据…...

基于SSM的珠宝首饰交易平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

4款视频号数据分析平台!

很多人在做视频号的时候就会有创作参考的需求&#xff0c;那么你们知道视频号中有哪些数据平台&#xff1f;今天就和大家来分享一下 接下来就总结一下视频号数据平台有哪些&#xff1f;排名不分前后。 1&#xff1a;视频号助手&#xff08;channels.weixin.qq.com&#xff09…...

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群&#xff1f;为什么要使用集群架构&#xff1f; 1.什么是集群&#xff1f;2.为什么要使用集群&#xff1f;2.1 高性能2.2 价格有效性2.3 可伸缩性2.4 高可用性2.5 透明性2.6 可管理性2.7 可编程性 3.集群的常见分类3.1 负载均衡集群3.2 高可用性集群3.3 高性能计算集…...

Java手写拓扑排序和拓扑排序应用拓展案例

Java手写拓扑排序和拓扑排序应用拓展案例 1. 算法思维导图 #mermaid-svg-o8KpEXzxukfDM8c9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-o8KpEXzxukfDM8c9 .error-icon{fill:#552222;}#mermaid-svg-o8KpEXzxukfD…...

练习:使用servlet显示试卷页面

试卷页面代码 在浏览器输入如下地址&#xff1a; http://localhost/examPageServlet 效果如下&#xff1a;...

视频监控系统/视频云存储EasyCVR接入国标GB28181设备无法播放设备录像,是什么原因?

安防视频监控平台EasyCVR支持将部署在监控现场的前端设备进行统一集中接入&#xff0c;可兼容多协议、多类型设备&#xff0c;管理员可选择任意一路或多路视频实时观看&#xff0c;视频画面支持单画面、多画面显示&#xff0c;视频窗口数量有1、4、9、16个可选&#xff0c;还能…...

四叶草clover配置工具:Clover Configurator for Mac

Clover Configurator是一款Mac上的工具&#xff0c;用于配置和优化Clover引导加载器。Clover引导加载器是一种用于启动macOS的开源引导加载器。它允许用户在启动时选择操作系统和配置启动选项。 Clover Configurator提供了一个可视化的界面&#xff0c;让用户可以轻松地编辑和…...

计算机网络第四章——网络层(中)

提示&#xff1a;待到山花烂漫时&#xff0c;她在丛中笑。 文章目录 需要加头加尾&#xff0c;其中头部最重要的就是加了IP地址和MAC地址&#xff08;也就是逻辑地址和物理地址&#xff09;集线器物理层设备&#xff0c;交换机是物理链路层的设备&#xff0c;如上图路由器左边就…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...