×

用 Nginx 容器当“总代理”,统一管理所有内部应用!

hqy hqy 发表于2025-11-02 02:24:08 浏览4 评论0

抢沙发发表评论

还要记 IP?还要开防火墙?太乱了!”

别慌!今天教你一招:

用一个 Nginx 容器作为“统一入口网关”,

让所有应用都藏在内网,

对外只暴露 80/443,通过域名自动路由!

就像这样:

用户访问 →nginx-proxy(80/443) → 根据域名转发到内部服务
├─→www.xlsys.cn→WordPress博客
├─→***.xlsys.cn→ DDNS-GO
├─→***.xlsys.cn→ Uptime Kuma
├─→***.xlsys.cn→ Grafana
└─→notes.xlsys.cn→TriliumNotes

所有应用“隐身”内网,安全又整洁!

? 为什么你需要一个“Nginx 总代理”?

问题
传统做法
我的 Nginx 网关方案
多端口暴露
开 8080、3001、3002、9876……防火墙混乱
只暴露 80/443,其余全封闭
用户体验差
要记 IP + 端口,分享不方便
访问 www.xlsys.cn 即可,专业又易记
HTTPS 配置重复
每个服务都要申请证书
Nginx 统一管理 SSL,后端走内网 HTTP
服务直接暴露
容器端口可被扫描攻击
服务只连内网,不对外暴露

+---------------------+
|     用户浏览器       |
+----------+----------+
           |
           | 访问 *.xlsys.cn
           |
+----------v----------+
|   nginx-proxy 容器   | ← 只暴露 80/443
+----------+----------+
           |
           | 内部 Docker 网络 (secure-net)
           |
   +-------+--------+--------+--------+--------+
   |                |                |          |
+--v--+          +--v--+          +--v--+     +--v--+
|博客 |          |DDNS |          |监控 |     |笔记 |
|容器 |          |容器 |          |容器 |     |容器 |
+-----+          +-----+          +-----+     +-----+

✅ 所有应用容器不暴露端口到宿主机

✅ 只允许 Nginx 容器访问它们

✅ 用户只能通过 Nginx 访问服务

? 一键部署:docker-compose.yml

以下是参考 docker-compose.yml 模板,需要修改!

 

# Docker Compose 配置文件版本
version: '3.8'

# 自定义网络定义:创建一个名为 secure-net 的内部桥接网络

# 所有加入此网络的服务可通过服务名互相通信(如 wordpress 访问 mysql)

# 实现服务间安全隔离与通信,避免使用默认 bridge 网络

networks:
  secure-net:
    driver: bridge  # 使用 Docker 内置的 bridge 驱动

# 定义所有容器服务

