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
で再起動する必要があります。