🖋️2020-05-07 🔄2020-06-18
by shibanyan_1

Minecraft Java Editionの設定 第2回 Windowsでマルチプレイサーバを建てる

Minecraftサーバ

友人とマルチプレイしたい、サーバを公開して色んな人と遊びたい、様々な理由でMinecraftサーバを立てたい!という需要はそれなりにあるでしょう。
しかし、何から手を付ければ良いのか、何が必要なのかを掴むのが難しいかもしれません。
構築は見様見真似でしてみたものの、なんとも安定しない、バックアップも何をしたら良いのかわからない。
そんなあなたへ、"はい世界"でお馴染みの@ProjectCBWのサーバ管理を担っている@shibanyan_1が、検索してもヒットしない情報も含めてすべて解説します。

更新履歴 #

日時 内容
2020-06-18
  • Windows Firewallの設定
  • ルータのポート開放例を詳細に
  • WindowsでなくLinuxをオススメする理由 #

    Minecraftサーバは、WindowsでもLinuxでも立てることは可能です。
    ただしWindows ServerでないWindows 10 HomeやProの場合、10人以上の同時接続は規約違反です。
    パフォーマンス面でも同等のマシン構成の場合Linuxの方が快適に動きますし、Linuxで当たり前のように使用できる、screenでのサーバへのコマンド送信、rsyncを使用した高速な自動バックアップ環境などをWindowsで再現するのは、むしろLinuxより敷居が高いと言えるでしょう。

    とはいえ、常時動かさず身内で少し遊ぶ程度のものであれば、Windowsで構わないと思いますし、実際私もMinecraftをプレイするのと同じクライアントPCのWindows上で建てることもあります。

    OpenJDKのインストール #

    Minecraft Java Editionのサーバを建てるにはJavaが必要です。
    最新のMinecraft LauncherにはJREが同梱されているので、それを流用しても構いませんが、第一回で触れたように、新たに最新のOpenJDKを導入するのがベストです。

    普段OptiFineやModをインストールする際に必要な(前述の通り本当は不要)"Javaのインストール"とは少し違います。

    How to download and install prebuilt OpenJDK packages
    JDK 9 & Later

    Oracle's OpenJDK JDK binaries for Windows, macOS, and Linux are available on release-specific pages of jdk.java.net as .tar.gz or .zip archives.

    https://openjdk.java.net/install/

    https://jdk.java.net/ からダウンロードしてインストールせよと書かれています。

    Minecraftサーバ

    執筆時点ではOpenJDK 14が最新なので、Windows / x64のzipを選んでダウンロードし、展開します。

    フォルダjdk-14.0.1を丸ごとC:\直下へ移動します。

    Minecraftサーバ
    C:\
    +--jdk-14.0.1
    |  +--bin
    |  |  +--java.exe <- Minecraftサーバで使う
    |  |  +--javaw.exe <- Minecraft Launcherで使う
    |  |  +--...
    |  +--conf
    |  +--include
    |  +--jmods
    |  +--legal
    |  +--lib
    
    

    java.exeのフルパスはC:\jdk-14.0.1\bin\java.exeになりました。
    フルパスはjava.exeを選択した状態でShift - 右クリック -> パスのコピーで取得できる。

    まだインストールは終わっていません。
    現時点でコマンドプロンプトでjavaと打っても、下記のようになると思います。

    java -version
    'java' は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    
    java -version
    java version "1.8.0_51"
    Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
    Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
    

    これを

    java -version
    openjdk version "14.0.1" 2020-04-14
    OpenJDK Runtime Environment (build 14.0.1+7)
    OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
    

    に持っていきます。
    その為には、環境変数Pathを通す必要があります。

    Minecraftサーバ

    Vanillaサーバを建てる #

    Mojangが公式に配布しているMinecraft Java Editionサーバは、通称"Vanilla"と呼ばれます。

    server.jarのダウンロード #

    Minecraft Launcherの起動構成からダウンロードするか、powershellで下記を実行するなどして、任意のバージョンのserver.jarを取得します。

    # カレントディレクトリ
    Set-Location C:\Minecraft\Servers\Versions
    
    # Mojangからバージョンリストのjsonを取得
    $Versions = Invoke-WebRequest -Uri 'https://launchermeta.mojang.com/mc/game/version_manifest.json' -UseBasicParsing | ConvertFrom-Json
    
    # 結果を見る
    $Versions
    latest versions
    ------ --------
    @{release=1.14.4; snapshot=19w36a} {@{id=19w36a; type=snapshot; url...
    
    $Versions.latest.release
    1.14.4
    
    $Versions.latest.release
    19w36a
    
    # バージョン固有のjsonを取得(例: 最新のリリース)
    $Latest = Invoke-WebRequest -Uri ($Versions.versions | Where-Object {$_.id -eq $Versions.latest.release}).url | ConvertFrom-Json
    
    # server.jarのダウンロードURLを取得し、ダウンロード
    Invoke-WebRequest -Uri $Latest.downloads.server.url -OutFile ./server.jar
    

    Windowsでは以下に留意し、サーバ用のファイル群を置きます。

    • ユーザ名は日本語を含まない半角英数が前提です。あらゆるアプリケーションで不具合を起こします。おま国です。
    • 基本的にC:ドライブ直下等、管理者権限が不要な場所に置きます。
    • ディレクトリ名に半角英数とアンダースコア以外の日本語や記号、スペースを含めてはいけません。
    C:\MinecraftServer\server.jar
    C:\Minecraft\Servers\Versions\server.jar
    

    初回起動 #

    コマンドプロンプトで下記を実行します。

    rem server.jarのある場所に移動
    cd C:\Minecraft\Servers\Versions
    
    rem javaへ引数を渡してサーバを起動
    java -jar .\server.jar
    

    この時点ではサーバは起動しません。

    eula.txtの編集 #

    VSCode等のテキストエディタでfalseをtrueに書き換えて保存します。
    MINECRAFT エンド ユーザー ライセンス条項に目を通しておきましょう。

    #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
    #Wed Jul 18 04:41:13 UTC 2018
    eula=true
    

    CLIの場合は、powershellで下記のようなコードを実行します。

    (Get-Content eula.txt).Replace('eula=false','eula=true') | Out-File eula.txt -Encoding utf8
    

    server.propertiesの設定 #

    初回起動で生成されたserver.propertiesを編集します。

    スポーン地点付近にブロックが置けない問題の原因

    spawn-protection=0
    

    低スペックで処理が遅れ過ぎると勝手にMinecraftサーバが停止する問題の対策

    max-tick-time=-1
    

    ゲームモードや難易度、ハードコアの切り替え

    gamemode=survival
    difficulty=normal
    hardcore=false
    

    プレイヤーの放置対策

    player-idle-timeout=0
    

    プレイヤー同士で殴り合いできるかどうか

    pvp=true
    
    level-type=default
    

    コマンドブロックの有効/無効

    enable-command-block=false
    

    最大接続数の設定(Windows 10 HomeやProで外部に公開する場合、10人まで)

    max-players=10
    

    ポート番号の設定。何も指定せずに接続できるデフォルトポートが25565。
    Minecraftサーバを同じマシンで複数建てる場合、ポート番号が重ならないようにする。

    server-port=25565
    

    サーバ側の描画距離。
    プレイヤー毎にこの値が適用されるため、上げすぎないように。

    view-distance=10
    

    whitelistまたはopに登録したMCIDのみ参加できるようにするホワイトリストモードの有効/無効

    white-list=true
    

    MCIDをMojangのサーバに問い合わせて、正規のアカウントか確認することで、外部から接続できるようにするオンラインモードの有効/無効。

    online-mode=true
    

    第3回 server.propertiesの詳細

    Minecraftサーバにログインしてみる #

    eula.txtの編集server.propertiesの設定が終わったら、
    もう一度初回起動の手順を行い、Minecraftサーバを起動します。

    Minecraftサーバ

    因みに、白いGUIは不要なので無効化できます。

    java -jar server.jar nogui
    

    次に、Minecraftのクライアントを起動して、サーバのアドレスを登録します。
    今回はサーバとクライアントが同一なので、

    localhost
    

    になります。
    友達に教えるアドレスは、公開する準備ができた後で解説します。

    Minecraftサーバ

    server.propertiesで設定した通り、クライアント側、サーバ側共にYou are not white-listed on this server!と出ていますね。成功です!

    Minecraftサーバ

    Whitelistの登録 #

    Minecraftサーバコンソール内で下記を実行します。

    whitelist add Shibanyaan
    

    私が入れますね。

    Minecraftサーバ
    whitelist remove Shibanyaan
    

    ホワリスから外されてしまいました。

    サーバの停止 #

    必ずstopコマンドで終了します。Xボタンやタスクマネジャ等からkillすると正常にセーブされず、直前の変更が保存されていなかったり、チャンク単位で巻き戻ったりします。

    stop
    [19:04:55] [Server thread/INFO]: Stopping the server
    [19:04:55] [Server thread/INFO]: Stopping server
    [19:04:55] [Server thread/INFO]: Saving players
    [19:04:55] [Server thread/INFO]: Saving worlds
    [19:04:55] [Server thread/INFO]: Saving chunks for level 'world'/minecraft:the_nether
    [19:04:55] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
    [19:04:55] [Server thread/INFO]: Saving chunks for level 'world'/minecraft:the_end
    [19:04:55] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
    [19:04:55] [Server thread/INFO]: Saving chunks for level 'world'/minecraft:overworld
    [19:04:55] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
    [19:04:55] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
    [19:04:55] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
    [19:04:55] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
    

    同様に、サーバ起動中にバックアップしたセーブデータの整合性は保証できません。
    これの回避方法は、第3回 Minecraftサーバ起動中のバックアップで解説しています。

    外部への公開 #

    Windows Firewallの設定 #

    ルータ側でポート開放しても、WindowsのFirewallで弾かれてしまうので、外からの通信(受信、Inbound)に対してWindows Firewallに穴を開ける必要があります。

    コントロール パネル\システムとセキュリティ\Windows Defender ファイアウォールの"詳細設定"や
    Minecraftサーバ

    Windowsの検索からアクセスできます。
    Minecraftサーバ

    WindowsでMinecraftサーバを公開する場合、"受信の規則"のみ設定すればよく、"送信の規則"に設定する必要はありません。
    受信の規則を選択し、"新しい規則"からWindows Firewallのルールを追加します。

    1. 規則の種類
      基本的に"ポート"を選択します。
      "プログラム"を選択して、Minecraftサーバに使用するjava.exeを指定する方法もあります。 Minecraftサーバ

    2. プロトコルおよびポート
      Minecraftは"TCP"を使用します。
      ポートは必ず"特定のローカルポート"で25565server.propertiesのserver-port)にして下さい。
      Minecraftサーバ

    3. 操作
      通常の外部からの接続を許可するには、一番上の"接続を許可する"を選択する必要があります。
      Minecraftサーバ

    4. プロファイル
      自宅に据え置きのデスクトップであれば全てにチェックが入っていても構いません。
      様々なネットワークに接続するノートパソコンなどでは、プライベートに限定した方が良いかもしれません。
      Minecraftサーバ

    5. 名前
      分かりやすい名前を付けておきましょう。 Minecraftサーバ

    受信の規則の一覧に存在すれば成功です。
    Minecraftサーバ

    PowerShell Cmdletで同等の設定を行うには、以下のようにします。

    New-NetFirewallRule -DisplayName "Allow Inbound Minecraft Server" -Direction Inbound -LocalPort 25565 -Protocol TCP -RemoteAddress Any -Action Allow
    

    ポート開放 #

    ルータによってはポートマッピング(NEC)、ポート変換(Buffalo)、静的IPマスカレード(YAMAHA)などと呼ばれます。
    グローバルIPアドレスの特定のポートをプライベートIPアドレスの特定のポートに繋げる設定をすることで、外部から自分のPC上で実行されているMinecraftサーバにアクセスできるようになります。
    Windows Firewallの設定と併せて設定することで、LANの外側に居る友人とマルチプレイができるようになります。

    この設定は各機器によって異なるので、"ルータの型番+ポート開放"で検索して下さい。

    ポート開放の設定方法/アドレス変換の設定方法 | バッファロー
    ポートマッピング(ポートの開放)の設定を行いたい | Aterm Q&A
    YAMAHA RTX830 をSSHで設定する - 俺の外付けHDD #ポート開放

    サーバアドレス #

    Minecraftサーバにログインしてみるでさらっと触れましたが、自分が接続する時のアドレスと、家族のとき、友人とではサーバアドレスは異なります。

    自分のPCに サーバアドレス 調べ方(コマンドプロンプト)
    自分が接続する localhost
    家族が接続する(LAN内) 192.168.XXX.X(ローカルIPアドレス) ipconfig /all
    友人が接続する(LAN外) XXX.XXX.XX.XXX(グローバルIPアドレス) curl ipinfo.io

    コマンドプロンプトでcurlが無い!と怒られるほどWindows 10のバージョンが古いなら、アップデートなりクリーンインストールするなりで最新のWindowsにしましょう(基本的には、ね)

    起動バッチ #

    起動バッチといっても、ダブルクリックでMinecraftサーバを立ち上げられるようにするだけなら、この2行でできます。

    java -server -jar server.jar nogui
    pause
    

    JVM引数については、第3回 JVMの引数で詳しく触れています。

    複数のサーバや設定を一括で管理したり、コマンドだけでサーバの停止まで行ったり、Discordに通知したりするには第3回 Discordへ通知できるMinecraftサーバ管理スクリプト msl.ps1を参照して下さい。

    Minecraftサーバのバックアップ #

    Windowsで簡単にバックアップするならRobocopyが早いが、より安全に、効率的に大量(例えば1年分)のバックアップをとるにはWSLのrsyncを利用したほうがよい。

    Windows標準のRobocopyをバッチで書ける範囲で書いた簡易的なバックアップバッチ
    https://nyanshiba.hatenablog.com/entry/2018/03/22/232116

    WSLのrsyncを使った高機能なバックアップスクリプト
    https://nyanshiba.com/blog/wsl-rsync-auto-backup