services:

  # ——————————————————————
  # 服务 1:Nginx 反向代理网关
  # 作为所有 Web 服务的统一入口,处理 HTTP/HTTPS 流量
  # ——————————————————————
  nginx-proxy:
    image: nginx:alpine                    # 使用轻量级 Nginx Alpine 镜像
    container_name: nginx-proxy            # 容器名称
    ports:
      - "80:80"                            # 映射宿主机80端口 → 容器80(HTTP)
      - "443:443"                          # 映射宿主机443端口 → 容器443(HTTPS)
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d  # 挂载自定义 Nginx 配置文件
      - ./nginx/certs:/etc/nginx/certs    # 挂载 SSL 证书目录
      - ./nginx/logs:/var/log/nginx       # 挂载日志目录,便于排查问题
    networks:
      - secure-net                         # 加入自定义网络,可访问其他内部服务
    restart: unless-stopped               # 宿主机重启后自动启动,除非手动停止

  # ——————————————————————
  # 服务 2:WordPress 博客系统
  # 基于 PHP 8.2 + Apache,用于小柳实验室博客
  # ——————————————————————
  wordpress:
    image: wordpress:php8.2-apache         # 使用官方 WordPress 镜像(PHP 8.2)
    container_name: wordpress
    environment:
      WORDPRESS_DB_HOST: mysql             # 指定数据库地址(服务名)
      WORDPRESS_DB_USER: wpuser            # 数据库用户名
      WORDPRESS_DB_PASSWORD: wppass123     # 数据库密码(建议使用 .env 文件加密)
      WORDPRESS_DB_NAME: wpdb              # 使用的数据库名
    volumes:
      - wordpress_data:/var/www/html       # 持久化 WordPress 文件(主题、插件、上传等)
    networks:
      - secure-net
    restart: unless-stopped
    depends_on:
      - mysql                              # 确保 MySQL 启动后再启动 WordPress

  # ——————————————————————
  # 服务 3:MariaDB 数据库
  # 作为 WordPress 的后端数据库
  # ——————————————————————
  mysql:
    image: mariadb:10.6                    # 使用 MariaDB 10.6(MySQL 兼容)
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpass123     # root 用户密码(建议加强)
      MYSQL_DATABASE: wpdb                 # 自动创建数据库 wpdb
      MYSQL_USER: wpuser                   # 创建普通用户 wpuser
      MYSQL_PASSWORD: wppass123            # 用户密码
    volumes:
      - mysql_data:/var/lib/mysql          # 持久化数据库数据
    networks:
      - secure-net
    restart: unless-stopped

  # ——————————————————————
  # 服务 4:DDNS-GO 动态域名解析
  # 自动更新公网 IP 到域名服务商(如阿里云、腾讯云)
  # 原使用 host 模式,现改为 bridge + 端口映射,更安全可控
  # ——————————————————————
  ddns-go:
    image: jeessy/ddns-go                  # DDNS-GO 官方镜像
    container_name: ddns-go
    ports:
      - "9876:9876"                        # 映射 Web 管理界面端口(http://ip:9876)
    networks:
      - secure-net                         # 加入内部网络(如需访问其他服务)
    volumes:
      - ./ddns-go:/root                    # 持久化配置文件(保存在宿主机)
    environment:
      - PUID=1000                          # 指定运行用户 ID(Linux 用户权限)
      - PGID=1000                          # 指定运行组 ID
    restart: unless-stopped
    # 注意:若需监听所有网络接口或获取真实公网 IP,可考虑 host 模式
    # 当前 bridge 模式已满足大多数场景,更安全

  # ——————————————————————
  # 服务 5:Grafana 可视化监控面板
  # 展示 Prometheus、MySQL 等指标数据
  # ——————————————————————
  grafana:
    image: grafana/grafana:latest          # 使用最新稳定版 Grafana
    container_name: grafana
    ports:
      - "3000"                             # 仅在内部暴露,由 Nginx 反向代理访问
    networks:
      - secure-net
    volumes:
      - grafana_data:/var/lib/grafana      # 持久化仪表盘、用户、配置
      - ./grafana/provisioning:/etc/grafana/provisioning  # 自动加载数据源/面板配置
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=yourpassword    # 管理员密码(请修改为强密码!)
      - GF_USERS_ALLOW_SIGN_UP=false               # 禁用用户自助注册
    restart: unless-stopped

  # ——————————————————————
  # 服务 6:Uptime Kuma 服务健康监测
  # 监控网站、API、服务是否在线,支持 Ping、HTTP、TCP 等探测
  # ——————————————————————
  uptime-kuma:
    image: louislam/uptime-kuma:1          # 使用 v1 稳定版
    container_name: uptime-kuma
    ports:
      - "3001"                             # 内部端口,由 Nginx 代理访问
    networks:
      - secure-net
    volumes:
      - uptime_kuma_data:/app/data         # 持久化监测记录、配置
    restart: unless-stopped

  # ——————————————————————
  # 服务 7:Trilium Notes 知识库笔记系统
  # 支持树状笔记、加密、同步,适合个人知识管理
  # ——————————————————————
  trilium:
    image: zadam/trilium:latest            # 最新稳定版 Trilium
    container_name: trilium
    ports:
      - "8080"                             # 内部端口,通过 Nginx 代理访问
    networks:
      - secure-net
    volumes:
      - trilium_data:/home/node/trilium-data  # 持久化笔记数据
    environment:
      - TRILIUM_PORT=8080                  # 指定容器内运行端口
    restart: unless-stopped

# ——————————————————————

# 数据卷定义(持久化存储)

# 所有数据卷由 Docker 管理,避免容器删除后数据丢失

# ——————————————————————

volumes:
  wordpress_data:    # 存放 WordPress 文件(wp-content 等)
  mysql_
data:        # 存放 MariaDB 数据库文件
  grafana_data:      # 存放 Grafana 数据(仪表盘、用户等)
  uptime_
kuma_data:  # 存放 Uptime Kuma 的监测数据
  trilium_
data:      # 存放 Trilium 的笔记数据

 

? Nginx 配置文件(按子域名路由)

在 ./nginx/conf.d/ 目录下创建以下配置:
blog.conf(小柳实验室博客)

server {
    listen 80;
    server_name www.xlsys.cn;

    location / {
        proxy_pass http://wordpress;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

ddns.conf(DDNS-GO)

server {
    listen 80;
    server_name ***.xlsys.cn;

    location / {
        proxy_pass http://localhost:9876;  # DDNS-GO 默认端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

monitor.conf(Uptime Kuma)

server {
    listen 80;
    server_name ***.xlsys.cn;

    location / {
        proxy_pass http://uptime-kuma:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_xforwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

metrics.conf(Grafana)

server {
    listen 80;
    server_name ***.xlsys.cn;

    location / {
        proxy_pass http://grafana:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_xforwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

note.conf(Trilium Notes)

server {
    listen 80;
    server_name ***.xlsys.cn;

    location / {
        proxy_pass http://trilium:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_xforwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

? 安全建议

启用 HTTPS:使用 acme.sh 或 Certbot 为每个子域申请免费证书
限制访问:如 lab.xlsys.cn 可加 IP 白名单
日志审计: 定期检查 /opt/nginx-proxy/logs/access.log
备份数据卷: wordpress_data、trilium_data 等关键数据定期备份

? 我的实际效果

✅ 所有服务通过 *.xlsys.cn 统一访问,专业感拉满
✅ 对外只开 80/443,其他端口全封闭,安全等级提升
✅ 新增服务只需加一个 .conf 文件,运维成本极低
✅ 便于后续接入 WAF、CDN、HTTPS 全站加密

图片
图片

? 写在最后

Nginx 不只是反向代理,更是你的“应用总控台”。

把它放在最前面,

让所有应用“藏”在后面,

既安全,又优雅。

建议每个团队都部署一个“Nginx 网关容器”,作为所有内部服务的统一入口。


打赏

本文链接:https://kinber.cn/post/5810.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客