AWS에서 동작하는 Web Application Server의 Timeout설정

Local 환경

  • Browser나 PostMan, Eclipse 등에서도 서버로 부터 응답이 없으면 멈추는 Timeout설정이 있으니 반드시 체크할 것

API Gateway

  • 29~50초가 기본
  • 수정 불가: AmazonAWS Docs

    504 Gateway Timeout
    
    {
      "message": "Endpoint request timed out"
    }
    

Load Balancer

  • 60초가 기본
  • 응답 헤더에 특별한 내용 없음

    504 GATEWAY_TIMEOUT
    
    Cache-Control →proxy-revalidate
    Connection →Keep-Alive
    Content-Length →0
    Date →Fri, 16 Mar 2018 10:23:28 GMT
    
  • Load Balancer의 Description > Attributes > Idle timeout 수정

Nginx reverse proxy

  • 60초가 기본
  • 응답 해더 정보의 Server항목에 nginx/1.x.x(버전) 라고 표시됨(서버 정보를 일부러 숨긴 경우는 안 나올 수 있음)
    • 깨알 Tip : server_tokens off; 를 ebextensions를 이용해 삽입하면 서버 버전이 보이지 않음
  • ebextensions을 이용해 nginx 서버 설정 변경
    • location 설정 아래에 다음과 같은 설정값 입력: StackOverflow: Nginx reverse proxy causing 504 Gateway Timeout
      Proxy설정 및 기본세팅
      proxy_connect_timeout       300;
      proxy_send_timeout          300;
      proxy_read_timeout          300;
      send_timeout                300;
      
    • “location /” 설정은 http항목 아래의 server 항목에 삽입되어야 하므로 elasticbeanstalk 폴더 아래에 넣자
    • 설정 파일자의 위치는 다음을 참고: AmazonAWS Docs
      ~/workspace/my-app/
      |-- .ebextensions
      |   `-- nginx
      |       `-- conf.d
      |           |-- elasticbeanstalk
      |           |   `-- 00_application.conf
      |           |   `-- 01_static.conf
      |           |   `-- my-server-conf.conf
      |           `-- my-http-conf.conf
      `-- WEB-INF
      
  • 주의 사항
    • “location /” 설정은 이미 00_application.conf에 되어 있으므로, 다른 이름의 .conf파일로 만들면 중복오류 발생
      [2018-03-16T03:40:13.046Z] ERROR [10436] : Command execution failed: Activity failed. (ElasticBeanstalk::ActivityFatalError)
      caused by: Executing: /opt/elasticbeanstalk/bin/log-conf -n nginx -l'/var/log/nginx/*'
      
      Executing: /usr/sbin/nginx -t -c /var/elasticbeanstalk/staging/nginx/nginx.conf
      nginx: [emerg] duplicate location "/" in /var/elasticbeanstalk/staging/nginx/conf.d/elasticbeanstalk/02_timeout.conf:1
      nginx: configuration file /var/elasticbeanstalk/staging/nginx/nginx.conf test failed
      Failed to execute '/usr/sbin/nginx -t -c /var/elasticbeanstalk/staging/nginx/nginx.conf'
      Failed to execute '/usr/sbin/nginx -t -c /var/elasticbeanstalk/staging/nginx/nginx.conf' (ElasticBeanstalk::ExternalInvocationError)
      caused by: Executing: /opt/elasticbeanstalk/bin/log-conf -n nginx -l'/var/log/nginx/*'
      
    • 00_application.conf 파일을 덮어 쓰도록 하자!
      location / {
          proxy_pass          http://127.0.0.1:8080;
          proxy_http_version  1.1;
      
          proxy_set_header    Connection          $connection_upgrade;
          proxy_set_header    Upgrade             $http_upgrade;
          proxy_set_header    Host                $host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
          proxy_connect_timeout       300;
          proxy_send_timeout          300;
          proxy_read_timeout          300;
          send_timeout                300;
      }
      
  • 참고사항
    • 실제 EC2에 설치된 nginx의 설정(nginx.conf), 2018년 03월 버전, 향후 업데이트될 수 있음
      # Elastic Beanstalk Nginx Configuration File
        user                    nginx;
        error_log               /var/log/nginx/error.log warn;
        pid                     /var/run/nginx.pid;
        worker_processes        auto;
        worker_rlimit_nofile    19448;
      
        events {
            worker_connections  1024;
        }
      
        http {
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
      
            log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for"';
      
            include       conf.d/*.conf;
      
            map $http_upgrade $connection_upgrade {
                default     "upgrade";
            }
      
            server {
                listen        80 default_server;
                access_log    /var/log/nginx/access.log main;
      
                client_header_timeout 60;
                client_body_timeout   60;
                keepalive_timeout     60;
                gzip                  on;
                gzip_comp_level       4;
                gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
      
                # Include the Elastic Beanstalk generated locations
                include conf.d/elasticbeanstalk/*.conf;
            }
        }
      
    • .ebextensions/nginx/conf.d/ 파일은 EC2의 /etc/nginx/conf.d 로 복사됨
      • conf.d 폴더의 파일들은 http항목에 include됨
    • .ebextensions/nginx/conf.d/elasticbeanstalk/ 파일은 EC2의 /etc/nginx/conf.d/elasticbeanstalk 로 복사됨
      • elaticbeanstalk 폴더의 파일들은 server항목에 include됨
      • location 설정은 server아래에 있으므로 이 폴더에 넣어야 함
      • 설정이 겹치거나 문법이 틀리면 서버 로딩시 에러 발생 (logs의 /var/log/eb-commandprocessor.log항목)
    • nginx.conf를 통째로 override하는 방법도 존재
      • 본문에 첨부한 nginx.conf를 완전히 수정한 후, 다음 path에 두고 deploy
        ~/workspace/my-app/
        |-- .ebextensions
        |   `-- nginx
        |       `-- nginx.conf
        `-- WEB-INF
        
    • 참고: AmazonAWS Docs

Tomcat server.xml

  • 60000밀리초(주의!)가 기본
  • Connector connectionTimeout=”60000” 부분을 바꾸면 된다고 하나 엄밀히 말하면 다른 개념이라고 함
  • Connector keepAliveTimeout=”60000” 일까?
    • connectionTimeout 값을 기본으로 가짐. 즉, connectionTimeout을 수정하면 되긴 함: Tomcat Docs
  • 이렇게 바꾼 것을 서버에 적용하기 위해서는 추가적인 ebextensions 파일이 필요
  • 그!러!나! 안됨!!

Application(Spring Framework)

  • 여기도 뭔가 있지만 생략