还要记 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 总代理”?
+---------------------+
| 用户浏览器 |
+----------+----------+
|
| 访问 *.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 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
