puma-dev가 Mac OSX에서 어떻게 작동하는지에 대해 코드화 조사를 진행하였다

6613 단어 puma-devGopumaRails

개시하다


Rails 애플리케이션의 개발용 웹 서버인 puma-dev는 편리하기 때문에 무심코 사용하고 있다.하지만 그 구조에 대해서는 아직 블랙박스를 닦은 느낌이 없다.
그곳에서 공부도 겸하고, 실제 puma-dev의 인코딩을 읽으며 구조를 조사해 봤다.

조사의 주제


코드를 모두 읽는 것은 매우 어려운 일이기 때문에 나는puma-dev에 대해 궁금한 것을 두 가지 주제로 설정하여 조사했다.
  • puma-dev의 초기 설정에서 무엇을 합니까?
  • 웹 브라우저에서 요청을 제출할 때puma-dev는 무엇을 합니까?
  • 전제 조건


    컨디션


    나는puma-dev가 리눅스에서도 이용할 수 있다고 생각하지만, 본 보도는 Mac OS X의 환경에서 조사하고 있다.
  • Mac OS X 10.13.3
  • puma-dev v0.11
  • 코드화 대상 창고


    2018/4/19시 최신 release v0.11의 puma-dev를 Codriding 객체로 사용합니다.
    puma-dev라서 루비인 줄 알았는데 구글에 써있어요.그러나 쉽게 읽을 수 있는 CLI 툴로 구성되었습니다.

    조사제목1:puma-dev의 초기 설정은 무엇입니까?


    우선 puma-dev를 사용하기 전의 초기 설정에서 무엇을 하고 있는지 조사했다.
    대략puma-dev를 사용할 때 다음 명령을 실행할 것입니다.
    각자의 지령으로 무엇을 하고 있는지 대충 확인하다.
    $ puma-dev -install -d test
    $ sudo puma-dev -setup
    $ cd /path/to/app
    $ puma-dev link -n app_name
    $ puma-dev -uninstall
    

    명령:puma-dev-istall-d test


    코드 대응부
  • Launch Agents 설정 파일~/Library/LaunchAgents/io.puma.dev.plist을 작성합니다.-d에서 지정한 도메인 이름test도 여기에 있다.plist 파일에 반영
  • ~/Library/Logs/puma-dev.log를 레코드 파일의 경로로 지정
  • launchctl load에 배치하다.서비스 시작 plist 파일
  • puma-dev는 Mac의 LaunchAgents를 사용하는데 프로세스가 자동으로 시작되는 것 같습니다.
    설치 후 다음 명령을 통해puma-dev의 프로세스가 존재하는지 확인할 수 있습니다.
    $ ps x | grep puma-dev
    1086   ??  S      1:14.41 /usr/local/Cellar/puma-dev/0.11/bin/puma-dev -launchd -dir ~/.puma-dev -d test -timeout 15m0s
    

    명령:puma-dev-setup


    코드 대응부
  • etcDir에서 지정한 디렉터리/etc/resolver의 소유자를puma-dev 명령을 실행하는 사용자로 변경
  • /etc/resolver 다음에 DNS 이름 해석용 도메인 이름(test)을 만드는 파일
  • Resolver를 사용하여 로컬 Mac에puma-dev용 DNS 서버 설정을 추가했습니다.다음 명령을 사용하여 확인할 수 있습니다.
    $ cat /etc/resolver/test
    # Generated by puma-dev
    nameserver 127.0.0.1
    port 9253
    

    명령:puma-dev-stop


    코드 대응부

  • 실행pkill -USR1 puma-dev,puma-dev 프로세스 다시 시작
  • puma-dev -installLaunch Agent에 상시 부팅 프로세스로 등록되어 있으므로 프로세스를 재부팅하지 않는 것으로 간주됩니다.

    명령:puma-dev link-n appname


    코드 대응부
  • -n 옵션으로 지정한 파일 이름으로 기호 링크 만들기
  • ~/.puma-dev/app_name처럼 기호 링크를 만들면 명령을 실행하는 디렉터리나 -n app_name 다음에 설정한 디렉터리 경로에 연결
  • 코드만 읽으면 간단한 기호 링크만 만든 것 같다.

    명령:puma-dev-uninstall


    코드 대응부
  • launchctl unload에서puma-dev 프로세스 정지

  • 삭제~/Library/LaunchAgents/io.puma.dev.plist
  • /etc/resolver 다음 파일 삭제
  • 마운트 해제이기 때문에puma-dev에 사용할 설정 파일을 삭제해야 할 것 같습니다.
    이외의 말,puma-dev 프로세스를 멈추고 싶으면 다음 명령을 실행할 수 있습니다.
    (※ puma-dev의 issue에도 적혀 있습니다.)
    $ launchctl unload ~/Library/LaunchAgents/io.puma.dev.plist
    

    조사제목2: 웹 브라우저에서 요청을 할 때puma-dev는 무엇을 합니까?


    대체적으로puma-dev의 설정이 무엇을 하는지 확인할 수 있기 때문에 다음으로puma-dev를 실제로 활용했을 때의 행동을 조사했다.

    개요도


    우선, 나는puma-dev의 코드와 과정의 행위를 검사함으로써 이해한 내용을 그림으로 만들었다.
  • 웹 브라우저https://XXX.test에서 URL로 요청
  • /etc/resolver/test에 정의된 설정을 바탕으로puma-dev 과정 중의 DNS 서버에서 URL을 요청하는 이름으로 해결
  • puma-dev 과정 중의 DNS 서버에서 HTTPSlocalhost:443일 경우 HTTPlocalhost:80일 경우 명칭 해석
  • puma-dev 과정 중의 HTTP/HTTPS 서버에서 UNIX 필드 플러그인 통신을 사용하는puma 프로세스 시작/요청
  • puma가 요청에 응답하여 Rails에 요청
  • 이를 바탕으로 웹 브라우저의 요구 사항을 대략적으로 살펴보고 싶습니다.

    1~2의 행동


    웹 브라우저https://XXX.test의 URL에서 요청하면 DNS의 이름을 먼저 해결해 보십시오.
    복습puma-dev -install -d test에서 만든 파일을 복습할 때 IP 주소127.0.0.1:9253를 지정하여 명칭을 해결하려고 합니다.
    # Generated by puma-dev
    nameserver 127.0.0.1
    port 9253
    
    포트 9253 번호는puma-dev 기본 DNS 서버의 포트 번호로 설정됩니다.

    2~3의 행동

    127.0.0.1:9253 DNS 이름 해결 요청은 LaunchAgents에서 항상 시작되는puma-dev 프로세스에 대해 수행됩니다.
    puma-dev 프로그램이 시작되었는지 다시 확인하십시오.
    $ ps x | grep puma-dev
    1086   ??  S      1:14.41 /usr/local/Cellar/puma-dev/0.11/bin/puma-dev -launchd -dir ~/.puma-dev -d test -timeout 15m0s
    
    또한 LISTEN에서 puma-dev의 포트 번호를 확인합니다.9253 및 http/https의 포트가 LINSTEN임을 알 수 있습니다.(http/https에 대해서는 잠시 후 요약)
    9253호 포트에 통신이 있으면puma-dev 프로세스에서 통신을 한다는 뜻이다.
    따라서 puma-dev 프로세스가 DNS 서버로 요청될 것으로 예상됩니다.
    $ lsof -i | grep puma-dev
    puma-dev   1086 gotchane    5u  IPv4 0x7ab086f0e36ca1fd      0t0  TCP localhost:9253 (LISTEN)
    puma-dev   1086 gotchane    7u  IPv4 0x7ab086f0cff974d5      0t0  UDP localhost:9253
    puma-dev   1086 gotchane    8u  IPv4 0x7ab086f0e36991fd      0t0  TCP *:http (LISTEN)
    puma-dev   1086 gotchane   11u  IPv4 0x7ab086f0e36925dd      0t0  TCP *:https (LISTEN)
    
    실제 코드도 읽어봤는데 발췌한 곳에 LISTEN이 요청한 처리가 적혀 있는 것 같아요.
    puma-dev의 http/https 포트에도 LISTEN이 있기 때문에 팟캐스트는 그렇게 puma-dev의 http/https 서버로 옮겨진다고 생각합니다.

    3~5가지 행동


    여기서는 http/https 서버에서 Rails 애플리케이션을 시작하는 방법에 대해 살펴보았습니다.
    (※ puma-dev를 통해 여러 앱에 로그인할 때 전환 처리 등도 있지만, 이 부분은 좀 복잡해 생략합니다. 조만간 추가 예정)
    Rails 애플리케이션에서 시작된 프로세스는 다음 발췌문에 설치되어 있습니다.
    읽어보면 알 수 있습니다. 이 코드에는 UNIX 필드 플러그인 통신으로puma를 시작하는 명령이 정의되어 있습니다.
    아래 명령의 부분만 발췌하다.-b unix:%s라고 쓰여 있기 때문에 bind 형식으로 시작된 UNIX 도메인 소켓 통신의 파일 경로를 알 수 있습니다.
    const executionShell = `exec bash -c '
    cd %s
    if test -e ~/.powconfig; then
        source ~/.powconfig
    fi
    if test -e .env; then
        source .env
    fi
    if test -e .powrc; then
        source .powrc
    fi
    if test -e .powenv; then
        source .powenv
    fi
    if test -e Gemfile && bundle exec puma -V &>/dev/null; then
        exec bundle exec puma -C $CONFIG --tag puma-dev:%s -w $WORKERS -t 0:$THREADS -b unix:%s
    fi
    exec puma -C $CONFIG --tag puma-dev:%s -w $WORKERS -t 0:$THREADS -b unix:%s'
    `
    
    여기에 서면 특히rails sbundle exec puma 등 지령은 따로 집행할 필요가 없고puma-dev가 집행한 것으로 알 수 있다.
    puma 프로세스를 확인한 후에 puma가 UNIX 필드 플러그인 통신 파일을 만들고 있다는 것을 알 수 있을 것 같습니다.
    $ ps x | grep puma  
     1086   ??  S      1:15.38 /usr/local/Cellar/puma-dev/0.11/bin/puma-dev -launchd -dir ~/.puma-dev -d test -timeout 15m0s
    80819   ??  S      5:28.50 puma 3.6.2 (unix:/Users/gotchane/.puma-dev/sample_app/tmp/puma-dev-1086.sock) [puma-dev:sample_app]
    
    여기서 드디어 Rails 애플리케이션의 요구를 소통할 수 있게 되었습니다.

    끝맺다


    대체로 조사를 했지만 코드를 읽으면서 행동을 조사함으로써 많은 이해를 했다고 생각한다.구글을 배울 수 있어서 정말 다행입니다.

    좋은 웹페이지 즐겨찾기