さくらのVPSを使ってシステム開発に必要な知識を学ぶ 〜第10回〜

はじめに

本連載は、システム開発に必要な知識を得るために、一通りの流れを学ぶことを目指しています。

本連載の第7回からは、実際の業務を想定したメモアプリを例に、開発の流れを解説しています。今回はアプリケーションサーバー(APサーバー)の構築を解説します。なお、APIサーバーも同じ手順で構築できます。

APサーバーとAPIサーバー

APサーバーは、クライアントからのリクエストを受け取り、それに対する応答を生成するためにアプリケーションのビジネスロジックを実行するサーバーコンポーネントです。通常、ウェブアプリケーションやモバイルアプリケーションなど、ユーザーインターフェースとバックエンドロジックの間で動作します。

APIサーバーは、外部からのリクエストを受け取り、それに対してJSONやXMLなどのデータフォーマットで応答を提供するサーバーコンポーネントです。通常、外部のクライアント(モバイルアプリ、ウェブアプリ、別のサービスなど)との通信を可能にします。

両者の共通点と違いは下記のとおりです。

  • 共通点
    • HTTPリクエストを処理し、レスポンスを返します。
  • 主な違い
    • アプリケーションサーバーは、ユーザーインターフェースとの対話を担当します。
    • APIサーバーは、外部クライアントとのコミュニケーションを担当します。

Rustによる実装

APサーバーやAPIサーバーの実装にはさまざまなプログラミング言語が用いられますが、今回はRustを使用します。Rustを用いてサーバーを実装する場合、以下の手順が含まれます。

  • RustのHTTPサーバーライブラリを使用して、HTTPリクエストを受け付けるためのサーバーを起動します。例えば、hyperやactix-webなどがあります。
  • ルーティングとハンドラーを設定して、特定のエンドポイントにリクエストがルーティングされるようにします。これには、actix-webのようなフレームワークを使用することが一般的です。
  • リクエストを処理し、データベースアクセスやビジネスロジックの実行などのアプリケーション固有の処理を行います。Rustの強力な型システムを活用して、安全で高性能なコードを記述できます。
  • HTTPレスポンスを生成してクライアントに返します。これには、JSONやHTMLなどのデータを生成するためのライブラリを使用します。

Rustで書かれたWebフレームワーク

RustでAPサーバーを構築する際に使える、いくつかの優れたWebフレームワークがあります。いくつかの人気のあるRust製Webフレームワークを以下に掲げます。

フレームワーク名URL特徴
Actixhttps://actix.rs/高性能かつ非同期のWebフレームワークで、Rustコミュニティで非常に人気です。非同期I/Oをサポートし、スケーラビリティが高いため、大規模なアプリケーションに適しています。
Rockethttps://rocket.rs/開発者にとって非常に使いやすく、直感的なAPIを提供するフレームワークです。また、コンパイラプラグインを使用して型安全性を強化します。
Warphttps://github.com/seanmonstar/warp非同期Webサーバーの構築に特化したミニマルなフレームワークで、高速なルーティングと非同期リクエストハンドリングを提供します。
Tidehttps://github.com/http-rs/tide非同期のRust Webアプリケーションフレームワークで、ErgonomicなAPI設計と拡張性があります。また、ミドルウェアのサポートも充実しています。
Actix-webhttps://actix.rs/Actixコミュニティの主要なプロジェクトで、非同期のWebサーバーおよびWebアプリケーションの構築に使用されます。
Rust製Webフレームワーク

どのフレームワークを選択するかは、プロジェクトのニーズ、開発経験、好みによって異なります。性能、コミュニティサポート、ドキュメンテーションの質など、選択の際に考慮すべき要因があります。プロジェクトの要件に合ったものを選び、試してみてください。

APサーバーの環境構築

今回は、RustとActix-webを使ったAPサーバーの環境構築を解説します。RustとActix-webを使用して構築されたサーバーはAPIサーバーとしての役割が一般的ですが、APサーバーとしても使用できます。サーバーの具体的な機能は、プロジェクトや要件に依存し、設計次第です。今回はAPサーバーとしての役割を想定してサーバーを構築します。

