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.
25565 (TCP)logs/latest.logserver.propertieseula.txt (must set eula=true)| 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 |
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
# 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
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
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
# 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
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=
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)
When white-list=true in server.properties:
[
{
"uuid": "player-uuid-here",
"name": "PlayerName"
}
]
java -Xmx4G -Xms4G -jar minecraft_server.jar nogui
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
-Xms4G - Initial heap size (4GB)-Xmx4G - Maximum heap size (4GB) - should match Xms-XX:+UseG1GC - Use G1 Garbage Collector (best for MC)-XX:+ParallelRefProcEnabled - Parallel reference processing-XX:MaxGCPauseMillis=200 - Target max GC pause time-XX:+UnlockExperimentalVMOptions - Enable experimental JVM options-XX:+AlwaysPreTouch - Pre-touch memory pages on startupnogui - Disable graphical interface (better performance)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
Core commands and utilities for server management.
Advanced permission management system.
In-game world editing and region protection.
Economy and permission API bridge.
# 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
# Check if Java is installed
java -version
# If not installed, install Java (Ubuntu/Debian)
sudo apt update
sudo apt install openjdk-17-jre-headless
# You must agree to Minecraft EULA
echo "eula=true" > eula.txt
# Check what's using port 25565
sudo lsof -i :25565
sudo netstat -tulpn | grep 25565
# Kill process or change server-port in server.properties
# 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
ps aux | grep javanetstat -an | grep 25565# 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
online-mode=falseserver-ip= is blank or 0.0.0.0/tps or use Spark profilerview-distance=6-8simulation-distance=4-6# spigot.yml or paper.yml
entity-activation-range:
animals: 16
monsters: 24
misc: 8
# 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
cp -r world/ world_backup/# server.properties
view-distance=8
simulation-distance=6
network-compression-threshold=256
entity-broadcast-range-percentage=100
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
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
#!/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
# 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
# Enable whitelist in server.properties
white-list=true
# Add players in-game or console
/whitelist add PlayerName
/whitelist on
# 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
echo 1 > /proc/sys/net/ipv4/tcp_syncookiesLast updated: November 2024 | For Minecraft Java Edition 1.20+