docker nginx proxy_pass 想让Nginx容器内的配置代理到宿主机上的某个端口

(比如Java应用运行在宿主机的8092端口)

报错配置:   

location /api {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8092;
    }

 调整后配置:

    location /api {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://192.168.1.108:8092;
    }

最简单的方式 查询本机IP  ipconfig 为例 查询宿主机IP为 192.168.1.108 替换

其他解决方案参考文心一言解答

如果你想让Nginx容器内的配置代理到宿主机上的某个端口(比如Java应用运行在宿主机的8092端口),你需要确保Nginx配置正确地设置了proxy_pass指令来指向宿主机上的这个端口。但是,由于Docker容器通常不会直接看到宿主机的localhost127.0.0.1(因为它们有自己的网络命名空间),你需要使用宿主机的IP地址或者Docker的网络机制来实现这一点。

这里有几种方法可以实现这一点:

1. 使用宿主机的IP地址

首先,你需要知道宿主机的IP地址(可以通过ip addrifconfig命令在宿主机上查看)。然后,在你的Nginx配置中,将proxy_pass设置为宿主机的IP地址和端口。

例如,如果宿主机的IP地址是192.168.1.100,那么你的Nginx配置中的location块可能看起来像这样:

 

nginx复制代码

location /api/ {
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;
proxy_pass http://192.168.1.100:8092/;
}

2. 使用Docker Compose的extra_hosts

如果你在使用Docker Compose,你可以在docker-compose.yml文件中为Nginx服务添加extra_hosts配置,以便Nginx容器能够解析到宿主机的名称。但是,请注意,这只允许你通过主机名访问宿主机,而不是直接使用127.0.0.1

 

yaml复制代码

nginx:
# ... 其他配置 ...
extra_hosts:
- "host.docker.internal:host-gateway"

然后,在你的Nginx配置中,你可以使用host.docker.internal作为宿主机的别名:

 

nginx复制代码

location /api/ {
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;
proxy_pass http://host.docker.internal:8092/;
}

注意:host.docker.internal是Docker for Mac和Docker for Windows提供的一个特殊主机名,用于解析到Docker守护进程的宿主机。在Linux上,这个特性可能不可用,或者你需要使用其他方法来获取宿主机的IP地址。

3. 使用Docker的--network=host模式(不推荐)

虽然你可以通过运行Nginx容器时使用--network=host模式来让容器共享宿主机的网络栈,但这通常不推荐用于生产环境,因为它会暴露宿主机上的所有服务和端口给容器,增加了安全风险。此外,这种方法也不适用于Docker Compose配置。

4. 使用Docker的自定义网络(推荐)

另一种方法是创建一个自定义的Docker网络,并将你的Java应用和Nginx容器都连接到这个网络上。然后,你可以在Nginx配置中使用Java应用的容器名称作为proxy_pass的目标。但是,这要求你的Java应用也运行在Docker容器中。

例如,你可以在docker-compose.yml中定义一个自定义网络,并将Nginx和Java服务都连接到这个网络上:

 

yaml复制代码

version: '3'
services:
nginx:
# ... 其他配置 ...
networks:
- my-network
java-app:
image: your-java-app-image
ports:
- "8092:8092"
networks:
- my-network
networks:
my-network:
driver: bridge

然后,在Nginx配置中,你可以使用Java服务的容器名称(在这个例子中是java-app)作为proxy_pass的目标:

 

nginx复制代码

location /api/ {
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;
proxy_pass http://java-app:8092/;
}

文心一言解答:叮!快来看看我和文心一言的奇妙对话~点击链接 https://yiyan.baidu.com/share/1xI6Sqnf6s -- 文心一言,既能写文案、读文档,又能绘画聊天、写诗做表,你的全能伙伴!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值