NGINX Unit 구성 관리(Configuration Management)
Unit의 구성(configuration)은 JSON 기반이며 제어 소켓(control socket)을 통해 액세스되며 HTTP를 통해 완전히 관리할 수 있습니다.
Note
여기에서 curl을 사용하여 이 유틸리티에서 예상한 대로 URI에 http://localhost 접두사(prefixing)를 붙이고 Unit의 제어(control) API를 쿼리(query)합니다. HTTP 요청을 할 수 있는 모든 도구를 사용할 수 있습니다. 또한 호스트 이름은 Unit과 관련이 없습니다. Unit을 수동으로 구성하는 경우가 많으면 jq 및 jo와 같은 JSON 명령줄 도구가 유용할 수 있습니다.
구성의 일부를 처리하려면 HTTP를 통해 제어 소켓(control socket)을 쿼리(query)하십시오. API에 대한 요청의 URI 경로 세그먼트는 해당 JSON 객체(object) 멤버의 이름 또는 JSON 배열(array) 요소의 인덱스여야 합니다.
다음 HTTP 메서드(methods)를 사용하여 API를 조작(manipulate)할 수 있습니다.
Method | Action |
GET | 요청 URI의 엔터티를 HTTP 응답 본문의 JSON 값으로 반환(Return)합니다. |
POST | HTTP 요청 본문의 JSON 값을 추가하여 요청 URI에서 배열을 업데이트(Update)합니다. |
PUT | 요청 URI에서 엔터티를 교체(Replace)하고 HTTP 응답 본문에 상태 메시지를 반환합니다. |
DELETE | 요청 URI에서 엔터티를 삭제(Delete)하고 HTTP 응답 본문에 상태 메시지를 반환합니다. |
변경하기 전에 Unit은 전체 구성(Configuration)에서 차이를 확인합니다. 아무것도 없으면 아무 것도 수행되지 않습니다. 따라서 변경되지 않은 구성을 다시 업로드하여 앱을 다시 시작할 수 없습니다. 그래도 다른 방법이 있습니다.
Unit는 실제 재구성(reconfiguration) 단계를 가능한 한 우아하게 수행합니다. 실행 중인 작업이 자연스럽게 만료되고 연결이 제대로 닫히고 프로세스가 원활하게 종료됩니다.
올바른 JSON을 제공하면 모든 유형의 업데이트를 다른 URI로 수행할 수 있습니다.
# curl -X PUT -d '{ "pass": "applications/blogs" }' --unix-socket \
/path/to/control.unit.sock http://localhost/config/listeners/127.0.0.1:8300
# curl -X PUT -d '"applications/blogs"' --unix-socket /path/to/control.unit.sock \
http://localhost/config/listeners/127.0.0.1:8300/pass
그러나 첫 번째 명령은 전체 listener를 교체하여 구성할 수 있는 다른 옵션을 삭제하는 반면 두 번째 명령은 pass
값만 교체(replace)하고 다른 옵션은 그대로 둡니다.
예제
오타(typos)와 노력(effort)을 최소화하려면 명령(command)에 JSON 페이로드(payload)를 포함하지 마십시오. 대신 검토(review) 및 재사용(reuse)을 위해 구성 스니펫(configuration snippet)을 저장하십시오. 예를 들어 application object를 wiki.json
으로 저장합니다.
{
"type": "python",
"module": "wsgi",
"user": "www-wiki",
"group": "www-wiki",
"path": "/www/wiki/"
}
이를 사용하여 wiki-prod
라는 application을 설정합니다.
# curl -X PUT --data-binary @/path/to/wiki.json \
--unix-socket /path/to/control.unit.sock http://localhost/config/applications/wiki-prod
이를 다시 사용하여 wiki-dev
라는 동일한 앱의 개발 버전을 설정합니다.
# curl -X PUT --data-binary @/path/to/wiki.json \
--unix-socket /path/to/control.unit.sock http://localhost/config/applications/wiki-dev
wiki-dev
앱을 다른 소스 코드(source code) 디렉토리로 전환합니다.
# curl -X PUT -d '"/www/wiki-dev/"' \
--unix-socket /path/to/control.unit.sock http://localhost/config/applications/wiki-dev/path
다음으로, 프로덕션 앱의 프로세스 수를 늘려 약간 워밍업하십시오.
# curl -X PUT -d '5' \
--unix-socket /path/to/control.unit.sock http://localhost/config/applications/wiki-prod/processes
모든 host IP에서 요청(request)을 수락하도록 wiki-prod
앱에 대한 listener를 추가합니다.
# curl -X PUT -d '{ "pass": "applications/wiki-prod" }' \
--unix-socket /path/to/control.unit.sock 'http://localhost/config/listeners/*:8400'
wiki-dev
앱을 리스너에 연결하여 테스트합니다.
# curl -X PUT -d '"applications/wiki-dev"' --unix-socket /path/to/control.unit.sock \
'http://localhost/config/listeners/*:8400/pass'
그런 다음 listener를 다시 연결하여 앱의 개발 버전에 URI 기반 경로를 추가합니다.
$ cat << EOF > config.json
[
{
"match": {
"uri": "/dev/*"
},
"action": {
"pass": "applications/wiki-dev"
}
}
]
EOF
# curl -X PUT --data-binary @config.json --unix-socket \
/path/to/control.unit.sock http://localhost/config/routes
# curl -X PUT -d '"routes"' --unix-socket \
/path/to/control.unit.sock 'http://localhost/config/listeners/*:8400/pass'
다음으로, index (0)를 사용하여 route
배열에서 wiki-dev
의 URI 접두사를 변경합니다.
# curl -X PUT -d '"/development/*"' --unix-socket=/path/to/control.unit.sock \
http://localhost/config/routes/0/match/uri
prod 앱에 경로 추가: POST
는 항상 array 끝에 추가되므로 인덱스가 필요하지 않습니다.
# curl -X POST -d '{"match": {"uri": "/production/*"}, \
"action": {"pass": "applications/wiki-prod"}}' \
--unix-socket=/path/to/control.unit.sock \
http://localhost/config/routes/
그렇지 않으면 배열의 마지막 인덱스(샘플에서는 0)에 1을 더한 PUT
을 사용하여 끝에 새 항목을 추가합니다.
# curl -X PUT -d '{"match": {"uri": "/production/*"}, \
"action": {"pass": "applications/wiki-prod"}}' \
--unix-socket=/path/to/control.unit.sock \
http://localhost/config/routes/1/
전체 config
섹션을 얻으려면:
# curl --unix-socket /path/to/control.unit.sock http://localhost/config/
{
"listeners": {
"*:8400": {
"pass": "routes"
}
},
"applications": {
"wiki-dev": {
"type": "python",
"module": "wsgi",
"user": "www-wiki",
"group": "www-wiki",
"path": "/www/wiki-dev/"
},
"wiki-prod": {
"type": "python",
"processes": 5,
"module": "wsgi",
"user": "www-wiki",
"group": "www-wiki",
"path": "/www/wiki/"
}
},
"routes": [
{
"match": {
"uri": "/development/*"
},
"action": {
"pass": "applications/wiki-dev"
}
},
{
"action": {
"pass": "applications/wiki-prod"
}
}
]
}
wiki-dev
application object를 얻으려면:
# curl --unix-socket /path/to/control.unit.sock \
http://localhost/config/applications/wiki-dev
{
"type": "python",
"module": "wsgi",
"user": "www-wiki",
"group": "www-wiki",
"path": "/www/wiki-dev/"
}
업데이트(update) 또는 검토(review)를 위해 .json 파일과 같은 요청에서 반환된(returned) JSON을 저장할 수 있습니다.
# curl --unix-socket /path/to/control.unit.sock \
http://localhost/config/ > config.json
*:8400에서 listener를 삭제(drop)하려면:
# curl -X DELETE --unix-socket /path/to/control.unit.sock \
'http://localhost/config/listeners/*:8400'
listener가 여전히 참조하는 경로와 같이 다른 객체가 의존하는 객체는 삭제할 수 없습니다.
# curl -X DELETE --unix-socket /var/run/unit/control.sock \
http://localhost/config/routes
{
"error": "Invalid configuration.",
"detail": "Request \"pass\" points to invalid location \"routes\"."
}
Unit 구성 복제(Configuration Replicating)
Unit은 완전히 동적이지만 때로는 후속 개입 없이 기존 설정을 복사하고 싶을 때가 있습니다. Unit의 state directories는 이를 생성한 동일한 버전의 Unit에서 사용하는 경우 상호 교환 가능하므로 바로 가기를 사용하여 Unit 인스턴스를 복제할 수 있습니다.
Warning
Unit의 상태는 버전 간에 구조를 변경할 수 있으며 외부 수단으로 편집해서는 안 됩니다.
참조 Unit 인스턴스가 실행되는 시스템에서 상태가 저장된 위치를 찾습니다.
$ unitd -h
--state DIRECTORY set state directory name
default: "/path/to/reference/unit/state"
상태 위치(state location)가 시작 시 재정의(overridden)되지 않았는지 다시 확인하십시오.
$ ps ax | grep unitd
...
unit: main v1.28.0 [unitd --state /runtime/path/to/reference/unit/state ... ]
두 번째 머신에서 이 명령을 반복하여 대상 인스턴스가 상태를 저장하는 위치를 확인합니다.
두 Unit 인스턴스를 모두 중지합니다. 예를 들면 다음과 같습니다.
# systemctl stop unit
Note
Unit이 비공식 리포지토리(non-official)에서 설치되었거나 소스(source)에서 빌드된 경우 중지 및 시작 명령이 다를 수 있습니다.
임의의 방법으로 참조 상태 디렉토리를 대상 상태 디렉토리에 복사합니다. 하위 디렉토리와 숨김 파일을 포함해야 합니다. 마지막으로 두 Unit 인스턴스를 다시 시작합니다.
# sudo systemctl restart unit
Unit 인스턴스를 수동으로 실행하는 경우 –state를 사용하여 시작 시 상태 디렉터리를 설정할 수 있습니다.
다시 시작한 후 대상 인스턴스는 상태 디렉터리에 복사한 구성을 선택합니다.