Nginx は指定された listen ポートを開きません

Nginx は指定された listen ポートを開きません

バックエンドで、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すると動作します。

関連情報