如果PostgreSQL有两层nginx代理...

Posted 西风未眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果PostgreSQL有两层nginx代理...相关的知识,希望对你有一定的参考价值。

前言

微信公众号“SRE成长记”可查看原文

PostgreSQL默认只能本机连接,若要在别的客户端远程连接pgsql,则需要修改配置文件pg_hba.conf,添加IPv4白名单。

如果在某些场景下,pgsql前面有两层nginx做代理,IPv4白名单该怎么配置呢?pg数据库获取的clientIP分别又是什么呢?

模拟实验环境规划

准备4台服务器和本地Windows电脑pgAdmin工具,分配如下:

实验环境搭建

  1. 在10.0.0.66和10.0.0.102服务器分别搭建postgresql应用,搭建步骤可参考《PostgreSQL学习之部署与简单使用》

  2. 10.0.0.64和10.0.0.65服务器分别安装nginx。并修改nginx配置文件nginx.conf如下:
    10.0.0.64服务器修改nginx.conf,添加如下配置(注意:stream和http是同级的,即stream不要放在http中):
    #代理pgsql数据库
    stream 
    upstream pgsql 
        server 10.0.0.65:5432;
    
    server 
        listen 5432;
        proxy_connect_timeout 30s;
        proxy_timeout 30s;
        proxy_pass pgsql;
    

10.0.0.65服务器修改nginx.conf,添加如下配置(注意:stream和http是同级的,即stream不要放在http中):

#代理pgsql数据库
stream 
   upstream pgsql 
        server 10.0.0.66:5432;
   
    server 
        listen 5432;
        proxy_connect_timeout 30s;
        proxy_timeout 30s;
        proxy_pass pgsql;
    
  1. 本地Windows电脑安装pgAdmin工具。

场景实验

实验分三个场景做测试:
场景一:客户端只能通过两层nginx做代理转发,连接postgresql;
场景二:客户端绕开nginx代理,直连pgsql数据库;
场景三:客户端可走nginx代理,也可直连pg数据库;

场景一:客户端只能通过nginx代理连接数据库

pg_hba.conf文件中IPv4白名单配置:

此种场景,白名单只配置任意一台nginx代理的IP,不配置客户端IP,重启pgsql:

host    all             all             10.0.0.65/24             md5
#或者:
#host    all             all             10.0.0.64/24             md5

测试结果:

在服务器客户端102和Windows客户端pgAdmin工具,均可通过nginx代理正常访问PG数据库。在配置任一nginxIP白名单情况下,无论是通过nginx-64或者nginx-65连接PG数据库均可。
此时PG数据库通过pgAdmin工具可以直观看到,只要是走nginx代理过来的连接,数据库接收到的clientIP均为第二层nginx的IP地址(也可以在postgresql数据库本身通过命令行 select * from pg_stat_activity; 查看)。
如下图,在client列中看到两个10.0.0.65的客户端连接,分别是Windows客户端通过pgAdmin和服务器客户端102通过命令行psql -h 10.0.0.64 -p5432连接进来的(最后一行IP为空白的记录是因为在pg数据库本身是登录状态)。

场景二:客户端绕开nginx代理,直连pgsql数据库

pg_hba.conf文件中IPv4白名单配置:

此种场景,则可只配置客户端IP,不配置2台nginx代理的IP,重启pgsql:

host    all             all             192.168.0.36/24             md5
host    all             all             10.0.0.102/24             md5

测试结果:

通过nginx代理已无法进入pg数据库。

客户端102和Windows客户端均绕开2台nginx代理服务器,直连pgsql。此时pgsql接收的客户端IP显示为真实的客户端IP:

场景三:客户端可走nginx代理,也可直连pg数据库

pg_hba.conf文件中IPv4白名单配置:

此种场景,可配置服务器IP网段+两台nginxIP,也可以放开所有IP访问权限,重启pgsql:

host    all             all             0.0.0.0/0               md5

测试结果:

服务器客户端102和Windows客户端pgAdmin能通过nginx代理正常连接pgsql,也能绕过nginx直连pgsql。

pg数据库获取的clientIP则为场景一和场景二的结合体:通过nginx代理访问的,clientIP为nginx-65的IP;直连的,clientIP为客户端真实IP:

实验结论

经过实验,结论如下图:

::: hljs-right

(全文完)

:::

以上是关于如果PostgreSQL有两层nginx代理...的主要内容,如果未能解决你的问题,请参考以下文章

Nginx多层反向代理透传客户端真实IP

kubernetes k8s nginx ingress 多层代理后的诡异问题

Ember js @each 深一层,但我有两层深的关系[重复]

Nginx学习笔记22TCP代理

nginx代理简单配置实现修改网站域名

nginx常用配置系列-反向代理