全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。
文章目录
- 1. 文章引言
- 2. 何谓反向代理
- 3. 解析nginx的配置文件
- 3.1 全局块(global block)
- 3.2 events块(events block)
- 3.3 http块(http block)
- 4. 如何配置反向代理
- 4.1 反向代理示例1
- 4.2 反向代理示例2
- 5. 补充说明
- 5.1 location指令说明
- 5.2 nginx完整配置文件
1. 文章引言
如果你的服务器还未安装nginx
,你可以参考网上的资料来安装它。
我们都知道,nginx
是一款轻量级的Web
服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用,如下图所示:
接下来,我便重点介绍nginx
的反向代理,但在介绍前,我们先了解nginx
的正向代理。
什么是nginx
的正向代理呢?
如果把局域网外的Internet
想象成一个巨大的资源库,则局域网中的客户端要访问Internet
,则需要通过代理服务器来访问,这种代理服务就称为正向代理,如下图所示:
我们在日常工作中,常用到正向代理,比如你使用单位的局域网去访问互联网。
正向代理容易理解,那么,反向代理是什么呢,我接下来便详细介绍。
2. 何谓反向代理
我们经常访问百度服务器,直接地址栏中输入www.baidu.com
即可,百度后端有若干台服务器来支持用户的搜索,如下图所示:
但用户不关心访问的是哪台服务器,用户关心的是只要能搜到数据就行,这就是我们常说的反向代理。
客户端对反向代理是无感知的,因为客户端不需要任何配置就可以访问。
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端。
此时,反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP地址。
正向代理和反向代理的区别如下:
-
如果我们客户端自己用,就是正向代理。
-
如果是在服务器用,用户无感知,就是反向代理。
3. 解析nginx的配置文件
俗话说,预先善其事,必先利其器。
因而,在学习nginx
之前,要熟知它的配置文件。
毕竟,如下需要做的所有配置(反向代理、负载均衡、动静分离
等),都是基于它的配置文件。
nginx
的默认配置文件是在安装目录的conf
目录下,后续对nginx
的使用基本上都是基于此配置文件进行修改。
完整的配置文件,可以看下文章的最后。
修改过nginx.conf
配置文件,记得要重启nginx
服务。
配置文件使用#
来注释内容,去掉部分以#
开头的段落,可以看到如下精简后的配置文件内容:
# 主进程叫master,负责管理子进程,子进程叫worker
# worker_processes配置项表示开启几个业务进程,一般和cpu核数有关
worker_processes 1;events {worker_connections 1024;
}http {# include表示可以引入其他文件,此处表示引入http mime类型include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 虚拟主机,可以配置多个server {listen 80;server_name localhost;location / {# 路径匹配之后,哪个目录下去匹配相应的网页,html是相对路径root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
【注意】:其实注释掉的地方,都是某些功能的示例代码,若使用则取消注释即可。
去掉注释信息后,可将nginx.conf
配置文件分为如下三部分:
-
第一部分:全局块
-
第二部分:
events
块 -
第三部分:
http
块
当然,我会详细介绍第三部分的http
快。
3.1 全局块(global block)
从配置文件开始到events
块之间的内容便是全局块,它主要会设置一些影响Nginx
服务器整体运行的配置指令。
比如,开启几个业务进程的worker_processes
,如下代码所示:
worker_processes 1;
worker_processes
是nginx
服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束。
当然,除了worker_processes
的配置,全局块还有几个主要的配置:
-
配置运行
nginx
服务器的用户(组) -
进程
pid
存放路径 -
日志存放路径和类型以及配置文件的引入等。
3.2 events块(events block)
events
块涉及的指令主要影响nginx
服务器与用户的网络连接,常用的设置如下:
-
是否开启对多
work process
下的网络连接进行序列化。 -
是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每
work process
可以同时支持的最大连接数等。
events {worker_connections 1024;
}
此示例就表示每个work process
支持的最大连接数为1024
。
这部分的配置对nginx
的性能影响较大,在实际中应该灵活配置。
3.3 http块(http block)
这部分是nginx
服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,如下所示:
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
需要注意的是:http
块也可以包括http
全局块、server
块,如下的反向代理、动静分离、负载均衡都是在这部分中配置。
-
http
全局块:http
全局块配置的指令如下-
文件引入
-
MIME-TYPE
定义 -
日志自定义
-
连接超时时间
-
单链接请求数上限等。
-
-
server
块:这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个
http
块可以包括多个server
块,而每个server
块就相当于一个虚拟主机。
当然,每个server
块又分为全局server块
,以及可同时包含多个的locaton块
。
-
全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP
配置。
-
location块
一个server
块可以配置多个location
块。
这块的主要作用是:
-
基于
nginx
服务器接收到的请求字符串(例如server_name/uri-string
) -
对虚拟主机名称(也可以是
IP
别名)之外的字符串(例如 前面的/uri-string
)进行匹配 -
对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,
-
还有许多第三方模块的配置也在这里进行,如下所示:
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;# 若请求路径像这样:www.xxxx/img/example.png# 则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件location /img/ {root /var/www/image;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
4. 如何配置反向代理
通过以下两种示例的配置,来演示如何配置反向代理。
4.1 反向代理示例1
实现效果:使用nginx
反向代理,访问www.superjson.com
直接跳转到127.0.0.1:8081
【注意】:此处如果要想从www.superjson.com
跳转到本机指定的ip
,需要修改本机的hosts
文件。
如何修改本机hosts
,可以参考网上教程。
配置代码如下所示:
server {listen 80;server_name 192.168.20.102;location / {root html;index index.html index.htm;proxy_pass http://127.0.0.1:8081}
}
如上配置,nginx
监听80
端口,访问域名为www.superjson.com
(不加端口号时,默认为80
端口),故访问该域名时会跳转到127.0.0.1:8081
路径上。
此处的意为:
nginx
反向代理服务监听192.168.20.102
的80
端口,如果有请求过来,则转到proxy_pass
配置的对应服务器上,仅此而已。
在location
下,同时配置root
和proxy_pass
选项时,两个选项只会二选一执行。
此处不能配置https
反向代理。
在浏览器的地址栏中输入http://www.superjson.com/
,则访问到http://127.0.0.1:8081
,如下图所示:
4.2 反向代理示例2
实现效果:使用Nginx
反向代理,根据访问的路径,跳转到不同端口的服务中,nginx
监听端口为 8011
。
-
访问
http://192.168.20.102/edu/
直接跳转到127.0.0.1:8082
-
访问
http://192.168.20.102/test/
直接跳转到127.0.0.1:8083
-
首先准备两个
tomcat
,一个8082
端口,一个8083
端口,且准备好测试的页面。 -
修改
nginx
的配置文件,在http
块中配置server
,如下所示:
server {listen 8011;server_name 192.168.20.102;location ~ /edu/ {proxy_pass http://127.0.0.1:8082}location ~ /test/ {proxy_pass http://127.0.0.1:8083}
}
如上配置,当请求到达nginx
反向代理服务器时,会根据请求路径不同进行分发到不同的服务上。
5. 补充说明
5.1 location指令说明
该指令用于匹配URL
, 语法如下:
location [ = | ~ | ~* | ^~] uri {}
-
=
:用于不含正则表达式的uri
前,要求请求字符串与uri
严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求 -
~
:用于表示uri
包含正则表达式,并且区分大小写 -
~*
:用于表示uri
包含正则表达式,并且不区分大小写 -
^~
:用于不含正则表达式的uri
前,要求nginx
服务器找到标识uri
和请求。字符串匹配度最高的location
后,立即使用此location
处理请求,而不再使用location
块中的正则uri
和请求字符串做匹配。
【注意】:如果uri
包含正则表达式,则必须要有~
或者~*
标识
5.2 nginx完整配置文件
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}
}
相关文章:

全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。
文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…...
容斥恒等式的证明
容斥恒等式的证明 推广公式 P(A∪B)P(A)P(B)−P(A∩B)P(A\cup B)P(A)P(B)-P(A\cap B) P(A∪B)P(A)P(B)−P(A∩B) (a)设A、B、C为三个事件,则下列恒等式成立: P(A∪B∪C)P(A)P(B)P(C)−P(A∩B)−P(A∩C)−P(B∩C)P(A∩B∩C)P(A\cup B\cup C)P(A)P(B)P(C)…...

Java中的this与super关键字深度解析
一、this关键字this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。(1)this.属性名this修饰的变量用于指代成员变量方法的形参如果…...

CSS3新增的视口单位Vh、Vw单位
定义vw:浏览器可见视口【宽度】的百分比(1vw代表视窗【宽度】的1%)vh:浏览器可见视口【高度】的百分比(1vw代表视窗【高度】的1%)vmin:当前 vw 和 vh 较小的一个值。vmax:当前 vw 和…...

【Linux】yum安装docker指定版本
🍁博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录卸载已有的docker部署指定版本docker安…...

SpringBoot相关操作
01-今日内容 Spring概述、快速入门SpringBoot配置SpringBoot整合 02-SpringBoot概述 SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的…...
Python super()函数:调用父类的构造方法
Python 中子类会继承父类所有的类属性和类方法。严格来说,类的构造方法其实就是实例方法,因此毫无疑问,父类的构造方法,子类同样会继承。 但我们知道,Python 是一门支持多继承的面向对象编程语言,如果子类…...

@ConfigurationProperties在方法上的使用
文章目录1. 前言2. 先说结论3. 代码解释1. Component ConfigurationProperties2. EnableConfigurationProperties ConfigurationProperties3. Bean ConfigurationProperties1. 前言 在学习spring的时候,ConfigurationProperties应该经常被使用到,作用…...
【QT】如何查找和获取界面上的子部件(findChild 和 findChidren)
目录1. findChild()函数2. findChildren()函数3. 示例1. findChild()函数 函数原型: T QObject::findChild(const QString &name QString(), Qt::FindChildOptions options Qt::FindChildrenRecursively) const返回该对象的子对象,该子对象可以转…...
MIT 6.S081学习笔记
计划花25天时间学完6.S081课程,从2月20日-3月20日。课程主页Link xv6 book GDB User Manual Lecture 1: Introduction and Examples课程主题:设计和实现操作系统 OS的三大功能:多路复用、隔离和交互。 Lab: Xv6 and Unix utiliti…...

《网络安全入门到精通》 - 2.1 - Windows基础 - DOS命令Windows防火墙Windows共享文件
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「订阅专栏」:此文章已录入专栏《网络安全入门到精通》 Windows基础一、DOS命令1、目录文件操作dir 列出目录文件cd 切换目录md 创建目录rd 删除目录move 移动文件或目…...

八、Vben框架动态生成可编辑Table
开发过程中产品经理提出了一些奇怪的需求,让人很摸不着头脑,一问就是客户的需求就是这样,那么我们开发只能想各种办法啦。 最近就提出了两个需求, 第一个是需要在日期选择的时候根据时间选择的不同让底下table中增加两个时间中间的…...
浅谈ERP数据的重要性
影响一个ERP项目的因素有很多,数据无疑是其中很重要的一项,正所谓“正确的诊断源于准确的信息,准确的信息基于可靠的采集”,当我们抓住数据这个根基,大处着眼,小处着手的时候,我们距离ERP成功的日子就不会太…...

【RabbitMQ笔记06】消息队列RabbitMQ七种模式之Topics主题模式
这篇文章,主要介绍消息队列RabbitMQ七种模式之Topics主题模式。 目录 一、消息队列 1.1、主题模式(Topics) 1.2、案例代码 (1)引入依赖 (2)编写生产者 (3)编写消费…...

ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?
目录 碎碎念 ChatGPT 中出现的问题 那么正确答案应该是什么呢? 分派的相关知识点总结: 分派是什么? 静态分派与动态分派: Java语言是静态多分派,动态单分派的; 静态分派:静态重载多分派…...

【C++初阶】vector的模拟实现
大家好我是沐曦希💕 文章目录一、前言二、无参构造&析构三、基础接口1.empty和clear2.size和capacity3.[]和iterator四、reserve和resize五、尾插尾删六、其他构造1.迭代器区间构造2.拷贝构造七、memcpy问题八、完整代码一、前言 在模拟实现容器时候࿰…...

微信小程序、小游戏的流量主一般可以赚多少钱?
本篇文章主要科普小程序、小游戏流量主一般赚钱的实际情况,通过在下长期运营的经验汇总而成。 日期:2023年2月26日 作者:任聪聪 小程序、小程序满1000用户后即可开通流量主,但实际上很多人并没有传说中的那种日赚几千的流量收入的…...

jni-Demo-基于linux(c++ java)
跑一个jni 的最简单的Demo需要提前准备 VsCode 编译器、win10下,vscode中集成linux操作系统、c编译器(gcc、g),java编译器(jdk1.8)参考:https://mangocool.com/1653030123842.htmlJniDemo类&…...

指针的进阶——(1)
本次讲解重点: 1、字符指针 2、数组指针 3、指针数组 4、数组传参和指针传参 5、函数指针 关于指针这个知识点的主题,我们在前面已经初级阶段已经对指针有了大致的理解和应用了。我们知道了指针的概念: 1、指针就是地址,但口…...

电商平台的促销活动如何抵御大流量的ddos攻击
每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意 DDoS 攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量 DDoS 攻击,且对延迟敏感,因此只需要在活动期间按需使用 DDoS 防…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...