さくらのVPSにSSHで接続

PC(macOS/Windows/Linux)で下記コマンドを実行します。host-name.vs.sakura.ne.jpはさくらのVPSにおけるホスト名です。ホスト名を知る方法は第8回の記事を参照してください。

  $ ssh admin@host-name.vs.sakura.ne.jp
  admin@host-name.vs.sakura.ne.jp's password:

ログインできたら成功です。下図はmacOSでの実行例です。

システムアップデート

ログインしたら、まずシステムパッケージを最新の状態に更新します。

$ sudo apt update -y
$ sudo apt upgrade -y

RustとCargoのインストール

続いて、RustとCargoをインストールします。CargoはRustのビルドシステム兼パッケージマネージャーです。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

下図のように Rust is intsall now. Great! と表示されれば完了です。

RustとCargoのバージョン確認

下記のコマンドを実行します。

$ rustc -V
rustc 1.73.0 (cc66ad468 2023-10-03)
$ cargo -V
cargo 1.73.0 (9c4383fb5 2023-08-26)
$

Rustの更新

Rustを新しいバージョンに更新するには下記のコマンドを実行します。

$ rustup update
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: checking for self-update

  stable-x86_64-unknown-linux-gnu unchanged - rustc 1.73.0 (cc66ad468 2023-10-03)

info: cleaning up downloads & tmp directories
$

Rust, Actix-webのプロジェクトの作成

新しいディレクトリで Rustのプロジェクトを作成します。

$ mkdir my_actix_app
$ cd my_actix_app/
$ cargo init
     Created binary (application) package
$ cargo build
   Compiling my_actix_app v0.1.0 (/home/ubuntu/my_actix_app)
    Finished dev [unoptimized + debuginfo] target(s) in 2.16s
$ ls -la
total 24
drwxrwxr-x 4 ubuntu ubuntu 4096 Oct 29 16:12 .
drwxr-x--- 7 ubuntu ubuntu 4096 Oct 29 16:12 ..
drwxrwxr-x 6 ubuntu ubuntu 4096 Oct 29 16:12 .git
-rw-rw-r-- 1 ubuntu ubuntu    8 Oct 29 16:12 .gitignore
-rw-rw-r-- 1 ubuntu ubuntu  181 Oct 29 16:12 Cargo.toml
drwxrwxr-x 2 ubuntu ubuntu 4096 Oct 29 16:12 src
$:~/my_actix_app$

Actix-webを依存関係に追加

Cargo.tomlファイルを編集して、Actix-webをプロジェクトの依存関係に追加します。

まず、エディタでCargo.tomlを開きます。

 $ vi Cargo.toml

Cargo.tomlの以下の箇所を編集します。

[dependencies]
actix-web = "3"

その後、cargo buildを実行して依存関係をインストールします。

$ cargo build

Actix-webアプリケーションを作成

まずsrcディレクトリに移動します。

/my_actix_app$ cd src/
/my_actix_app/src$ ls -la
total 12
drwxrwxr-x 2 ubuntu ubuntu 4096 Oct 29 16:12 .
drwxrwxr-x 5 ubuntu ubuntu 4096 Oct 29 16:22 ..
-rw-rw-r-- 1 ubuntu ubuntu   45 Oct 29 16:12 main.rs
/my_actix_app/src$ 

src/main.rsファイルを編集して、Actix-webアプリケーションを作成します。以下は簡単な例です。

use actix_web::{get, App, HttpResponse, HttpServer};

#[get("/api")]
async fn hello() -> HttpResponse {
    HttpResponse::Ok().body("Hello, Actix-web!")
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new().service(hello)
    })
    .bind("0.0.0.0:8080")?
    .run()
    .await
}

この例では、ルートパス ("/api") にアクセスしたときに"Hello, Actix-web!"を返すシンプルなHTTPサーバーが8080番ポートで動作します。

