8
0
Nginx三种部署方式教程
2026-08-20
2026-08-20
文章摘要
|
Nginx 三种部署方式完整教程
场景说明:服务器上已经用 Docker 部署了 Halo(端口8080)、Nextcloud(端口8090),
目标:通过 Nginx 做反向代理,让访问者不需要输入端口号即可访问,并支持后续开启 HTTPS。
域名示例:shukerrrrrr.cn(转发到 Nextcloud)、www.shukerrrrrr.cn(转发到 Halo)
三种方式对比一览
结论建议:如果已经用 Docker 管理其他项目(Halo、Nextcloud 都是),继续用方式一或方式二保持体系一致最省心。方式二在申请 HTTPS 证书这件事上,比方式一省事很多。
方式一:Docker 部署原生 Nginx(手写配置文件)
第一步:创建配置目录
mkdir -p /opt/nginx/conf.d
# 创建 nginx 项目文件夹,以及一个专门存放"转发规则"的子文件夹 conf.d
# -p 表示上级目录不存在也一起创建
cd /opt/nginx
# 进入这个目录,后续操作都在这里进行
第二步:写入转发规则文件
cat > conf.d/default.conf << 'EOF'
# 第一个规则块:不带 www 的根域名,转发到 8090(Nextcloud)
server {
listen 80;
# 监听标准的80端口,这样访问时不需要输入端口号
server_name shukerrrrrr.cn;
# 只有访问者的域名跟这个一致时,才会走这条规则
# (浏览器请求里会带上"我要访问的域名"这个信息,Nginx 靠这个来匹配)
location / {
# location / 表示"网站下的所有路径"都适用下面的规则
proxy_pass http://127.0.0.1:8090;
# 核心一句:把请求转发给本机(127.0.0.1,也就是这台服务器自己)的8090端口
# 8090正是 Nextcloud 监听的宿主机端口
proxy_set_header Host $host;
# 把原始请求里的域名信息,原样转发给后端的 Nextcloud
# 让 Nextcloud 知道"访问者实际输入的域名是什么"
proxy_set_header X-Real-IP $remote_addr;
# 把访问者的真实IP地址传给后端
# 如果不加这行,Nextcloud 会误以为所有访问都来自 Nginx 自己(127.0.0.1)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 记录请求经过的完整链路IP(有多层代理时会有用)
proxy_set_header X-Forwarded-Proto $scheme;
# 告诉后端这次请求原本是用 http 还是 https 发起的
# 后续开启 HTTPS 后,这一行能让 Nextcloud 正确识别协议,避免跳转错误
}
}
# 第二个规则块:带 www 的域名,转发到 8080(Halo)
server {
listen 80;
server_name www.shukerrrrrr.cn;
# 注意:这里的域名跟上面那个 server 块不一样
# Nginx 会根据访问者请求的具体域名,自动匹配到对应的这个规则块
location / {
proxy_pass http://127.0.0.1:8080;
# 转发到 Halo 的宿主机端口 8080
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;
}
}
EOF
📝 注释:如果域名还在备案审核中、暂时无法用域名测试,可以临时在
server_name后面加上服务器公网IP,比如:server_name shukerrrrrr.cn 47.103.71.74;这样可以先用
http://47.103.71.74测试转发逻辑是否正常,等备案通过后再把IP删掉即可。
第三步:写入 docker-compose.yml
cat > docker-compose.yml << 'EOF'
services:
nginx:
image: nginx:latest
# 官方 Nginx 最新版镜像
container_name: nginx
restart: always
# 容器异常退出或服务器重启后自动重启
network_mode: host
# 关键设置:让 Nginx 容器直接使用宿主机的网络环境
# 这样它才能顺利访问到 127.0.0.1:8080 / 127.0.0.1:8090
# (这两个是宿主机上其他容器暴露出来的端口,用 host 网络模式最简单直接)
volumes:
- ./conf.d:/etc/nginx/conf.d
# 把本地写好的转发规则文件夹,挂载进容器内 Nginx 读取配置的标准位置
# 这样修改本地文件后,重启容器就能生效,不用重新构建镜像
EOF
第四步:启动
docker compose up -d
# 拉取镜像并启动 Nginx 容器
docker compose ps
# 查看容器是否正常运行(Up状态)
第五步:修改配置后如何生效
docker compose restart nginx
# 修改 conf.d/default.conf 内容后,用这条命令重启使新配置生效
# 不需要用 up -d,因为容器本身没变,只是配置文件内容变了
验证测试
http://47.103.71.74 → 应该显示 Nextcloud(如果测试阶段用IP做了server_name)
http://shukerrrrrr.cn → 备案通过后,应显示 Nextcloud
http://www.shukerrrrrr.cn → 备案通过后,应显示 Halo
方式二:Nginx Proxy Manager(NPM,图形化管理界面)
本质说明:NPM 底层也是用 Docker 跑 Nginx,只是额外带了一个网页管理后台,
不需要手写配置文件,改成在网页上点击操作即可完成转发规则、HTTPS证书申请。
第一步:创建配置目录
mkdir -p /opt/npm
cd /opt/npm
第二步:写入 docker-compose.yml
cat > docker-compose.yml << 'EOF'
services:
npm:
image: jc21/nginx-proxy-manager:latest
# NPM 官方镜像
container_name: npm
restart: always
ports:
- "80:80"
# HTTP 访问端口,转发规则生效后靠这个端口对外提供服务
- "443:443"
# HTTPS 访问端口,申请证书后靠这个端口提供加密访问
- "81:81"
# NPM 自己的管理后台端口,用浏览器打开这个端口进入图形化配置界面
volumes:
- ./data:/data
# NPM 自身的配置数据(转发规则、账号信息等)存这里,防止容器重建后丢失
- ./letsencrypt:/etc/letsencrypt
# 申请到的 HTTPS 证书存这里,同样是为了持久化保存
EOF
第三步:启动
docker compose up -d
docker compose ps
第四步:防火墙放行端口
阿里云控制台「防火墙」→「添加规则」,放行:
第五步:进入管理后台初始化
浏览器访问:
http://47.103.71.74:81
默认初始账号密码(首次登录后务必立刻修改):
邮箱:admin@example.com
密码:changeme
第六步:网页里添加转发规则(图形化操作,无需写代码)
登录后台 → 「Hosts」→「Proxy Hosts」→「Add Proxy Host」
以转发 Halo 为例,填写:
保存即可生效,不需要手动重启任何东西。
第七步:一键申请免费 HTTPS 证书
在刚才添加规则的界面里,切换到「SSL」标签页:
「SSL Certificate」下拉选择「Request a new SSL Certificate」
勾选「Force SSL」(强制跳转到加密访问)
填写邮箱,勾选同意条款
保存
NPM 会自动去申请 Let’s Encrypt 免费证书并配置好,全程不需要手写任何命令。
方式三:直接在系统里安装 Nginx(不使用 Docker)
第一步:安装
apt update
# 刷新软件源列表
apt install nginx -y
# 直接从 Ubuntu 官方源安装 Nginx,-y 自动确认安装
第二步:启动并设置开机自启
systemctl start nginx
# 启动 Nginx 服务
systemctl enable nginx
# 设置开机自动启动
systemctl status nginx
# 查看运行状态,确认是否正常(active/running)
第三步:配置文件位置(跟 Docker 方式路径不同,需要注意)
cd /etc/nginx/conf.d
# 系统安装的 Nginx,配置文件目录在这里
# 跟 Docker 部署时我们自己指定的 /opt/nginx/conf.d 是完全不同的两个路径,不要混淆
第四步:写入转发规则文件
cat > /etc/nginx/conf.d/default.conf << 'EOF'
server {
listen 80;
server_name shukerrrrrr.cn;
location / {
proxy_pass http://127.0.0.1:8090;
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;
}
}
server {
listen 80;
server_name www.shukerrrrrr.cn;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
EOF
# 配置内容跟方式一完全一样,只是文件存放路径不同
第五步:检查配置语法是否正确
nginx -t
# 系统安装的 Nginx 自带这个语法检查命令
# 输出 "syntax is ok" 和 "test is successful" 才说明配置没有写错
第六步:修改配置后如何生效
systemctl reload nginx
# 重新加载配置,不会中断已有连接,比重启更平滑
# (Docker 方式用的是 docker compose restart,这里系统安装用的是 reload)
