web-dev-qa-db-ja.com

DockerNginxリバースプロキシ構成

コンテキスト:

私はnginxにかなり慣れていないので、これを段階的に機能させる方法を考えています。私はこれまでしばらくこの問題を回避してきましたが、実際には、不適切な動作(各ホスト間でヘッダーが渡されない、要求の本文が空であるなど)の結果として、いずれかのアプリの開発が妨げられています。

Php-fpmコンテナーに3つのアプリがあり、独自のコンテナーにnginxサーバーがあります。 nginxコンテナは、要求されたホスト名(基本的な仮想ホスト構成)に基づいてphp-fpmコンテナに要求を提供するための単一のアクセスポイントとして機能します。 try_filesを使用するとすべてが正常に機能しますが、proxy_passに切り替えると問題が発生します。

Nginxの構成は、リクエストが処理されることになっているコンテナに一致するようにserver_nameが変更されていることを除いて、各php-fpmホストでほぼ同じです。

私の研究リソースはページの下部にリンクされています。

問題:

これは私が混乱しているところです。 proxy_passの設定に応じて、nginxログに表示されるエラーが変わります。 proxy_passを使用する状況下では、リクエストは実際には正常に完了しません。さまざまな設定とそれに関連するエラーは次のとおりです。

設定:

proxy_pass http://appX/; # upstream name

エラー:

