2017-09-17 1 views
0

백엔드 사설망에서 실행되는 docker에 의해 관리되는 마이크로 서비스가 몇 개 있으며 nginx가 관리하는 동적 라우팅을 설정하여 URI를 기반으로 마이크로 서비스를 선택합니다. 여기에서 와야 문 fastcgi_pass app:9000;에서 나는 URI에서 경로의 첫 번째 세그먼트에서 fastcgi_pass 지침의 도메인 이름을 취할 nginx를 필요Nginx는 루트 아래의 하위 폴더로 다시 작성합니다.

  1. , 그래서 "응용 프로그램"나는 세 가지 질문을 가지고 : https://example.com/app/foo/bar. URI에 https://example.com/another-app/foo/bar URI가있는 경우 지시문은 fastcgi_pass another-app:9000;처럼 보일 것입니다.이 방법은 동적으로 가능합니까 아니면 모든 FastCGI 서버마다 별도의 위치를 ​​만들어야합니까?

  2. 동일한 첫 번째 URI 경로의 세그먼트에 따라 루트 아래에있는 폴더로 다시 작성해야합니다. 구성을 작성했지만 404 오류가 발생했습니다. 나는 nginx의 초보자이고 nginx와 php-fpm 컨테이너의 경로가 일치하지 않는다는 것을 알아 차렸다. 404 오류가이 사실과 관련 될 수 있습니까?

  3. 이러한 종류의 라우팅이 가능합니까 (자세한 내용은 아래 설정 참조)? 또 다른 옵션은 모든 마이크로 서비스에 대해 별도의 위치를 ​​만드는 것이지만, 마이크로 서비스를 추가하거나 제거 할 때마다이 구성을 변경하고 싶지는 않습니다.

    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" "-" 
    

    또 하나의 문제는 내가이되었을 수 있습니다 추측, 어떤 재 작성 로그를 볼 수 없다는 것입니다 : 여기

    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; 
    } 
    

    로그입니다 : 여기

내 설정이다 두 위치가 일치하지 않는다는 사실과 관련이 있습니다.

+0

microservice가 JSON 또는 html 형태로 회신하고 있습니까? 왜냐하면 html 서비스가 기본 URL을 기대해야하기 때문입니다. –

+0

@TarunLalwani JSON 만 – Sergey

답변

0

내가 다른 고정 표시기 컨테이너 응용 프로그램에 대한 요청을 라우팅 할 수 있도록 다음의 nginx 설정을 마련했습니다 단일 위치 블록에 가능하다. 힌트 주셔서 감사합니다 @TarunLalwani :

경로도 microservice의 이름에 접두사 일치를 필요로하는 응용 프로그램은, 내가 파일 app/config/routing.yml (I 심포니를 사용하고 있습니다)에 추가했습니다
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; 
} 

:

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

마이크로 서비스의 코드는 nginx 컨테이너의 apps 컨테이너에서/services 디렉토리 아래에 마운트됩니다. 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; 
} 
관련 문제