Docker部署Nginx代理多个服务:公网域名与内网IP场景全解

在这里插入图片描述

本文分享了我在公网和内网两种环境下,使用 Docker 部署 Nginx 并代理多个应用的完整实践。涵盖了常见的端口方式、路径方式、HTTPS 自动跳转、容器网络配置等关键细节,并附上完整的 docker-compose.yml 和 Nginx 配置模板。尤其是在内网环境下代理多个应用时,我也遇到了一些坑(如路径代理导致 SPA 应用失效),这里也详细记录了解决思路。适合需要部署内网服务、或希望统一 Nginx 入口管理多个容器服务的朋友参考。

1. 公网环境下的 Nginx 部署与代理配置

1.1 Docker部署Nginx

通常是云服务器有公网IP,并且有域名已经解析到这个公网IP了。

  • nginx-reverse-proxy网络负责Nginx和其他应用的交互。
  • internet网络负责Nginx发布接口的映射到服务器上。
  • 正常监听80和443端口。
  • 数据卷挂在Nginx的配置文件夹,日志及主机时间,证书和私钥。
services:
  nginx:
    image: nginx:latest
    container_name: nginx-reverse-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./log:/var/log/nginx
      - /etc/letsencrypt/live/zenseek.site/fullchain.pem:/etc/nginx/certs/fullchain.pem:ro
      - /etc/letsencrypt/live/zenseek.site/privkey.pem:/etc/nginx/certs/privkey.pem:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      - nginx-reverse-proxy
      - internet
    restart: always

networks:
  nginx-reverse-proxy:
    external: true
  internet:
    external: true

1.2 Nginx配置文件

1.2.1 默认配置文件

  • 文件名default.conf
  • 默认配置主要负责将HTTP重定向到HTTPS上。
server {
    listen 80;
    server_name _;

    # Redirect all HTTP requests to HTTPS
    return 301 https://$host$request_uri;
}

1.2.2 应用配置文件

  • 文件名app.conf
  • 将二级域名代理到容器内的应用。
server {
    listen 443 ssl;
    server_name prefix_domain_name;
    
    省略。。。
    
    location / {
        proxy_pass http://vaultwarden:80;
        省略。。。
    }
}

2. 内网环境中的 Nginx 多应用代理方案

在内网环境部署Nginx和应用的话,除非是内网的生产应用会有内网的域名外,基本就是使用内网IP。在这种情况下,可以通过不同的端口号来区分应用,或是不同的路径名来区分应用。

2.1 使用不同的端口来区分应用

Nginx的容器配置是基本不变的,需要使用什么接口就发布什么接口。

    ports:
      - "8080:8080"
      - "8443:8443"

也可以使用范围来发布连续的端口号,这样可以减少配置量。

    ports:
      - "8000-8010:8000-8010"

Nginx的配置文件则是按应用区分。

server {
    listen 8004 ssl;
    server_name Intranet_IP;

    省略。。。

    location / {
        proxy_pass http://keycloak_web:8080;  # Proxy to Keycloak
        
        省略。。。
    }
}

这样通过访问服务器的内网IP加端口号就可以访问后端的应用。但是这种方式有一个缺点,就是无法自动从HTTP跳转到HTTPS。所以必须使用https://IP:Port的格式才行. 这个非常规的端口号不能既监听HTTP又监听HTTPS流量。但是这个方式比较保险,因为https://IP:Port后面跟的是根路径,后端应用不易出现问题。

2.2 使用不同的路径来区分应用

Nginx容器的配置没有变化,就还是正常监听80和443端口。访问不同的应用则是通过后面的路径名来区分的。Nginx的配置文件则是变成一个文件,格式如下。

  • 第一个Server block是用于HTTP跳转到HTTPS。
  • 第二个Server block是用于处理HTTPS的访问。
  • 通过路径来区分将请求转到后端的哪个应用上。
server {
    listen 80;
    server_name _;

    # Redirect all HTTP requests to HTTPS
    return 301 https://$host:$request_uri;
}


server {
    listen 443 ssl;
    server_name _;

     省略。。。

    # /draw -> Excalidraw
    location /draw/ {
        proxy_pass http://excalidraw:80; # reverse proxy to Excalidraw
        省略。。。
    }

    # /password -> Vaultwarden
    location /password/ {
        proxy_pass http://vaultwarden:80; # reverse proxy to Vaultwarden
        省略。。。
    }

}

但是通过不同路径来区分应用的方式会导致一些后端应用无法运行。譬如像Excalidraw这样的应用,后端期待的根路径/开始的,但是实际上传过去的是/draw/,导致无法识别路径。虽然后来我加上了路径改写rewrite ^/draw/(.*)$ /$1 break;,但是依然不生效,返回的路径也把/draw给去掉了。

2.3 结论

如果使用路径不影响应用的话,这种还是比较方便的,毕竟容易记,且还能重定向到HTTPS,也不用更改Nginx容器的发布端口的配置。

📚 延伸阅读

更多内容持续更新于我的博客:https://www.zenseek.site

### 如何使用Docker部署Nginx #### 准备工作 确保系统已安装 Docker。对于 Centos8 的环境,可以按照官方文档指导完成安装;Windows 用户同样可以根据 Docker 官方文档找到对应的安装指南[^4]。 #### 获取 Nginx 镜像 通过执行 `docker pull nginx` 来拉取最新的 Nginx 镜像,默认情况下这将下载 latest 版本的镜像文件[^2]。 #### 启动 Nginx 容器 启动容器并映射端口以便能够访问到 Nginx 提供的服务。通常做法是在命令行输入如下指令来创建一个新的容器实例: ```bash docker run --name mynginx -d -p 80:80 nginx ``` 这条命令做了几件事情:给新创建的容器命名为 "mynginx" ,以后台模式运行 (`-d`) , 将主机的 80 端口绑定至容器内部的 80 端口(`-p 80:80`),最后指定了要使用的镜像名 (即 `nginx`)。 #### 更新配置重启服务 当修改了 Nginx 的配置文件之后,为了使更改生效,则需重新加载 Nginx 设置而无需停止整个容器。可以通过下面的方式实现这一点: ```bash docker exec -it mynginx nginx -s reload ``` 此命令向正在运行中的 Nginx 发送信号让其平滑地应用新的配置而不中断现有连接[^1]。 #### 远程访问解决方案 如果希望允许来自外部网络的请求到达本地机器上的 Nginx 实例,在不具备公网 IP 地址的情况下,可能需要考虑采用一些额外的技术手段比如反向代理服务器、动态域名解析(DDNS) 或者云服务商提供的内网穿透工具等方法解决这个问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值