Rocket (Rust) を nginx と systemd を使ってデプロイしてみる

今回も前回の続きでRustの話が続きます。
ohshige.hatenablog.com

クロスドメインも気にせずAPIが使えるようになったので、そろそろ cargo run での実行ではなく、いい感じでデプロイしたいところです。

そこで、今回はリバースプロキシとしてnginxを、デーモン化としてsystemdを使ってみます。

こちらを参考にしました。
medium.com

nginx

nginxはインストール済みだとして、適当な設定ファイルに以下を書きます。(例えば /etc/nginx/conf.d/rocket.conf
必要であれば適宜 server_name 等を書きます。

server {
    listen 80 default_server;

    location / {
        proxy_pass http://0.0.0.0:8000;
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

sudo nginx -tシンタックスをチェックし、問題なければ sudo nginx -s start 等で起動しておきます。

systemd

続いてsystemdの設定です。

以下の通り、設定をユニットファイルに記述します。(例えば /etc/systemd/system/rocket.service
今回はアプリケーションが /home/ohshige/rocket/ 配下にある場合を想定していて、既に cargo build 済みであるとします。

[Unit]
Description=RocketAPI
[Service]
User=www-data
Group=www-data
WorkingDirectory=/home/ohshige/rocket/
Environment="ROCKET_ENV=prod"
Environment="ROCKET_ADDRESS=0.0.0.0"
Environment="ROCKET_PORT=8000"
Environment="ROCKET_LOG=critical"
ExecStart=/home/ohshige/rocket/target/debug/rocket
[Install]
WantedBy=multi-user.target

本番ではないので ExecStartデバッグのバイナリを指しています。( ROCKET_ENV=prod ではありますが)
しっかりやるなら cargo build --release でビルドしたリリース版を指すようにすると良いと思います。

そして、 sudo systemctl start rocket.service でサービスを起動します。
また、 サーバ起動時にサービスも起動するように sudo systemctl enable rocket.service も実行しておきます。

これでデーモン化できました。

.

実際にアクセスしてみると問題無く動作するはずです。

アプリケーションに変更がある場合には、再度ビルドした上で、 sudo systemctl restart rocket.service で再起動する必要があります。