这是「把自己部署到互联网上」系列的第 21 篇。
上一篇讲了 Docker 和 Docker Compose 的分工。Docker 负责单个服务的打包、运行和隔离,Compose 负责一组服务的启动、连接和管理。到这里,我的博客部署方向已经明确:
项目尽量用 Docker 管理,多服务用 Compose 编排,数据库不直接暴露公网,外部入口集中在 80 和 443。
那么问题就来了:
- Nginx 到底装在系统里,还是放进 Docker 容器?
- 如果每一个项目都起一个NGINX 容器,起多了对服务器有什么影响?
Nginx 到底装在系统里,还是放进 Docker 容器
这是个很好的问题。Nginx 可以系统安装,也可以容器安装,没有绝对对错。关键看想要哪种运维方式。
系统安装 Nginx,是因为它更适合作为“服务器入口网关”。接收请求,匹配域名和站点,反向代理到内部服务,处理 HTTPS 证书和 HTTP 到 HTTPS 跳转。如果现在部署博客,后面还要部署官网、作品站和其他项目,Nginx 的位置会影响整个流量入口设计。
先看第一种方式:把 Nginx 安装在系统里。
在 Ubuntu 上,通常是:
sudo apt update
sudo apt install nginx
安装后,Nginx 作为系统服务运行:
sudo systemctl status nginx
sudo systemctl reload nginx
sudo nginx -t
配置通常在 /etc/nginx/,站点配置可能放在 /etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/。
系统安装的优点很明显。
- 它直接、成熟,资料多,和 systemd 集成好,开机自启、重载、语法检查都清楚。
- 日志路径、证书部署、站点配置也有大量现成教程。
- 对于单台服务器、少量项目,这是一种稳定方案。
- 应用容器重建不影响入口层。某个项目 docker compose down/up,不会把所有站点入口一起停掉。
它的问题在于,配置体系会和 Docker 项目分开。比如博客项目在一个目录,数据库和应用由 Compose 管理,Nginx 配置在 /etc/nginx/,证书在另一个目录。它能维护,但关系需要自己记清楚。迁移服务器时,也要额外恢复系统 Nginx 配置、证书路径、站点启用关系和服务状态。
如果后面项目变多,系统 Nginx 配置会越来越关键,必须单独设计目录、备份和变更流程。这不是不能接受,只是维护任务会增加。
把 Nginx 放进 Docker 容器。
容器安装 Nginx 的优点
-
环境更统一 Nginx 配置也跟着 docker-compose.yml 管理。
-
迁移方便 整套服务拷到新机器,docker compose up -d 就能起来。
-
更适合单项目部署 一个项目一个 compose,Nginx、应用、数据库都在里面。
-
不污染宿主机 宿主机只保留 Docker。
可以使用官方镜像,例如:
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./certs:/etc/nginx/certs
这样 Nginx 也变成一个容器服务,配置文件、证书目录、日志目录都可以通过挂载管理,入口端口仍然映射到宿主机的 80 和 443。
容器化 Nginx 的优点是部署体系更统一。
既然应用和数据库都准备用 Docker 管理,Nginx 也容器化后,配置更容易文件化,迁移也更清晰。换服务器时,只要 Docker、Compose、Nginx 配置、证书和项目数据恢复到位,更容易重新跑起来服务。
它也更适合多项目统一入口。
Nginx容器负责公网入口,其他项目容器负责各自服务,通过 Docker 网络连接- 外部只开放 80 和 443,内部服务不直接暴露公网端口,结构会更清楚
但容器化 Nginx 也有成本。
- 首先要理解 Docker 网络,尤其是多个 Compose 项目之间如何通信,是否需要创建公共 network,服务名如何解析。
- 其次要处理配置和证书挂载,路径写错时容器可能直接启动失败。
- 日志也要明确是看
docker logs,还是挂载到宿主机目录。 - 访问不通时,排查会多一层:
Nginx配置、容器状态、网络连通性、目标服务状态都要看。
所以容器化不是无脑更好。它能让部署结构更统一,但也需要你理解网络、挂载和日志。
这两种方案怎么选?
当然,不是所有东西都容器化。工具选择要看维护成本。某些系统级工具直接安装在服务器上更简单;监控、备份、证书管理也要按实际情况选。Nginx 值得单独讨论,是因为它处在公网入口位置,会影响后面所有项目的访问路径。
简单对比一下:
| 维度 | 系统安装 Nginx | 容器化 Nginx |
|---|---|---|
| 上手难度 | 低 | 中等 |
| 排查路径 | 直接 | 多一层容器和网络 |
| 配置管理 | 系统目录为主 | 可挂载为项目配置 |
| 迁移成本 | 需要恢复系统配置 | 配置文件化更清晰 |
| 多项目入口 | 可以实现 | 与 Docker 项目更自然 |
| 网络关系 | 主要依赖宿主机端口 | 需要设计 Docker 网络 |
| 适合场景 | 单项目、传统部署 | 多项目、容器化部署 |
结合现代 DevOps 实践中,强烈建议将 Nginx 容器化并纳入 docker-compose 统一管理,提升可维护性、一致性和自动化能力。
结合个人服务器配置情况,我更推荐使用:
一个全局
Nginx容器 每个项目独立MySQL容器 每个项目独立Redis容器
全局 Nginx 负责统一公网入口,根据域名或路径转发到不同项目。每个项目只暴露给内部网络,避免各自向公网开放端口。这样入口集中,证书和路由也集中,后面多项目维护会更清楚。
如果你只是部署一个简单网站,而且对 Docker 还不熟,先用系统 Nginx 更稳。如果你已经用 Docker 部署多个项目,并且想统一入口、减少公网暴露端口、提升迁移清晰度,可以考虑容器化 Nginx。
无论选哪种,都要注意:
- 公网入口尽量集中;
- 80 和 443 要管理清楚;
- 证书路径要可维护;
- Nginx 配置要能备份;
- 修改配置后要做语法检查;
- 日志要知道在哪里看;
- 不要让每个项目随意暴露公网端口。
Nginx 的怎么部署不是重点,入口设计清楚才是重点。
下一篇我会继续拆一个更具体的问题:既然用容器化 Nginx,为什么不是每个项目都起一个 Nginx 容器?这会直接影响后面多项目部署的结构。
本文由 楸木 原创,转载请注明出处。