Skip to content

Ubuntu 22.04LTS へ Nginx Unit をインストールする

今回は Ubuntu 22.04LTS へ Nginx Unit をインストールします。 インストール手順は Installation に記載されています。

Ubuntu 用のパッケージは Index of /unit/ubuntu/dists/ で公開されています。 現時点では Ubuntu 24.04LTS 用のパッケージが無い為、Ubuntu 22.04LTS へインストールします。

検証環境

対象 バージョン
Ubuntu 22.04.4LTS
Nginx Unit 1.32.1

インストールする

公式のインストール手順では unit-jsc16 をインストールしていますが、現時点ではこのパッケージが存在せず、エラーになってしまいます。 その為、unit-jsc16 はインストール対象から外します。

sudo curl --output /usr/share/keyrings/nginx-keyring.gpg  \
    https://unit.nginx.org/keys/nginx-keyring.gpg && \
echo -e "deb [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/ubuntu/ jammy unit" \
    "\ndeb-src [signed-by=/usr/share/keyrings/nginx-keyring.gpg] https://packages.nginx.org/unit/ubuntu/ jammy unit" \
    | sudo tee /etc/apt/sources.list.d/unit.list && \
sudo apt update && \
sudo apt -y install unit && \
sudo apt -y install unit-dev unit-go unit-jsc11 unit-jsc17 unit-jsc18 \
    unit-perl unit-php unit-python2.7 unit-python3.10 unit-ruby unit-wasm && \
sudo systemctl restart unit

Python の FastAPI アプリケーションを動作させる

Nginx Unit 上で Python の FastAPI アプリケーションを動作させます。 正式な手順は 公式サイトの FastAPI チュートリアル ページに記載されています。

まず Python 仮想環境を作成します。 後の手順で Nginx Unit にアプリケーション設定を行う際に必要となる為、Python のバージョンを確認しておきます。 今回の環境では Python 3.10.12 でした。

mkdir /opt/myproject && \
cd /opt/myproject && \
python3 --version && \
python3 -m venv .venv && \
source .venv/bin/activate && \
pip install fastapi && \
deactivate

FastAPI によるサンプルアプリケーションを作成します。 今回はチュートリアルに従って asgi.py というファイル名にしました。

asgi.py
1
2
3
4
5
6
7
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, World!"}

アプリケーションを配置したディレクトリを Nginx Unit が参照出来るように所有者・所有グループを Nginx Unit へ変更しておきます。

chown -R unit:unit /opt/myproject

Nginx Unit は REST API で設定を行う為、設定用の .json ファイルを用意します。 今回は ~/config.json を以下の内容で新規作成しました。

config.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    "listeners": {
        "*:80": {
            "pass": "applications/fastapi"
        }
    },

    "applications": {
        "fastapi": {
            "type": "python 3.10",
            "path": "/opt/myproject",
            "home": "/opt/myproject/.venv/",
            "module": "asgi",
            "callable": "app"
        }
    }
}

設定用の .json ファイルが作成出来たら Nginx Unit へ Unix Socket 経由で POST します。 Unix Socket のデフォルト位置は /var/run/control.unit.sock です。 デフォルト値は unitd -h で参照出来る Nginx Unit のヘルプファイルに記載されています。

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

実際の実行例は以下の通りです。

# sudo curl -X PUT --data-binary @config.json --unix-socket \
    /var/run/control.unit.sock http://localhost/config/
{
    "success": "Reconfiguration done."
}

別のコンピュータから curl でアクセスし、FastAPI アプリケーションとして設定した内容が返ってくれば成功です。

$ curl http://10.0.0.1
{"message":"Hello, World!"}

参考

unitd のヘルプ表示

# unitd -h

unit options:

  --version            print unit version and configure options

  --no-daemon          run unit in non-daemon mode

  --control ADDRESS    set address of control API socket
                       default: "unix:/var/run/control.unit.sock"

  --control-mode MODE  set mode of the control API socket
                       default: 0600

  --control-user USER    set the owner of the control API socket

  --control-group GROUP  set the group of the control API socket

  --pid FILE           set pid filename
                       default: "/var/run/unit.pid"

  --log FILE           set log filename
                       default: "/var/log/unit.log"

  --modulesdir DIR     set modules directory name
                       default: "/usr/lib/unit/modules"

  --statedir DIR       set state directory name
                       default: "/var/lib/unit"

  --tmpdir DIR         set tmp directory name
                       default: "/var/tmp"

  --modules DIR        [deprecated] synonym for --modulesdir
  --state DIR          [deprecated] synonym for --statedir
  --tmp DIR            [deprecated] synonym for --tmpdir

  --user USER          set non-privileged processes to run as specified user
                       default: "unit"

  --group GROUP        set non-privileged processes to run as specified group
                       default: "unit"