
バックエンドで、nginx (ポート 7999 でリッスン) から bitbucket サーバー (ポート 7998 でリッスン) に SSH トラフィックをプロキシしようとしています。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 .
そこに設定を追加するか、別のディレクトリに 2 番目の include ディレクティブを追加して、ボリュームとしてもマウントします。
たとえば、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
すると動作します。