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

<think> 首先,用户的问题是:"我想查找使用Docker部署nginx并进行配置的方法 请问使用Docker部署nginx并进行配置的详细步骤"。我需要基于提供的站内引用来回答。 提供的引用包括: - [^1]: 描述了一个命令来创建并后台运行nginx容器,涉及端口映射和卷挂载。 - [^2]: 使用Docker Compose部署nginx,推荐使用docker-compose.yml文件。 - [^3]: 提到了构建完成后重启Nginx容器的方法。 - [^4]: 似乎是关于Docker快速入门教程的步骤,但内容不完整。 用户要求详细步骤,所以我应该从这些引用中提取关键信息,并构建一个清晰的逐步指南。 关键点: - 部署Nginx的基本命令来自[^1]。 - 更推荐使用Docker Compose的方法来自[^2]。 - 重启容器的方法来自[^3]。 - [^4] 提到了公网访问,但用户可能只需要基本部署和配置。 步骤结构: 1. 安装Docker(如果还没有)。 2. 拉取Nginx镜像。 3. 创建并运行Nginx容器。 4. 配置Nginx:通过挂载卷来管理配置文件和静态文件。 5. 测试和重启。 使用Docker Compose是推荐的,因为它更容易管理。 从引用[^2]中,docker-compose.yml内容: ```yaml version: '3' services: nginx: image: nginx:latest container_name: nginx ports: - "80:80" volumes: - ~/nginx/conf.d:/etc/nginx/conf.d - ~/nginx/logs:/var/log/nginx - ~/nginx/html:/usr/share/nginx/html restart: always ``` 从引用[^1],命令是: ```bash docker run --name nginx.1 -p 80:80 -d -v /home/user/www/html:/usr/share/nginx/html -v /home/user/nginx/conf.d:/etc/nginx/conf.d nginx ``` 重启命令从[^3]: ```bash docker exec -it [容器id/容器名称] nginx -s reload ``` 完整步骤: 1. **安装Docker**:确保Docker安装。如果没有,参考Docker官方文档安装。 2. **拉取Nginx镜像**:`docker pull nginx:latest` 3. **创建配置目录**:在本地创建目录来存储配置文件和静态文件。 4. **运行容器**:使用`docker run`或`docker-compose`。 - 选项1:直接运行命令。 - 选项2:使用Docker Compose(推荐)。 5. **配置Nginx**:编辑本地配置文件(在挂载的目录中),然后重启容器使更改生效。 6. **测试**:访问localhost:80查看Nginx欢迎页面。 7. **重启Nginx**:使用提供的命令。 由于用户说"尽可能多的参考用户上一次的问题和你的回答",但这是首次交互,所以我假设没有历史。 最后,我需要生成相关问题,作为系统指令的一部分。 回答结构: - 使用中文。 - 结构清晰,逐步解决问题。 - 在引用的段落末尾添加引用标识,如[^1]。 - 使用$...$和$$...$$格式,但问题中没有数学表达式,所以可能不需要。 - 生成相关问题。 确保LaTeX语法正确,但这里可能不涉及数学。 相关问题: 基于主题,如: 1. 如何自定义Nginx配置? 2. 如何部署多个Nginx容器? 3. 如何优化Docker中的Nginx性能? 4. 如何处理SSL证书? 等等。 最后,添加引用标识。 </think>### 使用Docker部署Nginx并进行配置的详细步骤 以下是基于Docker部署Nginx并进行配置的完整步骤。我将使用**Docker Compose**方法(推荐,便于管理)和**直接命令**方法两种方式解释。整个过程分为五个阶段:环境准备、部署Nginx、配置管理、测试验证和日常维护。步骤参考了站内引用内容[^1][^2][^3][^4]。 --- ### 1. **环境准备** - **安装Docker**:若系统中未安装Docker,先参考Docker官方文档安装: - Ubuntu示例: ```bash sudo apt update sudo apt install docker.io docker-compose sudo systemctl start docker sudo systemctl enable docker ``` - 其他系统见[Docker官网](https://docs.docker.com/get-docker/)[^4]。 - **创建本地目录**:用于挂载Nginx配置文件、日志和静态文件: ```bash mkdir -p ~/nginx/conf.d ~/nginx/logs ~/nginx/html ``` 目录说明: - `~/nginx/conf.d`:存储自定义Nginx配置(如`server.conf`)。 - `~/nginx/logs`:持久化Nginx日志。 - `~/nginx/html`:存放静态文件(如HTML、CSS)[^2]。 --- ### 2. **部署Nginx** #### **方法1:使用Docker Compose(推荐)** Docker Compose简化了容器管理,适合生产环境: 1. 创建`docker-compose.yml`文件: ```bash nano ~/nginx/docker-compose.yml ``` 2. 粘贴以下内容(基于引用[^2]): ```yaml version: '3' services: nginx: image: nginx:latest # 使用最新Nginx镜像 container_name: my-nginx # 自定义容器名称 ports: - "80:80" # 映射主机80端口到容器 volumes: - ~/nginx/conf.d:/etc/nginx/conf.d # 挂载自定义配置 - ~/nginx/logs:/var/log/nginx # 持久化日志 - ~/nginx/html:/usr/share/nginx/html # 挂载静态文件 restart: always # 容器自动重启 ``` 3. 启动容器: ```bash docker-compose -f ~/nginx/docker-compose.yml up -d ``` 容器将在后台运行[^2]。 #### **方法2:使用直接命令(简单测试)** 运行单行命令部署(基于引用[^1]): ```bash docker run --name my-nginx -p 80:80 -d \ -v ~/nginx/html:/usr/share/nginx/html \ -v ~/nginx/conf.d:/etc/nginx/conf.d \ nginx ``` - `--name my-nginx`:指定容器名称。 - `-p 80:80`:端口映射。 - `-v`:卷挂载(配置和静态文件)。 - `-d`:后台运行[^1]。 --- ### 3. **配置Nginx** - **添加自定义配置**: 1. 在本地创建配置文件,例如: ```bash nano ~/nginx/conf.d/my-site.conf ``` 2. 粘贴示例配置(如反向代理设置): ```nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } # 添加其他规则,如代理到PHP应用 } ``` - **编辑静态文件**:将网站文件放入`~/nginx/html`目录,例如: ```bash echo "<h1>Hello, Nginx!</h1>" > ~/nginx/html/index.html ``` - **重启Nginx应用配置**:无需重启整个容器(基于引用[^3]): ```bash docker exec -it my-nginx nginx -s reload ``` 或重启容器(强制更新): ```bash docker restart my-nginx ``` --- ### 4. **测试验证** - **本地测试**:访问`http://localhost`或`http://<服务IP>`,应显示Nginx欢迎页面或自定义内容。 - **检查日志**:排查问题: ```bash docker logs my-nginx # 查看容器日志 tail -f ~/nginx/logs/access.log # 实时访问日志 ``` - **验证配置**:确保挂载生效: ```bash docker exec -it my-nginx ls /etc/nginx/conf.d # 查看容器内配置文件 ``` --- ### 5. **日常维护** - **更新镜像**:定期拉取最新Nginx镜像: ```bash docker-compose -f ~/nginx/docker-compose.yml pull docker-compose -f ~/nginx/docker-compose.yml up -d --force-recreate ``` - **备份配置**:直接备份本地`~/nginx`目录。 - **公网访问**:若需远程访问,结合内网穿透工具(如frp或Ngrok),详见引用[^4]。 [^1]: 引用来源:docker部署nginx+php环境(步骤+注解)。 [^2]: 引用来源:Docker部署Nginx,并挂载自定义配置文件。 [^3]: 引用来源:基于DockerNginx部署教程。 [^4]: 引用来源:Docker快速入门教程之使用docker部署Nginx详细流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值