天天看點

如果PostgreSQL有兩層nginx代理...

前言

微信公衆号“SRE成長記”可檢視原文

PostgreSQL預設隻能本機連接配接,若要在别的用戶端遠端連接配接pgsql,則需要修改配置檔案pg_hba.conf,添加IPv4白名單。

如果在某些場景下,pgsql前面有兩層nginx做代理,IPv4白名單該怎麼配置呢?pg資料庫擷取的clientIP分别又是什麼呢?

如果PostgreSQL有兩層nginx代理...

模拟實驗環境規劃

準備4台伺服器和本地Windows電腦pgAdmin工具,配置設定如下:

如果PostgreSQL有兩層nginx代理...

實驗環境搭建

  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工具。
如果PostgreSQL有兩層nginx代理...

場景實驗

實驗分三個場景做測試:

場景一:用戶端隻能通過兩層nginx做代理轉發,連接配接postgresql;

場景二:用戶端繞開nginx代理,直連pgsql資料庫;

場景三:用戶端可走nginx代理,也可直連pg資料庫;

如果PostgreSQL有兩層nginx代理...

場景一:用戶端隻能通過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資料庫本身是登入狀态)。

如果PostgreSQL有兩層nginx代理...

場景二:用戶端繞開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:

如果PostgreSQL有兩層nginx代理...

場景三:用戶端可走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:

如果PostgreSQL有兩層nginx代理...

實驗結論

經過實驗,結論如下圖:

如果PostgreSQL有兩層nginx代理...

::: hljs-right

(全文完)

:::