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 部署原生 Nginx

用 Docker 跑官方 Nginx 镜像

手写配置文件

想完全掌控细节、已经习惯 Docker 体系的人

方式二:Nginx Proxy Manager(NPM)

同样是用 Docker 跑,但带图形化管理界面(底层也是 Nginx)

网页点击操作,自动申请 HTTPS 证书

新手、不想记配置语法、想快速搞定 HTTPS

方式三:直接在系统里装 Nginx

脱离 Docker,把 Nginx 直接装进 Ubuntu 系统

手写配置文件,路径在系统目录下

想脱离 Docker、追求极致性能(差异其实很小)的人

结论建议:如果已经用 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

第四步:防火墙放行端口

阿里云控制台「防火墙」→「添加规则」,放行:

协议

端口范围

TCP

80

TCP

443

TCP

81

第五步:进入管理后台初始化

浏览器访问:

http://47.103.71.74:81

默认初始账号密码(首次登录后务必立刻修改):

邮箱:admin@example.com
密码:changeme

第六步:网页里添加转发规则(图形化操作,无需写代码)

登录后台 → 「Hosts」→「Proxy Hosts」→「Add Proxy Host」

以转发 Halo 为例,填写:

字段

填写内容

说明

Domain Names

www.shukerrrrrr.cn

要转发的域名

Scheme

http

后端服务用的协议

Forward Hostname / IP

127.0.0.1

转发到本机

Forward Port

8080

转发到 Halo 的端口

保存即可生效,不需要手动重启任何东西。

第七步:一键申请免费 HTTPS 证书

在刚才添加规则的界面里,切换到「SSL」标签页:

  1. 「SSL Certificate」下拉选择「Request a new SSL Certificate」

  2. 勾选「Force SSL」(强制跳转到加密访问)

  3. 填写邮箱,勾选同意条款

  4. 保存

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)

三种方式的关键差异速查

对比项

方式一(Docker原生)

方式二(NPM)

方式三(系统安装)

配置转发规则

手写 .conf 文件

网页点击操作

手写 .conf 文件

申请HTTPS证书

需要额外安装 Certbot 等工具手动操作

网页点几下自动完成

需要额外安装 Certbot 等工具手动操作

修改配置后生效方式

docker compose restart nginx

网页保存即生效

systemctl reload nginx

配置文件路径

/opt/nginx/conf.d/

由NPM后台自动管理,无需关心路径

/etc/nginx/conf.d/

与现有Docker项目体系是否一致

否(脱离Docker)

新手友好度

中等

中等