我正在尝试将 SSH 流量从 nginx(监听端口 7999)代理到后端的 bitbucket 服务器(监听端口 7998)。nginx 和 bitbucket 都在 Docker 容器内运行。如果我登录到 nginx 容器并执行此操作,telnet bitbucket.domain-name.com 7998
它将连接。如果我在主机上执行此操作,netstat -pnlt
我将获得:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::2377 :::* LISTEN 24477/dockerd
tcp6 0 0 :::7946 :::* LISTEN 24477/dockerd
tcp6 0 0 :::80 :::* LISTEN 24477/dockerd
tcp6 0 0 :::443 :::* LISTEN 24477/dockerd
tcp6 0 0 :::7999 :::* LISTEN 24477/dockerd
但是,当我在计算机上执行此操作时,我得到了git clone ssh://[email protected]:7999/project_key/repo_name.git
Cloning into 'repo_name'...
ssh: connect to host domain-name.com port 7999: Connection refused
fatal: Could not read from remote repository.
当我这样做时,telnet domain-name.com 7999
我得到了telnet: Unable to connect to remote host: Connection refused
。
问题似乎是 nginx 没有在 docker 容器内监听端口 7999。但是,在主机上我可以看到dockerd
它正在监听端口 7999。我想我的 nginx 配置可能不正确,但我不确定。以下是配置文件中的相关部分。
docker-compose.yaml (nginx)
services:
nginx:
ports:
- "80:8080"
- "443:8443"
- "7999:7997"
nginx.conf(在 nginx 容器内)
stream {
server {
listen 7997;
proxy_pass bitbucket1.cybertron.ninja:7998;
}
}
以下是 nginx 容器内执行的一些输出:
root@6d123f454eef:/# netstat -pnlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 10/nginx: master pr
tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN 10/nginx: master pr
tcp 0 0 127.0.0.11:44703 0.0.0.0:* LISTEN -
有什么办法可以解决这个问题吗?我被难住了。
答案1
我刚刚根据您提供的少量信息为您的案例设置了一个测试环境。假设您提供的内容就是您所做的所有更改,那么这不可能奏效。
官方 nginx 容器内的默认 nginx.conf在块include
内有该指令http
:
http {
# ...
include /etc/nginx/conf.d/*.conf;
}
如果您只是将 .conf 文件放入 conf.d 目录,nginx 将失败并显示以下错误消息:
2021/09/23 05:58:30 [emerg] 1#1: /etc/nginx/conf.d/blah.conf:1 中不允许使用“stream”指令
由于你的 nginx 正在运行,我只能假设你在启动后将配置放入目录中,并且没有重新启动或重新加载 nginx。
这stream
指令必须位于配置的根目录中,您还需要提供修改后的 nginx.conf。
从你的容器中复制 nginx.conf:
docker cp test_nginx_1:/etc/nginx/nginx.conf .
在那里添加您的配置,或者添加带有单独目录的第二个包含指令并将其作为卷挂载:
例如,在http {}
块外部添加:
include /etc/nginx/conf.stream.d/*.conf;
将其添加到你的 docker-compose.yml 中
services:
nginx:
image: nginx
volumes:
- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
- ./config/nginx:/etc/nginx/conf.d:ro
- ./config/nginx_stream:/etc/nginx/conf.stream.d:ro
运行docker-compose up -d
,它就起作用了。