🐟

Apacheでサービスを立ち上げちゃった人が、同じ鯖でReactやGo、RustのWebサービスを立ち上げたい時

2022/01/27に公開

ボクの http:// localhost:3000 ってどうやってみんなに見てもらえるの??

※ドメインとかVirtualHostとかWebサーバの立ち上げ方の記事ではありません。

意外とこういう記事がないので起こします。nginxでも似たような感じでしょう。例えば、もうワードプレスいれちゃったからApacheも80,443ポートも使っちゃってるよーみたいな。

あと、新しい言語勉強しているときに、「ほらできました!」というlocalhostでブラウザに表示される世界。

http://localhost:3000/

グローバルに公開したい訳です。まぁ経験があるといつもの事ですが、やったことない人は 「は?」 ってなりますよね。ここで終わっては何も達成されてないんですけど??みたいなね。

そんな時はリバースプロキシ

このケースなんですが、1サーバに複数ドメインをあてがっているため、 リバースプロキシ が必要になります。

tatoeba.vhost.conf
<VirtualHost *:443>
  Protocols h2 http/1.1

  ServerName dokokade.co.jp
  DocumentRoot "/path/de/gowasu"
  ...
</VirtualHost>

まずはLAMP同様に80,443ポートで待ち受けます。ここで...

Rust/actixで3000ポートで立ち上げた場合、あー、とばしてーなーってなったら

tatoeba.vhost.conf
  ...
  #proxy
  ProxyRequests Off

  #rust
  ProxyPass /rust/ni/tobasiteeenaaa http://127.0.0.1:3000/
  ProxyPassReverse /rust/ni/tobasiteeenaaa http://127.0.0.1:3000/
  ...

こう記載すると、「dokokade.co.jp/rust/ni/tobasiteeenaaa」がルートになって
Rust/actixにアクセスできます。

「dokokade.co.jp/rust/ni/tobasiteeenaaa/dou?」にアクセスすると内部的に「http:// 127.0.0.1:3000/dou?」にアクセスします。

ちなみに リバースプロキシにマッチしてもそれ以降の記述も参照される ので、読まれると挙動的にアカン場合は 以降の記述 を囲む必要があります。

tatoeba.vhost.conf
  ...
  ProxyPassReverse ...
  <Directory "/path/de/gowasu">
    ...
  </Directory>
  ...

DocumentrootDirectory で。これで無事リバースプロキシしてくれます。

上記の例だと、同じドメインの特定のURL配下はRust~こっちはGo~そっちはReact~って分けることもできます。ややこしいのでおすすめしませんけど。
3000ポートもローカルでリバプロするのでfirewall-cmdとかでポートをリッスンする必要がありません。ロードバランサも影響ナシ。

main.rs
fn main() {
    let server = HttpServer::new(|| {
        App::new()
            .route("/", web::get().to(get_index))
    });

    println!("Serving on http://127.0.0.1:3000...");
    server
        .bind("127.0.0.1:3000").expect("error binding server to address")
        .run().expect("error running server");
}

ガチコンテンツの場合は、1サーバ1サイトだと思うんで、こういう問題は通常ありませんたぶん。
しかしこれで貴方も覚えた言語でつくった作品をお蔵入りせずポコポコ公開することができますね!

Discussion