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) 正向代理,简单的说就像是一个跳板,它隐藏了真实的请求客户端(IP),服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器来代替请求。 举个例子来说…...
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…...

网络存储解决方案:选择与配置
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
java中BigDecimal除法运算指定小数点保留位数和取舍规则
java中使用BigDecimal进行相除运算时,为了避免抛出ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。最好指定小数点保留位数和取舍规则。 取舍规则 ROUND_CEILING: 舍位时向正无穷方向取值。即:向上取…...

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

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

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)
博客系统 (三) 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点: 博客系统 博客系统是干什么的? CSDN就是一…...

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

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在所有文件中查找某一个字符串 有时候我们需要在大量文件中查找某一个字符串,手工一个一个打开文件查找非常耗时,我们可以使用 find 和 xargs 两个命令来实现查找指定字符串。 命令详解 find <directory> -type f -name "*.c" |…...
WebSocket vs SSE: 实时数据推送到前端的选择与实现(详细)
Websocket和Server-Sent Events 对比推送数据给前端及各自的实现 二者对比WebSocket:Server-Sent Events (SSE):选择 WebSocket 还是 SSE: Websocket 实现使用原生 WebSocket API:使用 Netty 创建 WebSocket:总结和选择…...

Redis从入门到精通(二:数据类型)
数据存储类型介绍 Redis 数据类型(5种常用) string hash list set sorted_set/zset(应用性较低) redis 数据存储格式 redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储 数据类型指的是存储的数据…...

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

4款视频号数据分析平台!
很多人在做视频号的时候就会有创作参考的需求,那么你们知道视频号中有哪些数据平台?今天就和大家来分享一下 接下来就总结一下视频号数据平台有哪些?排名不分前后。 1:视频号助手(channels.weixin.qq.com)…...

【系统架构】什么是集群?为什么要使用集群架构?
什么是集群?为什么要使用集群架构? 1.什么是集群?2.为什么要使用集群?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显示试卷页面
试卷页面代码 在浏览器输入如下地址: http://localhost/examPageServlet 效果如下:...

视频监控系统/视频云存储EasyCVR接入国标GB28181设备无法播放设备录像,是什么原因?
安防视频监控平台EasyCVR支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能…...

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

计算机网络第四章——网络层(中)
提示:待到山花烂漫时,她在丛中笑。 文章目录 需要加头加尾,其中头部最重要的就是加了IP地址和MAC地址(也就是逻辑地址和物理地址)集线器物理层设备,交换机是物理链路层的设备,如上图路由器左边就…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...

理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...
基于Java的离散数学题库系统设计与实现:附完整源码与论文
JAVASQL离散数学题库管理系统 一、系统概述 本系统采用Java Swing开发桌面应用,结合SQL Server数据库实现离散数学题库的高效管理。系统支持题型分类(选择题、填空题、判断题等)、难度分级、知识点关联,并提供智能组卷、在线测试…...

智能问数Text2SQL Vanna windows场景验证
架构 Vanna 是一个开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关功能。 机制 Vanna 的工作过程分为两个简单步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回 SQL 查询,这些查…...