Nginx服务器代理Postgresql-16后端数据库

一、应用场景

公司网络划分为办公区服务器区两大网络域。依据企业网络安全规范,数据库服务器严禁直接被办公网终端访问。因此采用应用服务器前置代理架构,由前端应用服务器作为中间层转发请求,办公网开发人员仅通过应用服务间接调试访问后端数据库,既满足开发调试需求,又严格遵循网络隔离安全策略。

二、结构拓扑

三、环境准备

windows11+virtualbox(虚拟两台服务器)

角色 IP地址 类型 备注
Nginx前端应用服务器 192.168.140.8、172.16.10.10 rocky9.5 安装nginx、必须带 stream 模块
Postgresql后端数据库服务器 172.16.10.9 rocky 9.5 安装postgresql-16
办公终端 192.168.140.1 winodws11 安装DBeaver 26

四、实验过程

(一) Postgresql-16数据库服务器配置文件调整

PostgreSQL 16 安装后安全加固:默认禁止所有外部 IP 访问(仅本机可用),所以我们需要修改数据库配置,修改这postgresql.conf 和pg_hba.conf这两个配置文件。

配置文件 用途
postgresql.conf 数据库服务的全局核心配置,包含端口、监听地址、内存、日志等所有服务级参数
pg_hba.conf 控制哪些主机、用户、数据库可以连接到 PostgreSQL,以及使用什么认证方式(信任 / 密码 / MD5 等)

1、修改postgresql.conf 为如下内容

bash 复制代码
listen_addresses = '172.16.10.9' #数据库服务仅绑定并监听这一个内网 IP 地址

2、在pg_hba.conf文件末尾追加如下内容

bash 复制代码
host    all  all  172.16.10.10/32  scram-sha-256  #添加白名单,仅允许 172.16.10.10(nginx前端应用服务器)可以连接数据库

3、修改完后要重启服务,生效。

bash 复制代码
systemctl restart postgresql-16

(二)nginx前端应用服务器配置文件调整

在开启 SELinux 的环境中,Nginx 无法直接监听非标准端口(如 18081),这是因为 SELinux 对 HTTP 服务端口做了白名单限制。通过 semanage port 命令将自定义端口 18081 添加到 http_port_t 策略中,即可让 Nginx 获得监听权限,既保证系统安全,又满足自定义端口代理需求。我这里是实验环境,所以直接关闭了selinux。

1、修改/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled

2、修改/etc/nginx/nginx.conf配置文件

bash 复制代码
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

# ================= 新增stream模块,TCP 代理 PostgreSQL(正确位置)=================

stream {
    upstream pgsql_backend {
        server 172.16.10.9:5432 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 18081;
        proxy_pass pgsql_backend;
        proxy_connect_timeout 5s;
        proxy_timeout 300s;
    }
}
# ================================================================
#我这里注释掉了http模块,因为我这里用不到。
#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;
#
#    sendfile            on;
#    tcp_nopush          on;
#    tcp_nodelay         on;
#    keepalive_timeout   65;
#    types_hash_max_size 4096;
#
#    include             /etc/nginx/mime.types;
#    default_type        application/octet-stream;
#
#    include /etc/nginx/conf.d/*.conf;
#
#    server {
#        listen       80;
#        listen       [::]:80;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#        location = /404.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }
#}

(三)使用DBeaver 工具连接nignx前端应用服务器


连接成功了,没问题。

相关推荐
三8448 小时前
redis防御加固与安全基线
数据库·redis·安全·应急响应·防御
lhldsg8 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
SendTomo8 小时前
【技术交流】从0到1构建一个汉字学习平台:汉字吧(hanzi8.com)的技术架构猜想
redis·mysql·nginx·php·个人开发
IT大白鼠9 小时前
MySQL 分布式集群系列 · 第四篇——实操部署指南:从零搭建生产级 MySQL NDB 集群
数据库·分布式·mysql
IT大白鼠9 小时前
MySQL 分布式集群系列 · 第三篇——核心原理精讲:NDB 自动分片、多主写入与数据同步
数据库·分布式·mysql
Elastic 中国社区官方博客9 小时前
教程:使用 ES|QL 进行威胁狩猎
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·安全威胁分析
斑马13911 小时前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
初願致夕霞11 小时前
MySQL_索引
数据库·mysql
十六年开源服务商11 小时前
2026网站备份方案完整指南
数据库·oracle