📚 Quick Navigation

Quick Info 🔌 Ports Installation Configuration ⚙️ Startup Parameters Plugins & Mods 🔧 Troubleshooting Performance Security

Minecraft Java Edition Server Hosting Guide

Overview

Minecraft Java Edition is one of the most popular sandbox games worldwide, supporting extensive multiplayer capabilities. This comprehensive guide covers everything you need to know about hosting a Minecraft server on a VPS or dedicated server.

Quick Info

🔌 Network Ports Used

Required Ports

Port Protocol Purpose Required?
25565 TCP Main game connection (players connect here) ✓ Yes
25565 UDP Server query protocol (for server lists) ○ Optional
25575 TCP RCON (remote console administration) ○ Optional
19132 UDP Bedrock Edition (if running Geyser plugin) ○ Optional

Firewall Configuration Examples

Allow Minecraft server through your firewall:

# UFW (Ubuntu/Debian)
sudo ufw allow 25565/tcp comment 'Minecraft Server'
sudo ufw allow 25565/udp comment 'Minecraft Query'

# FirewallD (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=25565/tcp
sudo firewall-cmd --permanent --add-port=25565/udp
sudo firewall-cmd --reload

# iptables
sudo iptables -A INPUT -p tcp --dport 25565 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 25565 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4

# Windows Firewall
netsh advfirewall firewall add rule name="Minecraft Server" dir=in action=allow protocol=TCP localport=25565
netsh advfirewall firewall add rule name="Minecraft Query" dir=in action=allow protocol=UDP localport=25565

Port Configuration in server.properties

# Main server port (TCP)
server-port=25565

# Query port (UDP) - usually same as server-port
query.port=25565
enable-query=true

# RCON port (TCP) - remote administration
rcon.port=25575
enable-rcon=false
rcon.password=changeme_use_strong_password

⚠️ Port Security Notes

Installation & Setup

System Requirements

Installing Java

Minecraft requires Java to run. Install the appropriate version:

# Ubuntu/Debian - Java 17 (for MC 1.17+)
sudo apt update
sudo apt install openjdk-17-jre-headless

# Check Java version
java -version

# Set Java 17 as default if multiple versions installed
sudo update-alternatives --config java

Downloading Server Files

Download the official Minecraft server from Minecraft.net:

# Create server directory
mkdir minecraft-server
cd minecraft-server

# Download server jar (replace version number with desired version)
wget https://piston-data.mojang.com/v1/objects/[hash]/server.jar -O minecraft_server.jar

# Or use curl
curl -o minecraft_server.jar https://piston-data.mojang.com/v1/objects/[hash]/server.jar

First-Time Setup

# Run server once to generate files
java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

# Accept EULA
echo "eula=true" > eula.txt

# Start server
java -Xmx2048M -Xms2048M -jar minecraft_server.jar nogui

Server Configuration

server.properties - Essential Settings

The server.properties file controls all server behavior:

# Server identification
server-name=My Minecraft Server
motd=Welcome to My Server!
server-port=25565
server-ip=0.0.0.0

# Gameplay settings
gamemode=survival
difficulty=normal
hardcore=false
pvp=true
enable-command-block=false

# World settings
level-name=world
level-seed=
level-type=default
generate-structures=true
spawn-protection=16
max-build-height=256
view-distance=10
simulation-distance=10

# Player limits
max-players=20
white-list=false
online-mode=true

# Performance & resource settings
max-tick-time=60000
max-world-size=29999984
network-compression-threshold=256
spawn-npcs=true
spawn-animals=true
spawn-monsters=true

# Query & RCON
enable-query=true
query.port=25565
enable-rcon=false
rcon.port=25575
rcon.password=changeme

# Misc
allow-flight=false
enforce-whitelist=false
resource-pack=
resource-pack-sha1=

ops.json - Server Operators

Grant admin privileges to players:

[
  {
    "uuid": "player-uuid-here",
    "name": "PlayerName",
    "level": 4,
    "bypassesPlayerLimit": true
  }
]

Permission levels: 1 (bypass spawn protection), 2 (use cheat commands), 3 (kick/ban), 4 (full control)

whitelist.json - Whitelist

When white-list=true in server.properties:

[
  {
    "uuid": "player-uuid-here",
    "name": "PlayerName"
  }
]

Startup Parameters & JVM Arguments

Basic Startup Command

java -Xmx4G -Xms4G -jar minecraft_server.jar nogui

