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

三、环境准备
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前端应用服务器


连接成功了,没问题。