Nginx的反向代理:实现灵活的请求转发和内容缓存
一、引言:代理服务器的简介
本节介绍代理服务器的基本配置。学习如何通过不同协议将 NGINX 请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。
代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过 HTTP以外的协议将请求传递给应用服务器。

二、将请求传递给代理的服务器
当 NGINX 代理请求时,它将请求发送到指定的代理服务器,获取响应,并将其发送回客户端。可以使用指定的协议将请求代理到 HTTP 服务器(另一个 NGINX 服务器或任何其他服务器)或非 HTTP 服务器(可以运行使用特定框架开发的应用程序,如 PHP 或 Python)。
要将请求传递给 HTTP 代理服务器,则在一个 location 块内指定 proxy_pass 指令。例如:
worker_processes 4;events {worker_connections 1024;
}http {server {listen 8888;location / {proxy_pass http://192.168.7.146:8889;}}server {listen 8889;}server {listen 8890;}server {listen 8891;}
}
此 示 例 配 置 将 在 此 location 处 理 的 所 有 请 求 传 递 到 指 定 地 址(www.example.com/link/)处的代理服务器。该地址可以指定为域名或 IP 地址。该地址还可能包括一个端口。
三、代理多个服务器
在一个 location 块内指定 proxy_pass 指令可以代理一个服务器,也可以使用upstream指令代理多个服务器。示例:
worker_processes 4;events {worker_connections 1024;
}http {upstream backend {server 192.168.7.146:8889;server 192.168.7.147:8890;}server {listen 8888;location / {proxy_pass http://backend;}}server {listen 8889;}server {listen 8890;}server {listen 8891;}
}
backend 是模块名,里面就可以写上多个需要代理的服务器。不能使用多个proxy_pass来代理,需要使用upstream来实现代理多个服务器。
四、代理多个服务器的负载均衡
可以使用weight来调整权重,实现负载均衡(注意weight和等号之间不能出现空格)。不仅仅可以代理其他的服务器,也可以代理本机的。
worker_processes 4;events {worker_connections 1024;
}http {upstream backend {server 192.168.7.146:8889 weigth=2;server 192.168.7.147:8890 weigth=3;erver 192.168.7.148 weigth=1;}server {listen 8888;location / {proxy_pass http://backend;}}server {listen 8889;}server {listen 8890;}server {listen 8891;}
}
五、restful介绍
首先来看看常见的资源访问地址模式:
https://blog.csdn.net/Long_xu?type=blog&&name=xxx
如果没有使用restful,那么Nginx的配置文件需要这样配置:
http {server {listen 8888;location /type=blog&&name=xxx {proxy_pass http://192.168.7.146:8889;}}
}
显得有些复杂和固化。
如果使用restful,就可以这样配置:
http {server {listen 8888;location /FLY/blog {}location /FLY {}}
}
如果conf的内容过长,还可以进行模块化配置,使用include引用:
比如把下面的:
# test.conf
worker_processes 4;events {worker_connections 1024;
}http {upstream backend {server 192.168.7.146:8889 weigth=2;server 192.168.7.147:8890 weigth=3;erver 192.168.7.148 weigth=1;}server {listen 8888;location / {proxy_pass http://backend;}location /FLY/blog {}location /FLY {}}server {listen 8889;}server {listen 8890;}server {listen 8891;}
}
改为:
# test.conf
worker_processes 4;events {worker_connections 1024;
}http {upstream backend {server 192.168.7.146:8889 weigth=2;server 192.168.7.147:8890 weigth=3;erver 192.168.7.148 weigth=1;}include ./dir/*.conf
}
# server8888.conf
server {listen 8888;location / {proxy_pass http://backend;}location /FLY/blog {}location /FLY {}
}
# server8889.conf
server {listen 8889;
}
# server8890.conf
server {listen 8890;
}
# server8891.conf
server {listen 8891;
}
把下面把一个拆分为多个,每个server可以独立。
六、Nginx conf中http与server的关系
在conf文件中,是http协议包含server还是server 包含协议呢?它们是N对N还是1对N呢?
在计算机中,有很多N对N的场景,但是代码实现过程中,会将其转换为1对N的关系。因为N对N是一个很复杂的流程,不好处理。
也就是http与server的关系是N对N的关系;只是代码实现会细化变为1对N的逻辑。
七、进阶:Nginx 基础组件使用
这是一个前导,主要了解如何将Nginx源码里提供的基础组件拆分出来使用,比如ngx_str、list,queue、hash、array等等。后面会有专门章节介绍Nginx 基础组件使用。
这里先对ngx_str进行一个简单的使用。
#include <stdio.h>
#include "ngx_config.h"
#include "ngx_conf_file.h"
#include "nginx.h"
#include "ngx_core.h"
#include "ngx_string.h"
//#include "ngx_palloc.h"
//#include "ngx_array.h"
//#include "ngx_hash.h"
int main()
{
ngx_str_t str = ngx_string("Hello World!");
printf("string length: %ld\n", str.len);
printf("string: %s\n", str.data);
return 0;
}
编译:
gcc -o ngx_code ngx_code.c -I /home/fly/workspace/nginx-1.13.7/src/core/ -I /home/fly/workspace/nginx-1.13.7/src/event/ -I /home/fly/workspace/nginx-1.13.7/src/os/unix/ -I /home/fly/workspace/nginx-1.13.7/objs/ -I /home/fly/workspace/pcre-8.41/ -I /home/fly/workspace/openssl-1.1.0g/include/
注意,库的路径要换成自己的。
执行结果:
# ./ngx_code
string length: 12
string: Hello World!
把编译过程做成makefile:
# 方便起见一般都会先定义编译器链接器
CC = gcc
LD = gcc
# 正则表达式表示目录下所有.c文件
SRCS = $(wildcard *.c)
# OBJS表示SRCS中把列表中的.c全部替换为.o
OBJS = $(patsubst %c, %o, $(SRCS))
# -I指定头文件目录
INCLUDE = -I /home/fly/workspace/nginx-1.13.7/src/core/ -I /home/fly/workspace/nginx-1.13.7/src/event/ -I /home/fly/workspace/nginx-1.13.7/src/os/unix/ -I /home/fly/workspace/nginx-1.13.7/objs/ -I /home/fly/workspace/pcre-8.41/ -I /home/fly/workspace/openssl-1.1.0g/include/
# -L指定库文件目录,-l指定静态库名字(去掉文件名中的lib前缀和.a后缀)
# LIB = -L./libs -ltomcrypt
# 开启编译warning和设置优化等级
# CFLAGS = -Wall -O2
# 可执行文件的名字
TARGET = ngx_code
# .PHONE伪目标
.PHONY:all clean
# 要生成的目标文件
all: $(TARGET)
# 链接时候指定库文件目录及库文件名
$(TARGET): $(OBJS)$(LD) -o $@ $^ $(LIB)# 编译时候指定头文件目录
%.o:%.c$(CC) -c $^ $(INCLUDE) $(CFLAGS) clean:rm -f $(OBJS) $(TARGET)
总结
- 学会Nginx反向代理的conf文件配置。
- 了解nginx基础组件的源码组件:ngx_str、list、queue、hash、array、log、原子操作、共享内存、线程池、内存池、红黑树、http协议等等。
- nginx module开发:filter,handler,upstream。
相关文章:
Nginx的反向代理:实现灵活的请求转发和内容缓存
一、引言:代理服务器的简介 本节介绍代理服务器的基本配置。学习如何通过不同协议将 NGINX 请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理通常用于在多个服务器之间分配负载&…...
免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案
网站安全成为了每个企业及个人不可忽视的重要议题。 随着网络攻击手段日益狡猾和复杂,选择一个强大的安全防护平台变得尤为关键。 推荐的雷池社区版——一个为网站提供全面安全防护解决方案的平台,它不仅具备高效的安全防护能力,还让网站安…...
基于SpringBoot的航班进出港管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…...
Odoo系统安装部署并结合内网穿透实现固定域名访问本地ERP系统
文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…...
幻兽帕鲁(Palworld 1.4.1)私有服务器搭建(docker版)
文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 说明 服务器硬件要求:Linux系统/Window系统(x86架构,armbian架构…...
好书推荐丨细说Python编程:从入门到科学计算
文章目录 写在前面Python简介推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本Python基础入门的全新正版书籍,对Python、机器学习、人工智能感兴趣的小伙伴们快来看看吧~ Python简介 Python 是一种广泛使用的高级、解…...
智慧城市与数字孪生:共创未来城市新篇章
一、引言 随着科技的飞速发展,智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术,提升城市治理水平,改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接,为城市管理、规划…...
Java数据结构---初识集合框架
目录 一、什么是集合框架 二、集合框架的重要性 三、背后涉及的数据结构及算法 1.什么是数据结构 2.容器背后对应的数据结构 3.相关的Java知识 4.什么是算法 一、什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container ࿰…...
Spring Cloud学习
1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…...
【计算机网络】1.4 接入网和物理媒体
1.4 接入网和物理媒体 问题:怎样将端系统和边缘路由器连接? 答:有线方式(住宅接入网络、单位接入网络等)或无线方式(无线接入网络)。 有线接入方式 光纤同轴混合网是基于已有的有线电视网开发的…...
关于螺栓的基本拧紧技术了解多少——SunTorque智能扭矩系统
螺栓是机械中常见的紧固件之一,用于将两个或多个部件连接在一起,并保持它们之间的紧密配合。拧紧螺栓是一项基本的技术,但在实际操作中,许多工人并不了解正确的拧紧方法,从而导致螺栓松动、连接失效等问题的出现。因此…...
C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁
PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…...
[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)
序言 之前开发的耕地占补平衡报备格式,现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具(插件),需要授权后才能使用; 本软件…...
todolist
一开始想自己写个todolist的网页,一直没时间,直接拿这个博客记录了,因为仅我可见比较麻烦,就放在全部可见记录了 目录 2024年3月todoes了解一下深入学习k8s,比如pod运行多个容器 ,编写自己的镜像 2024年2月…...
【Java程序设计】【C00307】基于Springboot的基Hadoop的物品租赁管理系统(有论文)
基于Springboot的基Hadoop的物品租赁管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的基于 Hadoop的物品租赁系统的设计与实现,本系统有管理员、用户二种角色权限; 前台首页&#…...
GIT中对子仓库的使用方法介绍
git 子仓库 主仓库中添加子仓库 git submodule add <url> <path>更新子代码代码 git submodule update --init克隆含有子仓库的仓库 git clone --recurse-submodules <url>主仓库中删除子仓库 1、进入包含子仓库的父仓库的根目录 2、使用以下命令将子仓…...
ClickHouse 指南(三)最佳实践 -- 跳数索引
Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下,关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此,选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…...
Mybatis总结--传参二
#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为?占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数,需要通过名称使…...
2024年数字化转型风口趋势大赏
人工智能和自动化确实为提高效率和数据驱动的见解提供了巨大的潜力,但这些技术无法完全取代人类技能和情境决策。在混合模型中将人工智能功能与人类专业知识相结合的企业将实现最大的效益。 随着人工智能和自动化的不断发展,企业必须调整其战略、流程和人…...
某款服务器插上4张TDP功耗75瓦PCIE卡无法开机的调试过程
1.服务器厂家说这款服务器测过别家的4卡,所以一开始并没有怀疑服务器硬件有问题 2.拔掉另外三张,只保留cpu0对应的riser0 slot0上的一张卡,仍然无法开机。 3.怀疑是这张pcie卡bar空间太大导致。换另一款bar空间小的卡,仍然无法开…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
