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前端应用服务器


连接成功了,没问题。

相关推荐
Je1lyfish1 小时前
CMU15-445 (2025 Fall/2026 Spring) Project#3 - QueryExecution
linux·c语言·开发语言·数据结构·数据库·c++·算法
m0_596749093 小时前
如何防止SQL拼接漏洞_使用PDO对象实现安全的SQL交互
jvm·数据库·python
老纪的技术唠嗑局3 小时前
深度解析 LLM Wiki / Obsidian-Wiki / GBrain:Agent 时代知识的“自组织”与“自进化”
大数据·数据库·人工智能·算法
2301_795099746 小时前
golang如何在Gin中自定义验证器_golang Gin自定义验证器实现方法
jvm·数据库·python
2301_766283446 小时前
如何在MongoDB GridFS中进行按文件大小(length)范围的查询
jvm·数据库·python
萧曵 丶7 小时前
MySQL 高频面试题(由浅到深 完整版,面试必背)
数据库·mysql·面试
czlczl200209257 小时前
MySQL 执行引擎:排序与临时表机制深度解析
数据库·mysql
lifewange7 小时前
DBeaver如何安装
数据库
m0_631529827 小时前
CSS如何利用CSS变量进行渐变色管理_提升渐变配置的灵活性
jvm·数据库·python