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)

总结

  1. 学会Nginx反向代理的conf文件配置。
  2. 了解nginx基础组件的源码组件:ngx_str、list、queue、hash、array、log、原子操作、共享内存、线程池、内存池、红黑树、http协议等等。
  3. nginx module开发:filter,handler,upstream。
相关推荐
Linux运维技术栈22 分钟前
Ansible(自动化运维)环境搭建及ansible-vault加密配置
运维·自动化·ansible
Bessssss2 小时前
centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!
linux·运维·centos
苹果醋32 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
jwensh2 小时前
【Jenkins】Declarative和Scripted两种脚本模式有什么具体的区别
运维·前端·jenkins
大熊程序猿3 小时前
xxl-job docker 安装
运维·docker·容器
董健正3 小时前
centos制作离线安装包
linux·运维·centos
咏颜4 小时前
Ubuntu离线安装Docker容器
linux·运维·服务器·经验分享·ubuntu·docker
DexterLien5 小时前
Debian 12 安装配置 fail2ban 保护 SSH 访问
运维·debian·ssh·fail2ban
娶不到胡一菲的汪大东5 小时前
Shell脚本
linux·运维·ubuntu
xserver26 小时前
ensp 基于静态NAT发布公司网站服务器,
运维·服务器