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代理多个服务:公网域名与内网IP场景全解的更多相关文章
- 如何让公司内网ip映射到公网?
其实这就是端口映射的技术,而端口映射至外网访问2种方法,今天我们来具体谈一谈. 公司内外网互通是网络技术运维人员经常需要面对的问题和需求场景,不管是疫情严重的当下,还是不在公司而又无法快速回公司却又急 ...
- Docker Compose 一键部署Nginx代理Tomcat集群
Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...
- Docker Compose部署 nginx代理Tomcat集群
一.简介 使用Docker镜像部署Nginx代理的多个Tomcat集群: 使用Dockerfile构建nginx镜像 使用Dockerfile构建tomcat镜像 mysql镜像使用docker hu ...
- 使用docker部署nginx+tomcat架构(3):使用docker-compose简化部署操作
经历了之前的两篇,我们已经大体上了解了docker部署容器的过程. 使用docker部署nginx+tomcat架构 使用docker部署nginx+tomcat架构():访问mysql数据库 不过, ...
- Docker部署Nginx报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
Docker 部署 Nginx 报错 WARNING: IPv4 forwarding is disabled. Networking will not work. [root@localhost ~ ...
- Docker部署Nginx并修改配置文件
Docker部署Nginx并修改配置文件 一.拉取nginx镜像 docker pull nginx 二.在宿主机中创建挂载目录 mkdir -p /data/nginx/{conf,conf.d,h ...
- docker部署nginx
1. 下载nginx [root@localhost my.Shells]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ ...
- Docker部署Nginx应用(2)
Docker部署Nginx应用(2) 1.拉取Nginx镜像 [root@localhost ~]# docker pull nginx Using default tag: latest lates ...
- docker(部署常见应用):docker部署nginx
上回说到centos安装docker. 这次用实战,docker部署运行常见的应用. docker常用命令 参看:docker命令大全.这里不做赘述. docker部署nginx 1.docker h ...
- 使用docker部署nginx+tomcat架构(2):访问mysql数据库
上一篇完成了通过docker部署nginx+tomcat的基础软件架构,但是距离一个真正可用的软件架构还差得很远.其中最重要的一点是缺少数据库这个角色的存在,那么本篇就来完善这一点. 废话少说,直接进 ...
随机推荐
- socket tcp断线重连
一.网上常用方法1.当Socket.Conneted == false时,调用如下函数进行判断 点击(此处)折叠或打开 /// <summary> /// 当socket.connecte ...
- java基础之线程池
一.线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销 作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务 使用线程池中线程对象的步骤: 1. 创建线程 ...
- 一个 CTO 的深度思考
今天和一些同事聊了一会,以下是我的观点 我的观点,成年人只能筛选,不能培养 在组织中,应该永远向有结果的人看齐.不能当他站出来讲话的时候,大家还要讨论讨论,他虽然拿到结果了,但是他就是有一点点小问题. ...
- PHP中的精确计算bcadd,bcsub,bcmul,bcdiv 及 扩展安装
<?php/** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */function math ...
- sonarqube+gitlab+jenkins+maven集成搭建(三)
安装JENKINS 关闭防火墙[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# systemctl disable fir ...
- wso2~介绍
1. Wso2-apim的介绍 WSO2 API Manager 是一个开源的 API 管理解决方案,旨在帮助组织设计.发布.管理和分析 API.它提供了全面的功能,支持企业在现代应用程序开发中实现更 ...
- Sentinel——pull模式规则持久化
目录 pull模式规则持久化 定义数据源 定义SPI接口文件 测试 pull模式规则持久化 pull 模式的数据源(如本地文件.RDBMS 等)一般是可写入的.使用时需要在客户端注册数据源:将对应的读 ...
- 【记录】ChatGPT|近期三次更新一览(更新至2023年2月3日)
如果你还没有使用过ChatGPT,可以先看看我的上一篇文章:[记录]ChatGPT|使用技巧与应用推荐(更新至2023年2月8日). 1月11号晚上,ChatGPT突然很多人都无法登录,包括我 ...
- 物联网之使用Vertx实现TCP最佳实践【响应式】
小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现TCP-Server 实现TCP-Server[响应式] Vertx-Core地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简 ...
- codeup之等腰梯形
Description 请输入高度h,输入一个高为h,上底边长为h 的等腰梯形(例如h=4,图形如下). **** ****** ******** ********** Input 输入第一行表示样例 ...