ELB (https) + nginx에서 상태 확인이 발생하는 문제

5292 단어 nginxelb
SSL이 필요한 간단한 페이지를 실행할 때 ELB의 무료 SSL 인증서를 사용할 때 빠져 나온 이야기

구성



간단한 그림입니다.


  • ec2의 전단에 ELB
  • HTTPS (SSL)는 ELB 지원
  • ec2에 대한 액세스는 http
  • http -> https 로의 리디렉션은 nginx 측에서 대응
  • ec2는 1대만

  • 문제가 발생한 설정



    h tp : // 쿠이타. 이 m/s의 구치/있어 ms/f5cb67592f87942480d
    소개, 이 기사를 참고로 다음과 같이 설정했습니다.
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  example.com;  # 利用するドメインを設定
    
            # アクセスが http なら https としてリダイレクト
            if ($http_x_forwarded_proto != https) {
                return 301 https://$host$request_uri;
            }
    
            location / {
                    root /var/www/index/;
                    index index.html;
            }
        }
    

    이제 한 번은 잘 작동했지만 잠시 후 페이지에 액세스 할 수 없으며 503 Service Unavailable: Back-end server is at capacity라는 상태가 반환되어 더 이상 표시 할 수 없습니다.
    분명히 ELB의 상태 확인이 끝나고 ec2가 제거 된 것 같습니다.

    원인



    헬스 체크 자체는 http 로 가고 있었으므로, $http_x_forwarded_proto 는 http.
    https 로의 리디렉션의 조건에 합치해, 상태 코드 301 을 돌려주었으므로 헬스 체크로 fail 판정이 되어 제외되었다.
    라는 것이 원인이라고 추측되었습니다.

    대처



    대처는 몇 가지 생각할 수 있습니다.
  • 상태 확인을위한 라우팅 추가 (/healthcheck 등)
  • 다른 포트에서 Server 컨텍스트 추가
  • default_server와 server_name으로 다른 server 컨텍스트를 생성하고 분리합니다.

    그 밖에도 방법은 여러가지일까 생각합니다.

    여기서는 최후의 default_server 와 server_name 로 다른 server 문맥 작성해 나누는 방법으로 대응했습니다.
    기존 도메인 지정 서버 컨텍스트 default_server를 제거하고 상태 확인을 위해 1px gif를 반환하는 컨텍스트를 추가합니다.
        # health check 用 (とにかく 200 を返せれば OK)
        server {
            listen 80 default_server;
            listen [::]:80 default_server;
            root   /usr/share/nginx/html;
    
            location / {
                    # empty_gif というモジュールで 1x1 の透過 gif を返します
                    empty_gif;
                    access_log off;
                    break;
            }
        }
    
        server {
            # default_server を削除
            listen       80;
            listen       [::]:80;
            server_name  example.com;  # 利用するドメインを設定
    
            # アクセスが http なら https としてリダイレクト
            if ($http_x_forwarded_proto != https) {
                return 301 https://$host$request_uri;
            }
    
            location / {
                    root /var/www/index/;
                    index index.html;
            }
        }
    

    이제 문제없이 가동하게 되었습니다.

    단, 위의 설정은 IP 직접 액세스하면 1px gif가 표시됩니다.
    대응한 이슈가 폐쇄된 사이트에서 IP로 액세스할 필요가 전무이기 때문에 이러한 설정이 되었습니다만, IP에서도 도메인에서도 동일하게 액세스시키고 싶은 경우는, 헬스 체크를 고려한 설정을 생각할 필요가 있다고 생각합니다.
  • 좋은 웹페이지 즐겨찾기