我有一台运行应用程序的 macOS 笔记本电脑。UI 使用端口 8081,API 使用 3031。我可以使用 localhost:8081 在 mac 系统上访问它,并且所有 API 调用都通过端口 localhost:3031 进行。
Mac 已连接到我的 VPN,我可以使用 10.0.0.25 从另一台机器 ssh 进入它,也可以使用 10.0.0.25:8080 在浏览器中访问该应用程序。问题是应用程序的代码中硬编码了 API 的“localhost:3031”,因此,尽管我可以在第二个机器上看到 UI,但所有 API 调用都不起作用,因为第二个机器上的应用程序正在将请求发送到“localhost:3031”。显然,这不起作用,因为第二个机器没有在本地运行 API。
我无法真正编辑代码来更改它,以便“localhost:3031”不再是应用程序 API 端的硬编码值。我想知道我有什么选项可以让它工作,以便第二台机器可以成功运行应用程序,并且 API 调用可以成功发送并收到响应。
我想也许如果我在 Mac 上设置一个 nginx 反向代理,然后在第二台机器上通过浏览器访问 10.0.0.25:8081,在 Mac 系统上它会监听端口 8081 并将该流量代理到 localhost:8081,然后监听端口 3031 并将其代理到 localhost:3031,但我收到此消息:
错误:对于 nginx,无法启动服务 nginx:端口不可用:公开端口 TCP 0.0.0.0:3031 -> 0.0.0.0:0:监听 tcp 0.0.0.0:3031:绑定:地址已在使用中
这是我的 nginx default.conf:
server {
listen 8080;
location / {
proxy_pass http://localhost:8081;
}
access_log /var/log/nginx/8081-access.log;
error_log /var/log/nginx/8081-error.log error;
}
server {
listen 3031;
location / {
proxy_pass http://localhost:3031;
}
access_log /var/log/nginx/3031-access.log;
error_log /var/log/nginx/3031-error.log error;
}
以及设置 nginx 反向代理容器的 nginx docker-compose.yml 文件:
version: '2'
services:
nginx:
image: nginx:latest
container_name: nginx
# volumes:
# - ./default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:8081"
- "3031:3031"
关于如何在现有限制下实现此连接,您有什么想法吗?如果反向代理不起作用,还有其他方法吗?
答案1
就您而言,您的端口8081
和3031
已被使用docker
,无法绑定到这些端口。因此,nginx
如果您想使用反向代理,则应更改和的配置以nginx
侦听docker
特定 IP 地址上的端口,docker
等等。127.0.0.1
nginx
10.0.0.25
docker-compose.yml 应该看起来像:
version: '2'
services:
nginx:
image: nginx:latest
container_name: nginx
# volumes:
# - ./default.conf:/etc/nginx/conf.d/default.conf
ports:
- "127.0.0.1:8080:8081"
- "127.0.0.1:3031:3031"
nginx default.conf 应该如下所示:
server {
listen 10.0.0.25:8080;
location / {
proxy_pass http://localhost:8081;
}
access_log /var/log/nginx/8081-access.log;
error_log /var/log/nginx/8081-error.log error;
}
server {
listen 10.0.0.25:3031;
location / {
proxy_pass http://localhost:3031;
}
access_log /var/log/nginx/3031-access.log;
error_log /var/log/nginx/3031-error.log error;
}
答案2
查找使用端口“3031”的进程:
lsof -ti:3031
然后找到该进程的 pid 并将其终止:
kill -9 [pid]