❶ nginx的tcp透明代理设置
目前,接入层access使用nginx作为反向代理。客户端连接nginx打开的5000端口后,nginx通过客户端ip哈希的方式,将客户端的接入请求负载均衡到后台的4个access服务。
使用nginx作为反向代理时,客户端与nginx直连,同时nginx为每一个客户端连接建立了单独的tcp连接到access服务。此时,nginx代理带来的问题是,access无法获取到客户端的真实ip,而只能拿到nginx代理服务所在机器的ip。(所有的代理都有类似的问题,因为与上游服务(例如这里的access服务)连接的实际上是代理服务器,ip包里的ip地址是代理服务器的地址)。
但是,很时候我们需要拿到客户端的真实ip做一些业务上的判断。这个时候,就需要通过某些方式获取客户端的真实ip。如果代理服务器和上游服务之前是通过http通讯,则可以通过http的首部 X-Forwarded-For 将客户端的ip信息传给上游服务(nginx可以很方便的设置该首部设置)。
对于纯tcp代理,则获取客户端ip会麻烦一些。主要有两种方式:
nginx作为上游服务的反向代理时,每个客户端的连接方式如下:
实现透明代理的原理是,nginx使用获取到的客户端ip来建立nginx与上游服务直接的tcp连接。也即:
总共有两台服务器,内网ip地址分别为 172.19.228.32 和 172.19.228.33 。两台机器部署的服务如下:
nginx设置完成并reload配置后,所有从nginx发送到上游服务器的ip数据包将使用客户端的ip地址作为源地址。后续的设置,需要将上游服务器返回的ip数据包(其中的目的地址是客户端的ip)返回到nginx所在的机器,并投递给nginx进程。
32机器上的上游服务返回ip数据包给nginx时,指定的目的ip地址是客户端的ip地址。32机器需要将这些数据返回给nginx进程。
设置完成后,32上的上游服务(端口为15010以及15011)发出的ip数据包,因为被设置了标记而匹配新增的策略路由,所有ip数据被路由到lo网络接口。同时,因为这些数据包中包含的端口是nginx连接上游服务时打开的端口,所以这些数据最终被分用到nginx进程。
这样,nginx和同在一个机器上的上游服务之间的透明代理设置完整。上游服务将可以得到客户端的ip地址,同时可以将数据返回给nginx,nginx再将返回的数据返回给对应的客户端。
此时,如果使用 lsof(1) 命令查看上游服务打开的tcp链接,显示的源ip地址也将是客户端的ip地址。
33上的上游服务与nginx在不同的主机上。主要设置如下:
设置完成后,33可以接收nginx发出的ip数据包,并可以将上游服务回复的ip数据路由给32机上的nginx进程。
同时,使用 lsof(1) 命令查看33的上游服务打开的tcp链接,源ip将是客户端的ip。其他所有的与nginx不在同一个主机上的上游服务都可以参考这个配置设置。
参考:
nginx的透明代理实现
IP Transparency and Direct Server Return with NGINX and NGINX Plus as Transparent Proxy
Linux kernel rp_filter settings
❷ 如何运用Nginx搭建代理服务器
如何实现Nginx的反向代理?
这句话什么意思?
意思是说当客户机来访问服务器的时候,服务器本身并不出面接待,而是将客户的请求转高给手下的子服务器(小弟)负责接待。
比如:你访问www..com,其实并不时网络总服务器接待的你,而是网络的代理服务器接待的你,不过他们的服务是一样的,提供同样的页面;
如是搭建Nginx服务才能实现这样的效果呢?
搭建一个最简单,最基础nginx代理服务器,需要一台代理服务,两台子服务器,XX台客户机来作验证;
操作流程如下:
第一步、服务器和客户机配好IP地址,其中Nginx代理服务器需要配置两张网卡,两个IP地址,一个和客户机通信,一个和子服务器通信;
代理服务器与客户机和子服务器都分别配置同网段IP地址;
例如:
代理服务器:192.168.4.5 192.168.2.5
子服务器 :192.168.2.100 192.168.2.200
客户机 :192.168.4.10
这样配置的好处是: 可以负载均衡,保障用户的访问体验,保障上网速度,同时也保障了,即便有一台服务器坏掉了,另一台服务可以接待用户访问;
第二步、代理服务器上安装Nginx服务软件,两台子服务器上安装HTTPD服务并写入相应的网页,然后启动服务;
yum -y install httpd ##安装httpd服务;
echo "罗贵" > /var/www/html/index.html ##写一个简单的网页
./configure --user=nginx --group=nginx --with-http_ssl_mole
make && make install ##编译安装Nginx
第三步、修改Nginx的配置文件;
vim /usr /local /nginx /conf /nginx.conf
http { ............... ##在文件中找到http开头的行,并在http下面随意找两行添加下面两行的内容;
upstream luogui { ##luogui是集答纳历群名字,可以自由定义,upstream 上游的意思;翻译过来就是在上游建立一个名字为luogui的集群,集群中包含下述IP地址茄升;
server 192.168.2.100:80;
server 192.168.2.200:80;
}
server {
listen 80;
server_name www.luogui.com; ##域名,可以自由定义;
location ^/.php$ { ##匹配清搜网页地址的意思,匹配以 / 开头.php结尾的网页文件;
proxy_pass http://luogui; ##通过proxy代理服务器将用户的请求转发给luogui集群服务器;(注:优先级最高,系统会优先处理这条命令)
}
}
第四步、测试效果;
firefox http://192.168.4.5 或者 本地测试 curl http://192.168.4.5
结果应该是暂停任何一台子服务器,客户机访问网页都没有问题;
以上.......
(EDN)
祝:开心!
罗贵
2019-04-05于深圳
❸ Nginx 最全操作——nginx反向代理(5)
将 NGINX 配置为 HTTP 和其他协议的反向代理,支持修改请求标头和微调的响应缓冲。
本文介绍代理服务器的基本配置。您将学习如何通过不同的协议将请求从 NGINX 传递到代理服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应的缓冲。
代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。
当 NGINX 代理请求时,它会将请求发送到指定的代理服务器,获取响应,然后将请求发送回客户端。可以使用指定的协议将请求代理到 HTTP 服务器(另一个 NGINX 服务器或任何其他服务器)或非 HTTP 服务器(可以运行使用特定框架开发的应用程序,例如 PHP 或 Python)。支持的协议包括FastCGI、uwsgi、SCGI和memcached。
要将请求传递给 HTTP 代理服务器,需要在location中指定proxy_pass指令。例如:
此示例配置导致将在此位置处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或者 IP 地址。该地址还可能包括一个端口:
注意,在上面的第一个例子中,代理的服务器的地址后面是一个URI, /link/ 。如果 URI 与地址一起指定,它将替换请求 URI 中与 location 参数匹配的部分。例如,这里带有 /some/path/page.html URI的请求将被代理到 http://www.example.com/link/page.html . 如果指定的地址没有问题 URI,或者无法确定要替换的 URI 部分,则传递完整的请求 URI(可能已修改)。
要将请求传递给非 HTTP 代理服务器, **_pass 应使用适当的指令:
请注意,在这些情况下,指定地址的规则可能不同。您可能还需要将其他参数传递给服务器(有关详细信息,请参阅参考文档)。
proxy_pass指令也可以指向一组命名的服务器。在这种情况下,请求根据指定的方法在组中的服务器之间分发。
默认情况下,NGINX 重新定义代理请求中的两个 header 字段,“Host”和“Connection”,并消除值为空字符串的 header 字段。“Host”设置为 $proxy_host 变量,“Connection”设置为 close 。
要更改这些设置以及修改其他标头字段,请使用proxy_set_header指令。该指令可以在某个位置或更高位置指定。它也可以在特定的服务器上下文或http块中指定。例如:
在此配置中,“主机”字段设置为$host变量。
要防止标头字段被传递到代理服务器,请将其设置为空字符串,如下所示:
默认情况下,NGINX 缓冲来自代理服务器的响应。响应存储在内部缓冲区中,并且在收到整个响应之前不会发送到客户端。缓冲有助于优化慢速客户端的性能,如果响应从 NGINX 同步传递到客户端,这可能会浪费代理服务器的时间。但是,当启用缓冲时,NGINX 允许代理服务器快速处理响应,而 NGINX 存储响应的时间与客户端下载它们所需的时间一样长。
负责启用和禁用缓冲的指令是proxy_buffering。默认情况下,它设置为 on 并启用缓冲器。
该proxy_buffers指令控制规模和分配的请求缓冲区的数目。来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由proxy_buffer_size指令设置。这部分通常包含一个相对较小的响应头,并且可以做得比其余响应的缓冲区小。
在以下示例中,缓冲区的默认数量增加了,并且响应的第一部分的缓冲区大小小于默认值。
如果禁用缓冲,则在从代理服务器接收响应的同时将响应同步发送到客户端。对于需要尽快开始接收响应的快速交互客户端,此行为可能是可取的。
要在特定位置禁用缓冲,请将proxy_buffering指令放在带有参数的位置 off ,如下所示:
在这种情况下,NGINX 仅使用proxy_buffer_size配置的缓冲区来存储响应的当前部分。
反向代理的一个常见用途是提供负载平衡。阅读免费的选择软件负载均衡器的五个理由电子书,了解如何通过快速部署来提高功能、性能和专注于您的应用程序。
如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源 IP 地址连接到代理服务器或上游。如果 NGINX 后面的代理服务器配置为接受来自特定 IP 网络或 IP 地址范围的连接,这可能很有用。
指定proxy_bind指令和必要网络接口的 IP 地址:
IP 地址也可以用变量指定。例如, $server_addr 变量传递接受请求的网络接口的 IP 地址:
简单来说,把网络首页代理到/test路径,同时把java代理到/testapi,配置如下:
参考链接:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
欢迎大家提出不一样的观点,我们一起讨论,
我是辣个男人,一个运维人。