サーバーの起動

アプリケーションをビルドし、サーバーを起動します。

$ cargo run
   Compiling my_actix_app v0.1.0 (/home/ubuntu/my_actix_app)
    Finished dev [unoptimized + debuginfo] target(s) in 4.05s
     Running `/home/ubuntu/my_actix_app/target/debug/my_actix_app`

今回使用したコマンド

環境構築に使用したcargoコマンドを整理して記載します。

  • cargo init
    • 初期化コマンドです。基本的にnewかinitのどちらかを使い分けます。
    • initコマンドでは、newではできなかった、カレントディレクトリでプロジェクトを作成する際の新規作成か上書きかを選べます。
  • cargo build
    • ビルドするコマンドです。
    • 初期設定では、targetディレクトリにてコンパイルした後、実行可能なファイルが生成されます。
    • Cargo.tomlに記載された外部パッケージがインストールされます。このときインストールされたパッケージはCargo.lockに記載されます。
  • cargo run
    • cargo buildを行った後に実行可能ファイルが実行され、結果が出力されます。
    • rustのコードに変更がない場合はbuildは行われず、実行可能なファイルが実行されるだけなので、爆速です。

Rustのアンインストール

もしRustをアンインストールしたくなった場合は、下記のコマンドを実行します。

$ rustup self uninstall


Thanks for hacking in Rust!

This will uninstall all Rust toolchains and data, and remove
$HOME/.cargo/bin from your PATH environment variable.

Continue? (y/N) y

info: removing rustup home
info: removing cargo home
info: removing rustup binaries
info: rustup is uninstalled
$

APサーバーの動作確認

構築したAPサーバーの動作確認を行います。APサーバーには直接アクセスせず、Webサーバーにリバースプロキシを設定し、APサーバーにリクエストを転送するようにします。

WebサーバーからAPサーバーへポートフォワード

「ポートフォワーディング」とは、インターネットから特定のポート番号宛てに届いたパケットを、あらかじめ設定しておいたLAN側の機器に転送する機能です。今回はこの機能を用いて、ブラウザからのHTTPリクエストをいったんWebサーバーで受け、

  • http://host-name.vs.sakura.ne.jp/api へのアクセスはAPサーバーに転送し、APサーバーで処理した結果を返す
  • それ以外のURLへのアクセスはWebサーバーから応答を返す

という動作をするように設定します。Webサーバーは、本連載の第8回にて構築したnginxを使用します。

nginxでの設定

nginxの設定ファイルは通常 /etc/nginx/sites-available/ ディレクトリにあります。このディレクトリにある設定ファイルを使って設定を行います。今回は /etc/nginx/sites-available/default を使用します。

nginxの設定ファイルを編集します。

$ sudo vi /etc/nginx/sites-available/default

WebサーバーからAPサーバーへのリバースプロキシ設定を追加します。ドメイン名(3行目のyour_domain.com)やAPサーバーのポート番号(下記の例では8080)は適切に置き換えてください。

server {
  listen 80;
  server_name your_domain.com;
  中略・・・

  # 追加行 -----

  location /api {
    proxy_pass http://127.0.0.1:8080; # APサーバーのポート
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }

  # 追加行 -----
}

設定ファイルを保存して閉じます。

nginxの設定ファイルを有効化します。

$ sudo systemctl restart nginx

動作確認

下記のコマンドを入力して、 AP サーバーを起動します。

$ cd my_actix_app
$ cargo run

下図のような状態になれば、動作確認の準備ができています。

ブラウザを起動し、アドレスバーに下記のURLを入力してアクセスしてみてください。

http://host-name.vs.sakura.ne.jp/api

以下のような画面が表示されれば、APサーバーは動作しています。

まとめ

今回は、RustとActix-webを使用したアプリケーションサーバーを、さくらのVPS上に構築する手順を解説しました。

次回は、Rustを使ったバックエンド開発を解説します。