nginx unit - 차세대 application server


nginx unit 은 nginx 의 기술을 기반으로 Web Application Server 를 추가한 제품입니다.


설치

CentOS/Rocky Linux

에디터로 /etc/yum.repos.d/unit.repo 파일을 만들고 다음 내용을 추가합니다.

[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1


nginx unit core 를 설치합니다.

$ sudo yum install unit


사용하는 개발 언어에 맞는 모듈을 설치합니다. 다음은 모든 WAS 모듈인 go, java, perl, php, python2,3 모듈을 설치하는 예입니다.

$ sudo yum install unit-devel unit-go unit-jsc8 unit-jsc11 \
      unit-perl unit-php unit-python27 unit-python36

nginx unit은 CentOS 용 ruby 모듈을 제공하지 않습니다.


사용하는 언어가 정해져 있다면 해당 모듈만 설치하는 게 좋습니다. 다음은 php 와 python3 모듈만 설치합니다.

sudo yum install unit-php unit-python36


Ubuntu

LTS 20.04 기준입니다. 다른 버전을 사용할 경우 Installation — NGINX Unit 를 참고하세요.


1. nginx 서명 키를 import 하고 저장소를 추가합니다.

$ sudo curl -sL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -


2. 저장소 설정인 /etc/apt/sources.list.d/unit.list 파일을 만들고 다음 내용을 추가합니다.

deb https://packages.nginx.org/unit/ubuntu/ focal unit
deb-src https://packages.nginx.org/unit/ubuntu/ focal unit

3. unit 과 모듈을 설치합니다.

sudo apt update
sudo apt install unit
sudo apt install unit-dev unit-go unit-jsc11 unit-perl \
      unit-php unit-python2.7 unit-python3.8 unit-ruby

설정

control socket

nginx unit 은 control socket 이라는 다소 특이한 개념을 갖고 있습니다. 바로 서버 설정을 변경할 경우 설정 파일을 수정하고 재구동하지 않고 REST API 를 요청하듯 설정 파일을 control socket 을 통해 unit 에 전달하면 바로 설정이 반영됩니다.

아마 사용자가 폭주하는 서버일 경우 설정 변경으로 인한 재구동도 운영에 상당한 부담이기때문에 이런 기능을 제공하는 것 같습니다.

콘트롤 소켓을 확인하려면 unit 데몬을 옵션없이 실행하면 됩니다.

$ unitd

2021/08/13 03:05:59 [alert] 34232#34232 connect(11, unix:/var/run/unit/control.sock) succeed, address already in use

출력에 나오는 unix:/var/run/unit/control.sock 가 바로 콘트롤 소켓이며 unix: 는 도메인 소켓을 쓴다는 의미입니다.


application 추가

이제 새로운 application 을 추가하기 config.json 이라는 설정 파일을 만들어 보겠습니다.

{
    "type": "php",
    "root": "/var/www/blogs"
}


이제 curl 명령으로 설정을 콘트롤 소켓을 통해서 nginx unit 에 전달하면 설정이 반영됩니다. --unix-socket 뒤에는 unitd 명령으로 알아낸 콘트롤 소켓의 경로를 적어주면 됩니다.

$ curl -X PUT --data-binary @config.json --unix-socket /var/run/unit/control.sock http://localhost/config/applications/blogs       

{
        "success": "Reconfiguration done."
}

위 명령을 실행하면 blogs 라는 application 이 추가됩니다.


현재 application 목록을 확인하려면 config 를 조회해 보면 됩니다.

$ curl  --unix-socket /var/run/unit/control.sock http://localhost/config

{
        "listeners": {},
        "applications": {
                "blogs": {
                        "type": "php",
                        "root": "/var/www/blogs"
                }
        }
}

listener 추가

이제 application 에 리스너를 추가하기 위해 l.json  파일을 만들고 다음 내용을 추가합니다.

{
  "pass": "applications/blogs"
}


다음 명령으로 0.0.0.0:8100 을 리스닝하는 리스너를 추가합니다.

$ curl -X PUT --data-binary @l.json --unix-socket /var/run/unit/control.sock http://localhost/config/listeners/0.0.0.0:8100

{
        "success": "Reconfiguration done."
}


이제 해당 포트로 접속하면 nginx unit 이 동작하는 것을 확인할 수 있습니다.

$ curl http://localhost:8100/

간단한 사용 소감

  1. REST API + json 으로 설정하는게 직관적이지 않고 불편하고 어려움.
  2. 한 언어의 여러 버전(예: PHP 7.3, PHP 8.0등)를 사용할 경우 언어별 unit module 을 일일이 수작업으로 컴파일하고 로딩해야 하는등 설정이 불편
  3. 개인적으로는 저런 불편을 감수하고 사용할 장점을 못 느꼈음. 


같이 보기


Ref