Recommended JVM Arguments (Aikar's Flags)

Optimized for Minecraft server performance:

java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled \
     -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions \
     -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
     -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 \
     -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 \
     -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \
     -XX:InitiatingHeapOccupancyPercent=15 \
     -XX:G1MixedGCLiveThresholdPercent=90 \
     -XX:G1RSetUpdatingPauseTimePercent=5 \
     -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem \
     -XX:MaxTenuringThreshold=1 \
     -Dusing.aikars.flags=https://mcflags.emc.gs \
     -Daikars.new.flags=true \
     -jar minecraft_server.jar nogui

Parameter Breakdown

Creating a Start Script

Linux (start.sh):

#!/bin/bash
java -Xms4G -Xmx4G -XX:+UseG1GC -jar minecraft_server.jar nogui
chmod +x start.sh
./start.sh

Windows (start.bat):

@echo off
java -Xms4G -Xmx4G -XX:+UseG1GC -jar minecraft_server.jar nogui
pause

Plugins, Mods & Server Software

Server Software Options

1. Vanilla

2. Spigot

3. Paper (Recommended)

4. Forge

5. Fabric

Essential Plugins (Spigot/Paper)

EssentialsX

Core commands and utilities for server management.

LuckPerms

Advanced permission management system.

WorldEdit & WorldGuard

In-game world editing and region protection.

Vault

Economy and permission API bridge.

Installing Plugins

# 1. Stop server
# 2. Download plugin .jar file
# 3. Place in plugins/ directory
cd plugins/
wget https://example.com/plugin.jar

# 4. Start server
# 5. Configure in plugins/PluginName/config.yml

Popular Mods (Forge/Fabric)

Troubleshooting

Server Won't Start

Java Not Found

# Check if Java is installed
java -version

# If not installed, install Java (Ubuntu/Debian)
sudo apt update
sudo apt install openjdk-17-jre-headless

EULA Not Accepted

# You must agree to Minecraft EULA
echo "eula=true" > eula.txt

Port Already in Use

# Check what's using port 25565
sudo lsof -i :25565
sudo netstat -tulpn | grep 25565

# Kill process or change server-port in server.properties

Out of Memory

# Increase allocated RAM
java -Xms4G -Xmx4G -jar minecraft_server.jar nogui

# Or reduce if system has limited RAM
java -Xms2G -Xmx2G -jar minecraft_server.jar nogui

Connection Issues

Can't Connect to Server

  1. Check server is running: ps aux | grep java
  2. Verify port is listening: netstat -an | grep 25565
  3. Check firewall:
    # Ubuntu/Debian (UFW)
    sudo ufw allow 25565/tcp
    sudo ufw reload
    
    # CentOS/RHEL (firewalld)
    sudo firewall-cmd --permanent --add-port=25565/tcp
    sudo firewall-cmd --reload
    
  4. Verify server IP: Use external IP, not 127.0.0.1
  5. Check online-mode: If cracked clients, set online-mode=false

Connection Timed Out

Performance Issues

Server Lag/TPS Drop

  1. Check TPS: /tps or use Spark profiler
  2. Reduce view distance: Set view-distance=6-8
  3. Reduce simulation distance: simulation-distance=4-6
  4. Limit entities:
    # spigot.yml or paper.yml
    entity-activation-range:
      animals: 16
      monsters: 24
      misc: 8
    
  5. Use Paper: Better performance than Spigot/Vanilla
  6. Pregenerate world: Use Chunky plugin to pre-generate chunks

Memory Leaks

# Monitor memory usage
free -h
top -p $(pgrep -f minecraft_server)

# Restart server regularly (daily/weekly) via cron
0 4 * * * /path/to/restart-script.sh

World Corruption

  1. Stop server immediately
  2. Backup world folder: cp -r world/ world_backup/
  3. Use MCEdit or Amulet to repair: AmuletMC.com
  4. Restore from backup if needed
  5. Prevention: Always stop server properly, use backup plugins

Plugin Conflicts

  1. Check console for errors
  2. Disable plugins one-by-one to isolate issue
  3. Update all plugins to latest versions
  4. Check plugin compatibility with server version

Performance Optimization

Server Configuration

# server.properties
view-distance=8
simulation-distance=6
network-compression-threshold=256
entity-broadcast-range-percentage=100

Paper Configuration

Create/edit paper.yml or config/paper-global.yml:

chunk-loading:
  target-chunk-send-rate: 100.0
  max-concurrent-sends: 2

async-chunks:
  enable: true
  threads: -1

entity-activation-range:
  animals: 16
  monsters: 24
  raiders: 48
  misc: 8
  water: 8
  villagers: 16
  flying-monsters: 48

tick-rates:
  sensor:
    villager:
      secondarypoisensor: 80
  behavior:
    villager:
      validatenearbypoi: 60

Pregenerate World

Use Chunky plugin to pre-generate chunks:

# Install Chunky plugin
# In-game or console:
/chunky radius 5000
/chunky world world
/chunky start

# Let it complete before opening server to players

Backup Strategy

#!/bin/bash
# backup.sh - Run via cron
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/minecraft"
SERVER_DIR="/home/minecraft/server"

# Create backup
tar -czf $BACKUP_DIR/world_$DATE.tar.gz -C $SERVER_DIR world/

# Keep only last 7 days
find $BACKUP_DIR -name "world_*.tar.gz" -mtime +7 -delete

Security Best Practices

Firewall Configuration

# Only allow Minecraft port
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 25565/tcp
sudo ufw allow 22/tcp  # SSH
sudo ufw enable

Whitelist

# Enable whitelist in server.properties
white-list=true

# Add players in-game or console
/whitelist add PlayerName
/whitelist on

RCON Security

# If using RCON, use strong password
enable-rcon=true
rcon.password=Use_A_Very_Strong_Random_Password_Here
rcon.port=25575

# Bind to localhost only if possible
rcon.ip=127.0.0.1

Regular Updates

DDoS Protection

Additional Resources

Important Notes

Last updated: November 2024 | For Minecraft Java Edition 1.20+