2017-09-17 8 views
0

バックエンドのプライベートネットワークで稼動するドッカーによって管理されるいくつかのマイクロサービスがあり、nginxによって管理される動的ルーティングを設定して、URIに基づいてマイクロサービスを選択します。ここから来るべき声明fastcgi_pass app:9000;から私はURIでパスの最初のセグメントからfastcgi_passディレクティブのドメイン名を取るためにnginxの必要Nginxはルートの下のサブフォルダに書き直します

  1. ので、「アプリ」:私は3つの質問を持っています: https://example.com/app/foo/bar。 URIのURIがhttps://example.com/another-app/foo/barの場合、この指示はfastcgi_pass another-app:9000;のようになります。このように動的に可能なのでしょうか、すべてのFastCGIサーバーに対して別の場所を作成する必要がありますか?

  2. 同じ最初のURIパスのセグメントに応じて、ルートの下のフォルダに書き直す必要もあります。私は設定を書きましたが、404エラーを受け取りました。私はnginxの初心者で、ちょうどnginxとphp-fpmのコンテナのパスが一致していないことに気付きました。 404エラーがこの事実に関連することはありますか?

  3. この種のルーティングはまったく可能ですか(詳細については、下記の設定を参照してください)。別のオプションは、すべてのマイクロサービス用に別の場所を作成することですが、マイクロサービスを追加または削除するたびにこの設定を変更する必要はありません。ここで

は私の設定です:ここでは

server { 
    server_name _; 
    root /services; 

    #rewrite to the subfolder under root depending on the first section in the path 
    rewrite ^/(\w+)(/|$) /$1/app_dev.php$is_args$args last; 

    location/{ 
     # try to serve file directly, fallback to app.php 
     try_files $uri /app_dev.php$is_args$args; 
    } 

    location ~ ^/(\w+)/(app_dev|config)\.php(/|$) { 
    #further rewrite to the /web subfolder with the front controller 
     rewrite ^/(\w+)/(app_dev|config)\.php(/|$) /$1/web/$2.php$is_args$args break; 

     fastcgi_pass media:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 

     fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 
     fastcgi_param DOCUMENT_ROOT $realpath_root; 
    } 

    location ~ \.php$ { 
     return 404; 
    } 

    error_log /var/log/nginx/error.log notice; 
    access_log /var/log/nginx/access.log; 
    rewrite_log on; 
} 

はログです:

backend_1 | 2017/09/17 20:03:54 [error] 8#8: *1 open() "/usr/share/nginx/html/media" failed (2: No such file or directory), client: 172.25.0.1, server: localhost, request: "GET /media HTTP/1.1", host: "localhost:8082" 
backend_1 | 172.25.0.1 - - [17/Sep/2017:20:03:54 +0000] "GET /media HTTP/1.1" 404 571 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" "-" 

もう一つの問題は、私はそれがあったかもしれない推測、任意の書き換えのログが表示されないということですいずれの位置も一致しないという事実に関連している。

+0

microserviceはJSONまたはhtmlの形式で返信していますか? htmlのためにサービスがベースURLを期待する必要があるので –

+0

@ TarunLalwani JSONのみ – Sergey

答えて

0

で可能です私は別のドッキングウィンドウコンテナ内のアプリケーションにリクエストをルーティングできるように、次のnginxの設定を作ってみました。おかげ@TarunLalwaniヒントについて:

server { 
    server_name _; 

    location ~ ^/(?P<service>\w+)(/|$) { 
     root /services/$service/web; 

     rewrite^/app_dev.php$is_args$args break; 

     resolver 127.0.0.11; 
     fastcgi_pass $service:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 

     fastcgi_param SCRIPT_FILENAME /app/web/app_dev.php; 
     fastcgi_param DOCUMENT_ROOT /app/web; 
    } 

    location ~ \.php$ { 
     return 404; 
    } 

    error_log /var/log/nginx/error.log debug; 
    access_log /var/log/nginx/access.log; 
    rewrite_log on; 
} 

アプリケーションのルートもmicroserviceの名前に一致する接頭辞を必要とする、私は(私はsymfonyのを使用しています)ファイルapp/config/routing.ymlでそれを追加しました:

app: 
    resource: '@AppBundle/Controller/' 
    type: annotation 
    prefix: /media 

マイクロサービスのコードは、アプリケーションのコンテナから/ servicesディレクトリにあるnginxコンテナにマウントされます。 nginxのコンテナとアプリケーションのコンテナの絶対パスが一致しないため、fastcgiパラメータを使用してマップされます。

1

だからこれは、単一の場所のブロック自体

location ~ ^/(?P<app>\w+)/(app_dev|config)\.php(/|$) { 
#further rewrite to the /web subfolder with the front controller 
    rewrite ^/(\w+)/(app_dev|config)\.php(/|$) /$1/web/$2.php$is_args$args break; 

    fastcgi_pass $app:9000; 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 

    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 
    fastcgi_param DOCUMENT_ROOT $realpath_root; 
} 
関連する問題