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地址(也就是逻辑地址和物理地址)集线器物理层设备,交换机是物理链路层的设备,如上图路由器左边就…...
时序分解 | MATLAB实现基于小波分解信号分解分量可视化
时序分解 | MATLAB实现基于小波分解信号分解分量可视化 目录 时序分解 | MATLAB实现基于小波分解信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于小波分解的分量可视化,MATLAB编程程序,用于将信号分解成不同尺度和频率的子信…...
VMware虚拟化环境搭建
虚拟化环境搭建 1. 什么是虚拟化环境?未来工作中在何处使用? 在网络安全中,虚拟化环境是一种技术,它将一个物理计算机系统划分成多个独立、可管理的虚拟环境。这种虚拟环境技术允许多个完全不同的操作系统、显示装置和软件在同一…...
Jenkins :添加node权限获取凭据、执行命令
拥有Jenkins agent权限的账号可以对node节点进行操作,通过添加不同的node可以让流水线项目在不同的节点上运行,安装Jenkins的主机默认作为master节点。 1.Jenkins 添加node获取明文凭据 通过添加node节点,本地监听ssh认证,选则凭…...
如何实现不同MongoDB实例间的数据复制?
作为一种Schema Free文档数据库,MongoDB因其灵活的数据模型,支撑业务快速迭代研发,广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中,会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整…...
微服务保护-隔离
个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…...
报错:appium AttributeError: ‘NoneType‘ object has no attribute ‘to_capabilities‘
报错如下 Traceback (most recent call last):File "C:\Users\wlb\Desktop\test\python\2.py", line 16, in <module>driver webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)File "D:\software\python3\lib\site-packages\appium\we…...
MFC - 一文带你从小白到项目应用(全套1)
文章篇幅可能会比较长,从入门到基本能上项目的全部内容。建议观看的过程中,用电脑跟着学习案例。 持续输出优质文章是作者的追求,因为热爱,所以热爱。 最近看动漫被一句鸡汤感动到了,也送给各位朋友: 只要有…...
(2596. 检查骑士巡视方案leetcode,经典深搜)-------------------Java实现
(2596. 检查骑士巡视方案leetcode,经典深搜)-------------------Java实现 题目表述 骑士在一张 n x n 的棋盘上巡视。在 有效 的巡视方案中,骑士会从棋盘的 左上角 出发,并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n …...
Docker 部署 Bitwarden RS 服务
Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…...
python与mongodb交互-->pymongo
from pymongo import MongoClient# 创建数据库连接对象 client=MongoClient(ip,27017)# 选择一个数据库 db=client[admin]db.authenticate(python,python)# 选择一个集合 col=client[pydata][test]col.insert({"class":"python"})col.find() for data in c…...
那个网站可以做雪花特效/购买友情链接
1、方法一,编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本。当然要添加到语句:exit 0 前面才行。如: 复制代码代码如下:sudo vi /etc/rc.local然后在 exit 0 前…...
wordpress 网络验证/今天的新闻有哪些
读书-程序员的自我修养-链接、封装与库(10: 第四章:静态链接(3)--C问题,ABI,静态库libc.a,printf .o,hello.c 整个编译链接过程)1. C相关问题1.1 C的两个问题1.2 c 与 ABI1.2.1 ABI 定义1.2.2 ABI 和 API 的…...
汽车网站建设策划书/品牌营销推广要怎么做
response.setHeader("Access-Control-Allow-Origin", "*");但是这种方式并不能解决所有场景下的问题参考如下文章:http://blog.csdn.net/newjueqi/article/details/27058765下载cors-filter-1.7.jar,java-property-utils-1.9.jar这两…...
网站开发设计工具/网站关键词排名分析
对于该教程而言,缺少了删除已存在的电影记录的功能。因此,我在这里给出删除功能的代码供大家参考学习。 另外,需要注意的是要为VS2008打上SP1服务包,不然就不能使用ADO.NET Entity Data Model功能了。附按本教程制作的MovieDataba…...
他达拉非副作用/泉州百度关键词优化
前言 锁是一种用来控制多线程访问共享资源的工具。通常,锁可以独占共享资源:同一时间只有一个线程可以获得锁,并且所有访问共享资源的线程都必须首先获得锁。前面我们介绍过了synchronized,使用synchronized的方法和代码块作用域…...
计算机毕业论文8000字完整版/对seo的认识和理解
题目:原题链接(简单) 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(NlogN)O(NlogN)O(NlogN)O(1)O(1)O(1)36ms (90.49%)Ans 2 (Python)Ans 3 (Python)LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执…...