nginx中怎么配置使用proxy protocol协议
proxy protocol在nginx中应用
我们知道nginx是一个web服务器和代理服务器,它一般工作在proxy server或者负载均衡软件(Haproxy,Amazon Elastic Load Balancer (ELB)的后面。
首先,客户端向代理服务器或负载均衡软件发起请求,然后请求会被转发到nginx进行实际的web访问。
因为经过了多层软件,所以客户端的一些信息比如ip地址,端口号等可能就会被隐藏,这对于我们问题分析,数据统计都是不利的。我们希望获得客户端真实的IP地址,以便获取准确的请求环境。
这种情况下就需要用到PROXY protocol了。
如果前面所说的proxy或者LSB都实现了PROXY protocol协议的话,不管是HTTP, SSL, HTTP/2, SPDY, WebSocket 还是 TCP协议,nginx都可以拿到客户端的原始IP地址,从而根据原始IP地址进行一些特殊的操作,比如屏蔽恶意IP的访问,根据IP不同展示不同的语言或者页面,或者更加简单的日志记录和统计等,都非常有效。
当然,如果想要支持PROXY protocol,对nginx的版本也是有要求的,具体版本需求如下:
想要支持PROXY protocol v2,需要NGINX Plus R16或者NGINX Open Source 1.13.11。
想要支持ROXY protocol for HTTP,需要NGINX Plus R3或者NGINX Open Source 1.5.12。
想要支持TCP client‑side PROXY protocol,需要NGINX Plus R7或者 NGINX Open Source 1.9.3。
想要支持PROXY protocol for TCP,需要NGINX Plus R11 或者 NGINX Open Source 1.11.4。
在nginx中可以通过下面的变量来获得对应的客户端信息,具体而言如下所示:
$proxy_protocol_addr和$proxy_protocol_port 分别表示的是原始客户端的IP地址和端口号。
$remote_addr 和 $remote_port表示的是load balancer的的IP地址和端口。
如果你使用了RealIP扩展模块,那么这个模块会重写$remote_addr 和 $remote_port这两个值,将其替换成原始客户端的IP地址和端口号。
然后使用$realip_remote_addr 和 $realip_remote_port来表示load balancer的的IP地址和端口。
在RealIP扩展模块中,$proxy_protocol_addr和$proxy_protocol_port 表示的含义不变,还是原始客户端的IP地址和端口号。
在nginx中配置使用proxy protocol
上面我们提到了nginx中proxy protocol的基本应用,下面来讲一下如何在nginx中进行具体的配置。
在nginx中启用proxy protocol
如果你的nginx已经是支持proxy protocol的版本,那么启用proxy protocol非常简单,只需要在server中的listen中添加proxy_protocol即可,如下所示:
http { #... server { listen 80 proxy_protocol; listen 443 ssl proxy_protocol; #... } } stream { #... server { listen 112233 proxy_protocol; #... } }
大家比较熟悉的是http block,在nginx中,它表示对http/https的支持。Nginx提供了对TCP/UDP协议的支持,这一功能通过stream模块实现,对很多人来说比较陌生。
通过上面的配置,nginx可以实现在tcp/udp协议和http/https协议同时支持proxy protocol。
使用Real‑IP modules
Real‑IP modules是nginx自带的一个模块,可以通过下面的命令来查看nginx是否有安装real-ip模块:
nginx -V 2>&1 | grep -- 'http_realip_module' nginx -V 2>&1 | grep -- 'stream_realip_module'
如果你当前使用的版本没有real ip,也不要急,这时候你可能需要从源代码进行编译。
在编译的过程中,我们需要执行一个configure命令,在这个configure命令中可以指定要开启的功能,比如stream或者http_ssl_module:
$ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.44 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-stream --with-mail
如果要开启real-ip功能,则可以添加:
--with-http_realip_module
如果nginx是运行在SLB或者proxy之后的,那么可以通过set_real_ip_from命令来指定代理或者负载均衡服务器的IP范围,如下所示:
server { #... set_real_ip_from 192.168.1.0/24; #... }
然后我们需要将proxy或者SLB的IP地址替换成为真实客户端的地址,那么可以这样使用:
http { server { #... real_ip_header proxy_protocol; } }
请求转发
不管是http还是stream block,都可能遇到请求向后续的upstream进行转发的情况,对于upstream来说,他们希望收到的是真实客户端IP地址,而不是proxy或者slb的地址,那么可以通过下面的设置来解决:
http { proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_protocol_addr; }
stream { server { listen 12345; proxy_pass example.com:12345; proxy_protocol on; } }
http和stream的设置方式是不同的。
日志记录
日志是一个非常重要的功能,对于定位问题,执行数据统计分析都非常有用,当然我们需要的是真实的客户端IP地址。
我们可以通过使用变量$proxy_protocol_addr在http和stream block中记录对应的日志,如下所示:
http { #... log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; }
stream { #... log_format basic '$proxy_protocol_addr - $remote_user [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time'; }
以上是nginx中怎么配置使用proxy protocol协议的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

在 Linux 中启动 Nginx 的步骤:检查 Nginx 是否已安装。使用 systemctl start nginx 启动 Nginx 服务。使用 systemctl enable nginx 启用在系统启动时自动启动 Nginx。使用 systemctl status nginx 验证启动是否成功。在 Web 浏览器中访问 http://localhost 查看默认欢迎页面。

如何在 Windows 中配置 Nginx?安装 Nginx 并创建虚拟主机配置。修改主配置文件并包含虚拟主机配置。启动或重新加载 Nginx。测试配置并查看网站。选择性启用 SSL 并配置 SSL 证书。选择性设置防火墙允许 80 和 443 端口流量。

启动 Nginx 服务器需要按照不同操作系统采取不同的步骤:Linux/Unix 系统:安装 Nginx 软件包(例如使用 apt-get 或 yum)。使用 systemctl 启动 Nginx 服务(例如 sudo systemctl start nginx)。Windows 系统:下载并安装 Windows 二进制文件。使用 nginx.exe 可执行文件启动 Nginx(例如 nginx.exe -c conf\nginx.conf)。无论使用哪种操作系统,您都可以通过访问服务器 IP

确认 Nginx 是否启动的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 检查端口 80 是否开放;3. 查看系统日志中 Nginx 启动消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

问题的答案:304 Not Modified 错误表示浏览器已缓存客户端请求的最新资源版本。解决方案:1. 清除浏览器缓存;2. 禁用浏览器缓存;3. 配置 Nginx 允许客户端缓存;4. 检查文件权限;5. 检查文件哈希;6. 禁用 CDN 或反向代理缓存;7. 重启 Nginx。

在 Linux 中,使用以下命令检查 Nginx 是否已启动:systemctl status nginx根据命令输出进行判断:如果显示 "Active: active (running)",则 Nginx 已启动。如果显示 "Active: inactive (dead)",则 Nginx 已停止。

服务器无权访问所请求的资源,导致 nginx 403 错误。解决方法包括:检查文件权限。检查 .htaccess 配置。检查 nginx 配置。配置 SELinux 权限。检查防火墙规则。排除其他原因,如浏览器问题、服务器故障或其他可能的错误。

如何解决 Nginx 403 Forbidden 错误?检查文件或目录权限;2. 检查 .htaccess 文件;3. 检查 Nginx 配置文件;4. 重启 Nginx。其他可能原因还包括防火墙规则、SELinux 设置或应用程序问题。
