全网详细介绍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 防…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

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

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...