Nginx的HTTP与Stream区别
Nginx是一个多功能的开源Web服务器,它支持Web服务、正反代理、邮件服务等多个模块,其中两个重要的模块是HTTP模块和Stream模块,这两个模块分别用于处理HTTP流量(HTTP、HTTPS)、非HTTP流量(Socks、TCP、UDP)
HTTP 与 Stream 区别
HTTP模块: HTTP模块主要用于处理HTTP和HTTPS流量。它可以接收HTTP请求、代理HTTP请求到后端服务器、负载均衡、缓存和处理HTTPS加密等。HTTP模块是Nginx最常用的模块之一,通常用于构建Web服务器或反向代理服务器。
Stream模块: Stream模块用于处理通用TCP和UDP流量。它允许Nginx在传输层(TCP/UDP)上进行代理、负载均衡和流量控制。Stream模块通常用于构建TCP代理、数据库负载均衡、消息队列代理等应用。
HTTP 与 Stream 优劣势
模块 | 优势 | 劣势 | 应用场景 |
HTTP | 处理HTTP请求和响应,适用于Web应用和网站
支持丰富的HTTP功能,如URL重写、反向代理、缓存等 支持HTTP/2、HTTP/3等现代HTTP协议,提供更快的性能 |
不适用于通用TCP/UDP代理和流量控制
不支持非HTTP协议的流量 |
构建Web服务器或反向代理服务器,处理HTTP请求和响应
需要支持Web应用程序的高级功能,如URL路由、重写规则、SSL终端等 需要处理HTTP/2或HTTP/3等现代HTTP协议的应用 |
Stream | 支持通用TCP和UDP代理,适用于多种应用,例如 Socks代理
负载均衡和流量控制功能,可用于数据库、消息队列等场景 可通过一台Nginx服务器代理多个后端服务 |
不支持HTTP特有功能,如URL重写和缓存
不处理应用层数据,只在传输层工作 |
构建通用TCP/UDP Socks代理,用于代理数据库、消息队列等非HTTP应用
需进行负载均衡和流量控制的场景,如数据库负载均衡 需在传输层上处理数据的应用,不需要关心应用层协议 |
应用场景示例
HTTP模块可用于提供静态内容服务(HTML5、图片服务)、动态内容(如PHP、Tomcat)处理、SSL/TLS、大文件下载、API服务等。
Stream模块可用于实现TCP/UDP负载均衡、防火墙规则、代理转发等,例如实现一个简单的TCP负载均衡器。
1、HTTP模块配置(例如nginx.conf中配置一个简单的web服务器):
http { server { listen 80; server_name localhost; location / { root /usr/local/nginx/html; index index.html index.htm; } } }
2、Stream模块配置(例如配置一个简单的TCP负载均衡器):
stream { upstream backend { server backend1.example.com:8080; server backend2.example.com:8090; } server { listen 80; proxy_pass backend; } }
从ISO七层网络模型分析 HTTP 和 Stream
nginx可以实现4层和7层代理,分别对应的是 stream模块 和 http模块。
1、第7层Nginx代理 --http模块
Nginx的http模块一般用于http/https的第7层业务的代理。7层Nginx代理在云平台服务场景中,最常见的应用案例是代理业务系统。与4层代理类似,也分为专有云平台访问互联网业务系统、公有云平台访问客户内网IDC机房的业务系统。与4层代理不同的是,7层代理不仅仅需要对网络包进行代理目标ID和端口的更换,还需要关心域名后缀和参数。通常采用location机制实现域名后缀和参数的识别,进而将反向代理请求转发到不同的目标域名。
2、第4层Nginx代理 --stream模块
Nginx的stream模块一般用于tcp/udp数据流的代理和负载均衡,可以通过stream模块代理转发tcp/udp消息。4层nginx的tcp/udp 代理在云平台服务场景中,最常见的应用案例是代理数据库连接(比如mysql、oracle等数据库):
(1)专有云平台与互联网隔离,需要4层Nginx代理实现云平台产品(比如ECS、DataWorks、DataPhin、DTS等)可以连接到互联网的数据库。
(2)反过来,公有云平台与客户内网IDC机房隔离,需要4层Nginx代理实现云平台产品(比如ECS、DataWorks、DataPhin、DTS等)可以连接到客户内网IDC机房部署的数据库。
本质上,4层Nginx代理在对网络包进行代理目标IP和端口的更换,而不需要关心7层http代理的域名逻辑。
第4层nginx 代理的典型应用场景
1、专有云平台访问互联网数据库
在大型企业网络架构,专有云往往与互联网完全隔离。大型企业往往只有DMZ区域才能与互联网通信,而且还需要在出口防火墙进行进口、出口的限制。
本文以阿里云DataWorks产品举例,其他云产品连接互联网数据库的方案基本相同。下图是笔者在某个专有云企业客户的实现方案:
方案的本质:
利用企业DMZ区(可以通过出口防火墙连接到互联网)服务器搭建nginx,然后将专有云DataWorks连接互联网数据库的请求进行4层IP/TCP反向代理,实现专有云内网产品连接互联网数据库。
Nginx的具体配置:
假设目标数据库是mysql数据库(123.234.165.100:3306),部署nginx的服务器是10.123.250.221,配置监听3306端口。
nginx.conf配置文件的stream模块配置如下:
user nginx; worker_processes 2; # 根据服务器的cpu核数确定 worker_rlimit_nofile 2048; # 根据链接并发度确定 events { worker_connections 2048; # 根据链接并发度确定 } stream { server { listen 3306 so_keepalive=on; # 监听port2端口,并且开启keepalive连接。 proxy_pass 123.234.165.100:3306; # 所有请求IP2:port2的4层网络包都转发到IP1:port1 } } ## http { ## http 7层代理和stream 4层代理是平行关系,可以同时配置实现4层/7层代理。 ## }
2、公有云平台访问企业内网IDC数据库
在某些零售、新零售、新金融、游戏、电商等企业,往往不需要部署专有云,公有云完善的产品体系、简便的运维体系,更适合这类企业。这类企业在内网IDC机房(往往租借运营商的IDC)还部署了内网业务系统。
企业在公有云采购了云产品,比如Maxcompute+DataWorks搭建了大数据系统。需要定时采集内网IDC业务系统的数据库,进行离线、准实时、实时数据分析。虽然企业可以通过拉专线将企业内网IDC与公有云VPC网络打通,但是无法直接将企业内网IDC与公有云厂商经典网络打通(除了ECS、rds等少数产品在公有云VPC网络,大部分云产品都在公有云厂商经典网络,包括大数据类产品)
本文以公有云DataWorks拉取客户内网IDC数据库数据场景为例,对于这类需求,采用以下nginx反向代理方案:
方案本质是利用三个原理:
1)阿里云公有云的经典网络(比如DataWorks产品所在的网络)与VPC网络(ECS虚拟机所在的网络)之间采用tunnal机制,已经打通。因此,DataWorks可以访问ECS。
2)阿里云VPC可以与客户内网IDC采用专线打通。阿里云专线产品、vpn网关这两个产品提供了网络打通的功能。
3)将DataWorks连接的目标数据库IP/port指向ECS IP/port,然后ECS部署的nginx可以将数据库连接反向代理到IDC机房。
Nginx的具体配置:
假设目标数据库是oracle数据库(192.168.250.199:1521),部署nginx的服务器是10.123.250.221,配置监听1521端口。
nginx.conf配置文件的stream模块配置如下:
user nginx; worker_processes 2; # 根据服务器的cpu核数确定 worker_rlimit_nofile 2048; # 根据链接并发度确定 events { worker_connections 2048; # 根据链接并发度确定 } stream { server { listen 1521 so_keepalive=on; # 监听port2端口,并且开启keepalive连接。 proxy_pass 192.168.250.199:1521; # 所有请求IP2:port2的4层网络包都转发到IP1:port1 proxy_timeout 72h; } } ## http { ## http 7层代理和stream 4层代理是平行关系,可以同时配置实现4层/7层代理。 ## }
第7层nginx 代理的典型应用场景
Nginx 7层http代理的典型场景:内网专有云需要访问互联网资源。笔者在客户现场,遇到两个需求:
1)阿里云专有云无法连通互联网,导致ECS虚拟机无法使用yum源部署程序。即使可以在内网搭建yum源,但是由于客户现场使用的操作系统版本特别多(centos、龙蜥操作系统、alios等,而且7.x\8.x等版本众多),依靠搭建内网yum源太麻烦。并且,内网yum源无法与公网yum源实时更新。
2)专有云需要升级,需要从阿里官网下载安装包。安装包特别大(若干TB),手工使用硬盘下载然后传到阿里云内网太麻烦。
3)专有云ECS部署了业务系统(比如OA系统),需要访问业主部门在互联网的官网系统。
针对这些需求,可以使用正向代理软件。但是客户不答应使用正向代理,担心正向代理放大了互联网访问目标范围。希望使用反向代理,针对每一个需求单独配置明确的代理规则,并开启访问日志进行访问审计。
以下是笔者设计的方案:
方案的本质:
利用企业DMZ区域(可以通过出口防火墙连接到互联网)服务器搭建nginx,然后根据访问的目标域名后缀规则,nginx配置不同的location匹配条件,进而代理转发到不同的目标域名。当然,为了实现nginx代理7层目标域名,需要在源端ECS服务器配置本地hosts,使得访问的目标域名被dns解析到DMZ区部署nginx的服务器IP。
假设:
1、DMZ区域服务器的IP地址是 10.123.251.240
2、目标访问域名有三个,分别是:
(1) 阿里云官网yum源:http://mirrors.aliyun.com/anolis*******
(2) 阿里云专有云升级包下载源:http://private-cloud-package.oss-xxxxxxx.com/release*******
(3) 客户官网地址:http://www.xxxx.com.cn/xxxx/index.html
备注:为了实现nginx的7层http代理,在源头ECS服务器必须将目标域名在/etc/hosts文件配置本地dns域名IP解析。也就是将上述的三个域名:mirrors.aliyun.com、private-cloud-package.oss-xxxxxxx.com、www.xxxx.com.cn在ECS的/etc/hosts文件解析成DMZ区的nginx部署服务器IP。这样才能使得源端ECS将目标域名访问请求包发送到nginx,让DMZ区服务器部署的nginx将请求代理转发到外网目标域名。
配置nginx7层代理,通常采用location机制实现域名后缀和参数的识别,进而将反向代理请求转发到不同的目标域名。location非常强大,可以实现以下几种优先级的匹配规则:
1、=:精确匹配
2、^~:最佳匹配
3、~ :正则表达式要区分大小写
4、~* :正则表达式不区分大小写
5、/ 开头:通用匹配
优先级:(location =精确匹配) > (location 完整路径匹配) > (location ^~ 最佳匹配路径) > (location ~,~* 正则匹配) > (location 部分起始路径) > (/)
Nginx的具体配置:
user www; worker_processes auto; # 根据服务器的cpu核数确定 error_log error.log; # 审计error日志目录。需要根据你部署的nginx日志目录配置 pid /run/nginx.pid; # 需要根据你部署的nginx日志目录配置 include /usr/share/nginx/modules/*.conf; # 需要根据你部署的nginx日志目录配置 events { worker_connections 2048; # 根据并发量配置,一般为1024的倍数 } http { 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 /var/log/nginx/access.log main; # 审计error日志目录。需要根据你部署的nginx日志目录配置 ## keepalive_timeout 65; # keepalive的超时时间,建议不配置,采用默认的超时时间 include /etc/nginx/mime.types; # 需要根据你部署的nginx日志目录配置 ## default_type application/octet-stream; server { listen 80; # 自己决定nginx监听的端口 server_name 10.123.251.240; # server_name 配置DMZ区服务器的IP地址 location ^~/release { # location 最佳匹配 /release,用于代理转发到专有云下载地址 proxy_pass http://private-cloud-package.oss-xxxxxxx.com; } location /anolis { # location 通用匹配 /anolis,用于代理转发到龙蜥操作系统的yum源 proxy_pass http://mirrors.aliyun.com; } location =/xxxx/index.html { # location 精确匹配 /xxxx/index.html,用于代理转发到客户官网 proxy_pass http://www.xxxx.com.cn; } ## 配置其他location规则,用于匹配域名后缀,进而proxy_pass转发到相应的目标域名 } }
location由于强大的匹配规则,可以在同一个nginx server配置成百上千的转发规则,实现成百上千的外部域名代理需求。笔者曾经使用1个nginx server配置了五百多个外部域名转发,满足整个企业的外部域名访问需求,并且针对nginx日志开发了审计程序,对每一个内网业务访问外网域名的访问记录实现了安全审计功能。
小结
Nginx 代理功能非常强大,可以实现多种场景下的简单/复杂代理需求的4层TCP/UDP和7层http代理。感兴趣的读者,建议后续在工作中遇到代理转发需求,都考虑使用nginx实现代理转发需求。
参考推荐:
OpenResty = Nginx + Lua 介绍和安装教程
LNMP(CentOS+Nginx+Mysql+PHP)服务器环境配置 (推荐)
Apache 工作的三种模式:Prefork、Worker、Event
Mac 开机启动MySQL/MongoDB/Redis 等服务
Linux 配置 nginx、mysql、php-fpm、redis 开机启动
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2024-07-22 22:12:49
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!