puma-dev가 Mac OSX에서 어떻게 작동하는지에 대해 코드화 조사를 진행하였다
개시하다
Rails 애플리케이션의 개발용 웹 서버인 puma-dev는 편리하기 때문에 무심코 사용하고 있다.하지만 그 구조에 대해서는 아직 블랙박스를 닦은 느낌이 없다.
그곳에서 공부도 겸하고, 실제 puma-dev의 인코딩을 읽으며 구조를 조사해 봤다.
조사의 주제
코드를 모두 읽는 것은 매우 어려운 일이기 때문에 나는puma-dev에 대해 궁금한 것을 두 가지 주제로 설정하여 조사했다.
전제 조건
컨디션
나는puma-dev가 리눅스에서도 이용할 수 있다고 생각하지만, 본 보도는 Mac OS X의 환경에서 조사하고 있다.
코드화 대상 창고
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
코드 대응부
~/Library/LaunchAgents/io.puma.dev.plist
을 작성합니다.-d
에서 지정한 도메인 이름test
도 여기에 있다.plist 파일에 반영~/Library/Logs/puma-dev.log
를 레코드 파일의 경로로 지정launchctl load
에 배치하다.서비스 시작 plist 파일설치 후 다음 명령을 통해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)을 만드는 파일$ 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 -install
Launch 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의 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을 요청하는 이름으로 해결localhost:443
일 경우 HTTPlocalhost:80
일 경우 명칭 해석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 s
와bundle 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 애플리케이션의 요구를 소통할 수 있게 되었습니다.끝맺다
대체로 조사를 했지만 코드를 읽으면서 행동을 조사함으로써 많은 이해를 했다고 생각한다.구글을 배울 수 있어서 정말 다행입니다.
Reference
이 문제에 관하여(puma-dev가 Mac OSX에서 어떻게 작동하는지에 대해 코드화 조사를 진행하였다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gotchane/items/96ba5485011277ee1fcb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)