[Rails] Nginx × Puma를 통합하는 방법

6440 단어 Railsnginxtech
네트워크에서 Nginx를 사용할 때 참조할 수 있는 설정이 이미 있음
그 설정이 왜 필요한지 자세한 건 몰라서 조사해봤어요.

컨디션

  • Amazon Linux2
  • Nginx version 1.18.0
  • ACM 및 ALB 사용
  • Nginx 구성 파일


    실제 제작된nginx의 설정 파일이 여기 있습니다.(부분 변경)
    위에서부터 순서대로 설명하다.
    upstream app {
      server unix:///var/www/rails/tmp/sockets/puma.sock fail_timeout=0;
     }
    
     server {
      listen 80 default_server;
      server_name _;
    
      location = / {
        proxy_pass http://app;
      }
    }
    
    server {
      listen 80;
      server_name example.com;
    
      error_log /var/www/rails/log/error.log;
      access_log /var/www/rails/log/access.log;
    
      root /var/www/rails/public;
    
      try_files $uri/index.html $uri.html $uri @app;
    
      location @app {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Forward_For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    
        proxy_pass http://app;
      }
    }
    

    UNIX 도메인 잭을 통한 연결


    먼저 Nginx와 Puma를 연결하는 설정을 적으십시오.
    upstream 상하문에서 백엔드 응용 프로그램 서버
    puma를 사용하는 전제이기 때문에 지정puma.sock하면 됩니다.
    upstream app {
      server unix:///var/www/rails/tmp/sockets/puma.sock fail_timeout=0;
    }
    
    이 upstream에 추가된 app라는 이름은 뒤에 서술된 proxy_pass 디렉터리에서 다시 사용됩니다.
    UNIX 도메인 네임플러그는 이 기사를 참조합니다.
    https://ascii.jp/elem/000/001/415/1415088/

    서버 상하문에서 외부로부터의 접근 방법을 설명합니다


    목록


    수신할 포트 번호를 지정합니다.
    특정 IP 주소에서만 요청을 받으려면 IPアドレス:ポート番号 와 같이 하십시오.
    쓸 줄 아는 것 같은데 아직 해 본 적이 없어요.

    server_name 디렉토리


    호스트 이름을 지정합니다.
    예제)
    192.168.0.1
    hogepiyo.com
    호스트 이름name과 일치하지 않는 설정을 설명할 때
    listen 디렉터리에 default_server 를 추가하면 이렇게 쓸 수 있습니다.
    server {
      listen 80 default_server;
      server_name _;
    
      location = / {
        proxy_pass http://app;
      }
    }
    
    ALB의 건강검진을 위해 기술한 것이다.건강검진 경로가 있으면location 경로를 사용하십시오.

    error_log,access_로그 디렉터리로 로그 저장하기


    이 기능은 로그 파일의 출력 대상 파일 이름을 설명합니다.

    루트 디렉토리


    문서 경로에 정적 내용 경로를 설정합니다.
    rails에서는 public 폴더입니다.
    root /var/www/rails/public
    

    try_파일 디렉토리


    파일의 존재 여부를 매개 변수 순서대로 검사하지 않으면 마지막 매개 변수를 처리합니다.
    파일을 찾지 못하면 웹 응용 프로그램에 전송하도록 설정했습니다.
    try_files $uri/index.html $uri.html $uri @app;
    

    위치 디렉토리


    URL의 각 경로 이름 설정을 location 디렉토리에 기술할 수 있습니다.
    @ 접두사를 사용하여 경로 이름을puma로 무관심하게 전송합니다.
    # ファイルがなければ、pumaへ
    try_files $uri/index.html $uri.html $uri @app;
    
    location @app {
      # 省略
    
      # proxy_passディレクティブで転送先のサーバを指定
      proxy_pass http://app;
    }
    

    proxy_redirect 디렉토리


    Location 헤더를 다시 쓰는 방법을 지정합니다.
    이번에는 다시 쓰지 않는 응답off을 지정했다.off를 제외하고는 default의 첫 번째 인자에서 다시 쓸 문자열과 두 번째 인자에서 다시 쓸 문자열을 지정할 수 있습니다.

    머리글 설정 추가


    아무것도 설정하지 않으면 웹 응용 프로그램에서nginx (프록시) 의 접근을 볼 수 있습니다
    기본적으로 고객이 요청한 헤더 정보는 백엔드로 직접 발송됩니다
    하지만 다시 써야 할 헤더 정보도 있으니 주의해야 한다.off 디렉터리를 사용하여 헤더 정보를 추가합니다.
    이번에 추가된 건 이거야.
    추가된 헤더 정보
    과업
    Host
    서버 호스트 이름입니다.upstream 이름으로 다시 쓸 수 있기 때문에 이번에nginx가 사용할 수 있는 변수 proxy_set_header 를 지정했습니다.
    X-Forwarded_For
    부하 밸런스나 프록시 서버를 통과할 때 송신원을 판별하기 위해 사용합니다.여러 가지 가능성이 있다.지정됨$host.
    X-Real_IP
    부하 밸런스나 프록시 서버를 통과할 때 송신원을 판별하기 위해 사용합니다.X-Forwarded_포와는 다르게 단 하나.지정됨$proxy_add_x_forwarded_for.
    X-Forwarded-Proto
    ALB를 SSL의 끝부분으로 사용하기 때문에 웹 애플리케이션에 보안 요청(https)을 전달할 수 없기 때문에 고객을 전달하기 위한 프로토콜$remote_addr을 지정$http_x_forwarded_proto했다.

    사용한nginx 변수


    변수 이름
    의향
    $uri
    매개 변수 요청 없음 URI
    $remote_addr
    클라이언트 IP 주소
    $host
    다음 우선순위에 따라 결정됩니다.요청 행 -> 호스트 헤더 필드 -> 요청과 일치하는 서버 이름
    $proxy_add_x_forwarded_for
    ALB는 EC2X-Forwarded-For: xxx.xxx.xxx.xxx로 전송되므로 참조하십시오.
    $http_x_forwarded_proto
    ALB는 EC2X-Forwarded-Proto: https로 전송되므로 참조하십시오.

    참조 페이지


    https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Forwarded-For
    https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Forwarded-Proto
    https://github.com/yandex/gixy/blob/master/docs/en/plugins/hostspoofing.md

    좋은 웹페이지 즐겨찾기