Minecraftサーバーの通信をNginxのTCPリバースプロキシを経由させる

2021年6月3日

マイクラサーバーが落ちた時や別のアドレスからアクセスされた時に別のサーバーにつなぐ実装をします
サーバーのメンテナンス時にエラーを表示させたり1つの物理サーバーで複数のMinecraftサーバーを建てる人向けです

はじめに

Nginxとngx_stream_moduleをインストールしてください
調べれば出てきます

まずモジュールをロードします
nginx.confの1番上でモジュールをロードしてください

load_module /usr/lib/nginx/modules/ngx_stream_module.so;

見やすくするためにconf.dフォルダの中にあるstream拡張子のファイルをstreamの設定ファイルとして読み込むようにします
nginx.confの適切な位置に以下の記述をしてください(分からないなら一番下に記述をしてください)

stream{
    include /etc/nginx/conf.d/*.stream;
}

conf.d 下に .stream という拡張子のファイルを作ってください ファイル名は何でも良いです
このファイルに設定をしていきます

任意のip以外のアクセスを拒否する

upstream mcserver_normal {
    server 127.0.0.1:25566;
}
upstream mcserver_error {
    server 127.0.0.1:25567;
}

server {
    listen 25565;
    proxy_pass $mcserver;
}

map $remote_addr $mcserver {
    192.168.11.5 "mcserver_normal";
    default "mcserver_error";
}

ポート25565にアクセスされた際にmapを使用して192.168.11.5以外のipを弾きます
この設定の場合、192.168.11.5でアクセスした人はポート25566 それ以外からアクセスした人は25567に繋がります
streamはhttpとは違うのでif文は使えないのでmapを使ってipを判定します
応用すると指定されたプロキシ以外からのアクセスを弾いたりできます

複数のMinecraftサーバーを建てる

1つの物理サーバーで複数のMinecraftサーバーを建てるときのイメージ

Nginxとマイクラサーバーは同じサーバーでもいいですが起動するマイクラサーバーの数だけプロキシが必要です

upstream mcserver_normal {
    server 127.0.0.1:25566;
}
upstream mcserver_normal {
    server 127.0.0.1:25567;
}
upstream mcserver_normal {
    server 127.0.0.1:25568;
}
upstream mcserver_error {
    server 127.0.0.1:25569;
}

server {
    listen 25565;
    proxy_pass $mcserver;
}

map $remote_addr $mcserver {
   <プロキシのip1> "mcserver_normal_1";
   <プロキシのip2> "mcserver_normal_2";
   <プロキシのip3> "mcserver_normal_3";
    default "mcserver_error";
}

ポート25565にアクセスされた際にそれぞれ設定されたポート(25566 25567 25568)に繋がります

サーバーにアクセスできない時にメンテナンスサーバーに接続する

upstream mcserver_normal {
    server 127.0.0.1:25566;
    server 127.0.0.1:25567 backup;
}
server {
    listen 25565;
    proxy_pass $mcserver_normal;
}

ポート25565にアクセスされた際にポート25566に繋がりますが接続が失敗した際に25565に接続します

分散処理

upstream mcserver_normal {
    server 127.0.0.1:25566;
    server 127.0.0.1:25567;
    server 127.0.0.1:25568;
}
server {
    listen 25565;
    proxy_pass $mcserver_normal;
}

ポート25565にアクセスされた際にポート25566 25567 25568のどれかに接続します
マイクラサーバーで分散処理を行うことはあまりないかもしれません

おすすめ

upstream mcserver_normal {
    server 127.0.0.1:25566;
    server 127.0.0.1:25567 backup;
}
upstream mcserver_error {
    server 127.0.0.1:25568;
}

server {
    listen 25565;
    proxy_pass $mcserver;
    error_log /var/log/nginx/mc_error.log info;
}

map $remote_addr $mcserver {
    <プロキシのipアドレス> "mcserver_normal";
    <ローカルのipアドレス> "mcserver_normal";
    default "mcserver_error";
}

自分のサーバーでは指定されたプロキシ以外からのアクセスを弾くためとメンテナンス表示とロギングのために使用しているのでこの設定です
また、ローカルからもアクセスすることがあるのでローカルのipアドレスも接続できるようにしています

また、エラー用のサーバーを建てるほどサーバーのリソースに余裕がない人はFakeMCServerを使用してみてもいいかもしれません
かなりカスタマイズも出来ますしおすすめです