nginx | 2018/05/08 22:19:48 [error] 10224#10224: *8442 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "http://172.18.0.3:9000/", Host: "appX.local"
nginx | 172.18.0.1 - - [08/May/2018:22:19:48 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"

設定:

proxy_pass https://appX/; # upstream name

エラー:

nginx | 172.18.0.1 - - [08/May/2018:22:20:50 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx | 2018/05/08 22:20:50 [error] 13589#13589: *8446 peer closed connection in SSL handshake (104: Connection reset by peer) while SSL handshaking to upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "https://172.18.0.3:9000/", Host: "appX.local"

設定:

proxy_pass http://appX.local/; # hostname

エラー(何度もループします(論理的には、httpsへのリダイレクトに基づきます)

nginx | 172.18.0.6 - - [08/May/2018:22:21:49 +0000] "GET / HTTP/1.0" 301 185 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "172.18.0.1"

設定:

proxy_pass https://appX.local/; # hostname

エラー(何度もループしますが、理由はわかりません)

nginx | 172.18.0.1 - - [08/May/2018:22:23:35 +0000] "GET / HTTP/1.1" 500 588 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"

設定:

proxy_pass https://appX:9000/;

エラー:

nginx | 2018/05/08 22:29:26 [error] 14426#14426: *9563 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "https://172.18.0.6:9000/", Host: "appX.local"
nginx | 172.18.0.1 - - [08/May/2018:22:29:26 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"

設定:

proxy_pass https://appX.local:9000/;

エラー:

nginx | 2018/05/08 22:27:39 [error] 14426#14426: *9559 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "https://172.18.0.6:9000/", Host: "appX.local"
nginx | 172.18.0.1 - - [08/May/2018:22:27:39 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"

試みた救済策:

  • サーバーディレクティブのポートを非標準ポートに変更し、ポート番号(listenディレクティブで指定されたポートとupstreamディレクティブで指定されたポートの両方)を追加してみました。
  • 私はSSLを使用せず、これを標準のHTTP接続で機能させようとしました。
  • 他のすべてのプロキシ設定を削除し、proxy_passだけで試しました
  • これはtry_files $uri $uri/ /index.php?$argsで機能しますが、プロキシをバイパスします。
  • 研究リソースのさまざまな構成を一致させようとしましたが、行った変更に関係なくエラーが発生しています。

構成:

ホスト名は私のホストの/etc/hostnameファイルにあり、すべて期待どおりに応答します。

nginx.conf

worker_processes 1;

daemon off;

events {
    worker_connections 1024;
}

error_log   /var/log/nginx/error.log warn;
pid         /var/run/nginx.pid;

http {
    default_type application/octet-stream;
    include /etc/nginx/conf/mime.types;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;

    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/appX.conf:

upstream appX {
        server appX:9000;
}

server {
        listen 80;
        listen [::]:80;
        server_name appX.local appX;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_tokens off;

        ssl on;
        ssl_certificate /etc/nginx/certs/appX.crt;
        ssl_certificate_key /etc/nginx/certs/appX.key;
        ssl_dhparam /etc/nginx/certs/dhparam.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;

        server_name appX.local appX;

        root /var/www/appX;
        index index.php index.html;

        location / {
                proxy_read_timeout    90;
                proxy_connect_timeout 90;
                proxy_redirect        off;

                proxy_set_header                X-Real-IP $remote_addr;
                proxy_set_header                X-Scheme $scheme;
                proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header                X-Forwarded-Proto $scheme;
                proxy_set_header                X-Forwarded-Host $server_name;
                proxy_set_header                Host $Host;
                proxy_set_header                X-Real-IP $remote_addr;
                proxy_set_header                X-Forwarded-Port 443;
                proxy_set_header                Authorization $http_authorization;
                proxy_pass_header               Authorization;
                proxy_next_upstream             error timeout invalid_header;

                proxy_hide_header               X-Powered-By;
                proxy_hide_header               X-Pingback;
                proxy_hide_header               Link;

                proxy_cache_bypass              $http_pragma $http_authorization;

                proxy_ssl_session_reuse off;
                proxy_ssl_server_name on;

                proxy_pass https://appX;
        }
}

docker-compose.yml

version: '3.3'
services:
  nginx:
    image: evild/Alpine-nginx:1.9.15-openssl
    container_name: apps_nginx
    volumes:
      - ./app-one:/var/www/app-one/:ro
      - ./app-two:/var/www/app-two/:ro
      - ./app-three:/var/www/app-three/:ro
      - ./nginx/conf/nginx.conf:/etc/nginx/conf/default.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./certs:/etc/nginx/certs
    ports:
      - 80:80
      - 443:443
    expose:
      - "80"
      - "443"
    depends_on:
      - php-app-one
      - php-app-two
    environment: 
      TZ: "America/Los_Angeles"
    networks:
      default:
        aliases:
          - app-one.local
          - app-two.local

  php-app-one:
    environment: 
      TZ: "America/Los_Angeles"
    image: joebubna/php
    container_name: apps_php_app-one
    restart: always
    volumes:
      - ./app-one:/var/www/app-one
    ports:
      - 9001:9000
    networks:
      - default

  php-app-two:
    environment: 
      TZ: "America/Los_Angeles"
    image: joebubna/php
    container_name: apps_php_app-two
    restart: always
    volumes:
      - ./app-two:/var/www/app-two
    ports:
      - 9000:9000
    networks:
      - default


  php-app-three:
    image: joebubna/php
    container_name: apps_php_app-three
    restart: always
    volumes:
      - ./app-three:/var/www/app-three
      - ./fastcgi_params:/var/www/fastcgi_params
    ports:
      - 9002:9000
    depends_on:
      - db
    environment:
      WORDPRESS_DB_Host: db:3306
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: root
      WORDPRESS_DB_NAME: app_three
      TZ: "America/Los_Angeles"
    networks:
      - default

  db:
    image: mysql:5.6
    container_name: apps_mysql
    volumes:
      - db-data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/conf.d/ZZ-apps.cnf:ro
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: cora
      TZ: "America/Los_Angeles"
    ports:
      - 3306:3306
    expose:
      - "3306"
    networks:
      - default


volumes:
  db-data:

networks:
  default:
    driver: bridge

どんな助けでも大歓迎です。私は今日これにかなりの時間を費やしました、そして私はすべての読書と試行錯誤で私が逃したものに関してかなりよく立ち往生しています。

研究リソース:

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

https://www.liaohuqiu.net/posts/nginx-proxy-pass/

https://Gist.github.com/soheilhy/8b94347ff8336d971ad

https://stackoverflow.com/questions/43500469/nginx-proxy-jwilder-nginx-proxy-connection-reset-by-peer-502-bad-gateway

https://groups.google.com/forum/#!topic/xnat_discussion/-S6eYsnwrXg

https://stackoverflow.com/questions/37346560/nginx-server-closes-ssl-connection-for-some-clients

https://stackoverflow.com/questions/38375588/nginx-reverse-proxy-to-heroku-fails-ssl-handshake

https://stackoverflow.com/questions/40580617/nginx-reverse-proxy-upstream-not-working

https://umbrella.Cisco.com/blog/2015/11/03/lets-talk-about-proxies-pt-2-nginx-as-a-forward-http-proxy/

Nginxを複数のサーバーのリバースプロキシとして使用

編集:ここにいる数人の親切な個人からの入力に基づいて、私はこのルートが私の元の問題から大きく逸脱しているため、さらに追求する必要はないと結論付けました。これは、混乱や、同じ問題をじっと見つめる時間が長すぎる場合があります。モデレーターがこの質問を閉じたい場合は、遠慮なくそうしてください。

1
TomJ

Dockerのホスト名が/ etc/hostnameまたは/ etc/hostsで指定されていません。 Dockerには独自のコンテナ間通信があります。したがって、コンテナーを参照するときは、docker-compose.ymlで指定したサービス名を使用してコンテナーを参照できます。したがって、現時点では次のコンテナがあります。

  1. nginx:ホスト名としてnginxとして参照できます。ホスト名nginxを使用してコンテナにpingを実行できるはずです。
  2. php-app-one:ホスト名:php-app-one
  3. php-app-two
  4. php-app-three
  5. db

コンテナに別のホスト名を指定したい場合は、これをdocker-compose.ymlで使用できます

container_name: 'some-container-name-different-to-the-name-of-service'

Nginx + php-fpmを連携させることはできますが、それぞれを独自のコンテナーに入れるのはかなり困難です。これは、docker-compose.ymlを使用せずにすべてを手動でセットアップするgithubリポジトリです。 Nginxとphp-fpmはそれぞれ独自のコンテナにあります: https://github.com/timogoosen/mediawiki-dockerized/blob/master/nginx/sites-enabled/site.conf これがnginxです構成。 nginxコンテナがホスト名とポートを使用してphp-fpmコンテナに接続していることがわかります。

fastcgi_pass php-fpm-container:9000;

READMEを参照してください。かなり説明的です。 https://github.com/timogoosen/mediawiki-dockerized/tree/master/nginx

あなたがしているように、私は問題を小さな部分に分割することを提案します。まず、それぞれ独自のコンテナでnginxとphp-fpmを機能させてから、次のものだけを含むランダムなページを提供します。

<?php
phpinfo();
php>

それが機能するようになったら、そこから進みます。

ここにあなたを助けるためのいくつかのリンクがあります: https://stackoverflow.com/questions/39901311/docker-ubuntu-bash-ping-command-not-foundhttps:// stackoverflow。 com/questions/30172605/how-to-get-into-a-docker-containerhttps://stackoverflow.com/questions/30151436/how-to-run-nginx-docker-container- with-custom-config

1
OpenBSDNinja