완벽한 마인크래프트 서버 구축 가이드: Ubuntu에서 Paper 서버 구축부터 DDoS 방어까지 - 2024년 완벽 가이드
안녕하세요! 오늘은 마인크래프트 서버 구축에 대한 모든 것을 아주 상세하게 다뤄보려고 합니다. 단순히 서버를 여는 것을 넘어서, 안정적인 운영과 보안까지 완벽하게 준비할 수 있도록 안내해드리겠습니다. 특히 Paper 서버를 Ubuntu 환경에서 구축하고 운영하는 방법부터 DDoS 공격 방어까지, 서버 운영에 필요한 모든 내용을 망라했습니다.
목차
- 서버 하드웨어 구성 및 추천 사양
- Ubuntu 서버 설정 및 최적화
- Java 설치 및 환경 구성
- Paper 서버 설치 및 초기 설정
- 서버 모니터링 및 관리 시스템 구축
- 자동화 시스템 구축
- 백업 시스템 구축
- 보안 설정 및 DDoS 방어 구성
- 플러그인 관리 및 테스트 환경 구축
- 문제 해결 및 유지보수 가이드
1. 서버 하드웨어 구성 및 추천 사양
마인크래프트 서버를 운영하기 위한 하드웨어 구성은 예상 동시접속자 수와 운영할 플러그인의 수에 따라 달라집니다. 여기서는 일반적인 상황에서 권장되는 사양을 살펴보겠습니다.
기본 서버 사양 (10-20명 기준)
- CPU: 최소 4코어/8스레드 (Intel Core i5-12400 이상 또는 AMD Ryzen 5 5600X 이상)
- RAM: 16GB DDR4-3200 이상
- 저장장치: 500GB NVMe SSD 이상
- 네트워크: 기가비트 이더넷 (1Gbps 이상)
중형 서버 사양 (20-50명 기준)
- CPU: 8코어/16스레드 (Intel Core i7-13700K 이상 또는 AMD Ryzen 7 7700X 이상)
- RAM: 32GB DDR4-3600 이상
- 저장장치: 1TB NVMe SSD 이상
- 네트워크: 2.5Gbps 이상
대형 서버 사양 (50명 이상)
- CPU: 12코어/24스레드 이상 (Intel Core i9-13900K 이상 또는 AMD Ryzen 9 7950X 이상)
- RAM: 64GB DDR4-3600 이상
- 저장장치: 2TB NVMe SSD 이상
- 네트워크: 10Gbps 이상
하드웨어 선택 시 고려사항
CPU 선택에서 가장 중요한 것은 단일 코어 성능입니다. 마인크래프트 서버는 기본적으로 단일 스레드 성능에 크게 의존하기 때문에, 코어 수보다는 각 코어의 성능이 더 중요합니다. Intel의 최신 Core i5나 AMD의 Ryzen 5 시리즈도 충분한 성능을 제공할 수 있습니다.
메모리는 여유롭게 준비하는 것이 좋습니다. 기본 서버 운영에는 8GB 정도면 충분하지만, 다양한 플러그인을 사용하고 많은 청크를 로드해야 하는 상황에서는 16GB 이상을 권장합니다. 특히 월드 크기가 큰 서버의 경우 더 많은 메모리가 필요할 수 있습니다.
저장장치는 반드시 SSD를 사용하는 것이 좋습니다. 특히 NVMe SSD를 사용하면 청크 로딩과 저장이 매우 빠르게 이루어져 서버 성능에 큰 도움이 됩니다. 하드디스크는 백업용으로만 사용하는 것을 추천합니다.
2. Ubuntu 서버 설정 및 최적화
Ubuntu 서버를 설치하고 최적화하는 과정을 상세히 살펴보겠습니다.
Ubuntu 서버 설치
Ubuntu 서버 설치는 최신 LTS(Long Term Support) 버전을 사용하는 것이 좋습니다. 현재는 Ubuntu 22.04 LTS가 가장 안정적입니다. 서버 설치 시에는 최소 설치를 선택하여 필요한 패키지만 설치하는 것이 좋습니다.
# 시스템 업데이트
sudo apt update
sudo apt upgrade -y
# 필수 패키지 설치
sudo apt install -y htop net-tools iftop iotop fail2ban ufw
시스템 최적화
커널 파라미터 최적화
/etc/sysctl.conf 파일을 수정하여 다음과 같은 설정을 추가합니다:
# 네트워크 성능 최적화
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 5000
# 파일 시스템 최적화
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288
시스템 리소스 제한 최적화
/etc/security/limits.conf 파일에 다음 설정을 추가합니다:
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 262144
* hard nproc 262144
네트워크 최적화
# TCP BBR 활성화
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 네트워크 인터페이스 최적화
sudo ethtool -K eth0 gso on
sudo ethtool -K eth0 tso on
sudo ethtool -K eth0 gro on
3. Java 설치 및 환경 구성
마인크래프트 서버 운영을 위해서는 적절한 Java 버전을 설치해야 합니다. Paper 서버는 Java 17 이상을 권장하며, 최신 버전인 Java 21도 사용할 수 있습니다.
Java 설치
# Java 저장소 추가
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:linuxuprising/java
sudo apt update
# Java 21 설치
sudo apt install -y oracle-java21-installer
# 또는 OpenJDK 21 설치
sudo apt install -y openjdk-21-jdk
Java 환경 설정
Java 환경 변수를 설정하고 기본 버전을 지정합니다:
# JAVA_HOME 설정
echo "export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64" >> ~/.bashrc
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> ~/.bashrc
source ~/.bashrc
4. Paper 서버 설치 및 초기 설정
Paper 서버는 Spigot을 기반으로 한 고성능 마인크래프트 서버 소프트웨어입니다. 뛰어난 성능과 안정성을 제공하며, 다양한 최적화 옵션을 제공합니다.
Paper 서버 다운로드 및 설치
# 서버 디렉토리 생성
mkdir minecraft
cd minecraft
# Paper 서버 다운로드
wget https://papermc.io/api/v2/projects/paper/versions/1.20.4/builds/latest/downloads/paper-1.20.4.jar
# 시작 스크립트 생성
cat << 'EOF' > start.sh
#!/bin/bash
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 paper.jar nogui
EOF
chmod +x start.sh
server.properties 설정
server.properties 파일을 생성하고 기본 설정을 구성합니다:
server-port=25565
max-players=20
view-distance=10
simulation-distance=6
spawn-protection=16
max-world-size=29999984
network-compression-threshold=256
enable-command-block=false
max-tick-time=60000
use-native-transport=true
enable-jmx-monitoring=false
enable-query=false
generator-settings={}
enforce-secure-profile=true
enable-status=true
hardcore=false
white-list=false
broadcast-console-to-ops=true
pvp=true
entity-broadcast-range-percentage=100
spawn-npcs=true
spawn-animals=true
function-permission-level=2
text-filtering-config=
spawn-monsters=true
broadcast-rcon-to-ops=true
op-permission-level=4
previews-chat=false
allow-flight=false
level-name=world
motd=A Minecraft Server
query.port=25565
rate-limit=0
require-resource-pack=false
enable-rcon=false
sync-chunk-writes=true
resource-pack-prompt=
prevent-proxy-connections=false
hide-online-players=false
spigot.yml 최적화
spigot.yml 파일을 생성하고 다음과 같이 설정합니다:
settings:
save-user-cache-on-stop-only: true
sample-count: 12
bungeecord: false
player-shuffle: 0
user-cache-size: 1000
moved-wrongly-threshold: 0.0625
moved-too-quickly-multiplier: 10.0
timeout-time: 60
restart-on-crash: true
restart-script: ./start.sh
netty-threads: 4
attribute:
maxHealth:
max: 2048.0
movementSpeed:
max: 2048.0
attackDamage:
max: 2048.0
messages:
whitelist: You are not whitelisted on this server!
unknown-command: Unknown command. Type "/help" for help.
server-full: The server is full!
outdated-client: Outdated client! Please use {0}
outdated-server: Outdated server! I'm still on {0}
restart: Server is restarting
commands:
silent-commandblock-console: false
log: true
spam-exclusions:
- /skill
replace-commands:
- setblock
- summon
- testforblock
- tellraw
world-settings:
default:
merge-radius:
item: 2.5
exp: 3.0
chunks-per-tick: 650
clear-tick-list: false
mob-spawn-range: 6
nerf-spawner-mobs: false
entity-activation-range:
animals: 32
monsters: 48
misc: 32
other: 64
ticks-per:
hopper-transfer: 8
hopper-check: 8
hopper-amount: 1
random-light-updates: false
save-structure-info: true
zombie-aggressive-towards-villager: true
item-despawn-rate: 6000
arrow-despawn-rate: 1200
enable-zombie-pigmen-portal-spawns: true
wither-spawn-sound-radius: 0
view-distance: 10
hanging-tick-frequency: 100
growth:
cactus-modifier: 100
cane-modifier: 100
melon-modifier: 100
mushroom-modifier: 100
pumpkin-modifier: 100
sapling-modifier: 100
beetroot-modifier: 100
carrot-modifier: 100
potato-modifier: 100
wheat-modifier: 100
netherwart-modifier: 100
vine-modifier: 100
cocoa-modifier: 100
max-tick-time:
tile: 50
entity: 50
paper.yml 최적화
paper.yml 파일에는 Paper 서버의 고유한 최적화 옵션들이 포함됩니다:
verbose: false
config-version: 20
settings:
chunk-tasks-per-tick: 1000
use-faster-eigencraft-redstone: true
fix-climbing-bypassing-cramming-rule: true
container-update-tick-rate: 1
max-joins-per-tick: 3
region-file-cache-size: 256
incoming-packet-spam-threshold: 300
remove-corrupt-tile-entities: true
load-permissions-yml-before-plugins: true
bungee-online-mode: true
console-has-all-permissions: false
region-file-cache-size: 256
suggest-player-names-when-null-tab-completions: true
velocity-support:
enabled: false
online-mode: false
secret: ''
watchdog:
early-warning-every: 5000
early-warning-delay: 10000
spam-limiter:
tab-spam-increment: 1
tab-spam-limit: 500
recipe-spam-increment: 1
recipe-spam-limit: 20
book-size:
page-max: 2560
total-multiplier: 0.98
async-chunks:
threads: -1
messages:
no-permission: '&cI''m sorry, but you do not have permission to perform this command.
Please contact the server administrators if you believe that this is in error.'
kick:
connection-throttle: Connection throttled! Please wait before reconnecting.
flying-player: Flying is not enabled on this server
flying-vehicle: Flying is not enabled on this server
timings:
enabled: true
verbose: true
server-name-privacy: false
hidden-config-entries: []
history-interval: 300
history-length: 3600
world-settings:
default:
prevent-moving-into-unloaded-chunks: true
max-auto-save-chunks-per-tick: 24
optimize-explosions: true
disable-thunder: false
disable-ice-and-snow: false
disable-teleportation-suffocation-check: false
max-entity-collisions: 8
disable-chest-cat-detection: true
creative-arrow-despawn-rate: 60
non-player-arrow-despawn-rate: 60
spawner-nerfed-mobs-should-jump: false
remove-corrupt-tile-entities: true
fixed-chunk-inhabited-time: -1
use-vanilla-world-scoreboard-name-coloring: false
enable-treasure-maps: true
treasure-maps-return-already-discovered: false
experience-merge-max-value: -1
prevent-tnt-from-moving-in-water: false
iron-golems-can-spawn-in-air: false
armor-stands-do-collision-entity-lookups: true
nether-ceiling-void-damage-height: 0
grass-spread-tick-rate: 1
water-over-lava-flow-speed: 5
bed-search-radius: 1
use-faster-eigencraft-redstone: true
fix-climbing-bypassing-cramming-rule: true
allow-non-player-entities-on-scoreboards: false
portal-search-radius: 128
portal-create-radius: 16
container-update-tick-rate: 1
parrots-are-unaffected-by-player-movement: false
disable-explosion-knockback: false
keep-spawn-loaded: true
armor-stands-tick: true
non-player-crystal-damage: true
entities-target-with-follow-range: false
zombie-villager-infection-chance: -1.0
all-chunks-are-slime-chunks: false
mob-spawner-tick-rate: 1
per-player-mob-spawns: true
count-all-mobs-for-spawning: false
light-queue-size: 20
auto-save-interval: -1
enable-zombie-pigmen-portal-spawns: true
queue-light-updates: false
optimize-explosions: true
game-mechanics:
scan-for-legacy-ender-dragon: true
disable-pillager-patrols: false
disable-unloaded-chunk-enderpearl: true
disable-chest-cat-detection: true
nerf-pigmen-from-nether-portals: false
shield-blocking-delay: 5
disable-player-crits: false
disable-sprint-interruption-on-attack: false
disable-end-credits: false
disable-relative-projectile-velocity: false
disable-mob-spawner-spawn-egg-transformation: false
hopper:
cooldown-when-full: true
disable-move-event: false
entity-per-chunk-save-limit:
experience_orb: 16
arrow: 16
dragon_fireball: 3
egg: 8
ender_pearl: 8
eye_of_ender: 8
fireball: 8
small_fireball: 8
firework_rocket: 8
potion: 8
llama_spit: 3
shulker_bullet: 8
snowball: 8
spectral_arrow: 16
experience_bottle: 3
trident: 16
wither_skull: 4
entity-tracking-range:
players: 48
animals: 48
monsters: 48
misc: 32
other: 64
ticks-per:
hopper-transfer: 8
hopper-check: 8
5. 서버 모니터링 및 관리 시스템 구축
서버의 안정적인 운영을 위해서는 효과적인 모니터링 시스템이 필수적입니다. 여기서는 다양한 모니터링 도구와 설정 방법을 알아보겠습니다.
Prometheus + Grafana 모니터링 시스템 구축
# Prometheus 설치
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvfz prometheus-*.tar.gz
cd prometheus-*
# Prometheus 설정
cat << 'EOF' > prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'minecraft'
static_configs:
- targets: ['localhost:9225']
EOF
# Grafana 설치
sudo apt-get install -y apt-transport-https software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana
# 서비스 시작
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
마인크래프트 서버 모니터링을 위한 플러그인 설치
Plan (Player Analytics) 플러그인을 설치하여 서버 성능과 플레이어 통계를 모니터링할 수 있습니다:
cd plugins
wget https://github.com/plan-player-analytics/Plan/releases/download/5.5.1/Plan-5.5.1.jar
로그 모니터링 시스템 구축
# ELK Stack 설치
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt update
sudo apt install elasticsearch logstash kibana
# Filebeat 설정
sudo apt install filebeat
cat << 'EOF' > /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /path/to/minecraft/logs/*.log
fields:
type: minecraft
EOF
6. 자동화 시스템 구축
서버 운영의 효율성을 높이기 위한 자동화 시스템을 구축해보겠습니다.
자동 백업 시스템
#!/bin/bash
# backup.sh
MINECRAFT_DIR="/path/to/minecraft"
BACKUP_DIR="/path/to/backups"
MAX_BACKUPS=7
# 백업 파일명 생성
BACKUP_FILE="minecraft_backup_$(date +%Y%m%d_%H%M%S).tar.gz"
# 백업 생성
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C "$MINECRAFT_DIR" .
# 오래된 백업 삭제
cd "$BACKUP_DIR" && ls -t | tail -n +$((MAX_BACKUPS + 1)) | xargs -r rm
# AWS S3로 백업 전송 (선택사항)
aws s3 cp "$BACKUP_DIR/$BACKUP_FILE" "s3://your-bucket/backups/"
자동 재시작 스크립트
#!/bin/bash
# restart.sh
MINECRAFT_DIR="/path/to/minecraft"
SCREEN_NAME="minecraft"
# 서버 상태 확인
check_server() {
if ! screen -list | grep -q "$SCREEN_NAME"; then
return 1
fi
return 0
}
# 서버 시작
start_server() {
cd "$MINECRAFT_DIR"
screen -dmS "$SCREEN_NAME" ./start.sh
sleep 10
}
# 메인 루프
while true; do
if ! check_server; then
echo "서버가 오프라인입니다. 재시작합니다..."
start_server
fi
sleep 60
done
자동 업데이트 시스템
#!/bin/bash
# update.sh
MINECRAFT_DIR="/path/to/minecraft"
PAPER_VERSION="1.20.4"
# 최신 Paper 버전 확인 및 다운로드
check_and_update() {
latest_build=$(curl -s "https://papermc.io/api/v2/projects/paper/versions/${PAPER_VERSION}/builds" | jq -r '.builds[-1].build')
current_build=$(java -jar paper.jar --version | grep -oP 'git-Paper-\K\d+' || echo "0")
if [ "$latest_build" -gt "$current_build" ]; then
echo "새로운 버전이 있습니다. 업데이트를 시작합니다..."
wget -O paper-new.jar "https://papermc.io/api/v2/projects/paper/versions/${PAPER_VERSION}/builds/${latest_build}/downloads/paper-${PAPER_VERSION}-${latest_build}.jar"
mv paper-new.jar paper.jar
return 0
fi
return 1
}
# 메인 실행
cd "$MINECRAFT_DIR"
if check_and_update; then
echo "업데이트가 완료되었습니다. 서버를 재시작합니다..."
# 서버 재시작 로직 추가
fi
7. 보안 설정 및 DDoS 방어 구성
서버의 보안을 강화하고 DDoS 공격으로부터 보호하는 방법을 알아보겠습니다.
기본 보안 설정
UFW (Uncomplicated Firewall) 설정
# UFW 활성화 및 기본 정책 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH 포트 허용
sudo ufw allow ssh
# 마인크래프트 포트 허용
sudo ufw allow 25565/tcp
# UFW 활성화
sudo ufw enable
Fail2ban 설정
# Fail2ban 설치
sudo apt install fail2ban
# 마인크래프트 서버용 Fail2ban 설정
cat << 'EOF' > /etc/fail2ban/jail.d/minecraft.conf
[minecraft]
enabled = true
filter = minecraft
action = iptables[name=minecraft, port=25565, protocol=tcp]
logpath = /path/to/minecraft/logs/latest.log
maxretry = 3
findtime = 600
bantime = 3600
EOF
# Fail2ban 필터 설정
cat << 'EOF' > /etc/fail2ban/filter.d/minecraft.conf
[Definition]
failregex = Failed to verify username!.*\[/(?:(?P<host>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?P<host6>\[[0-9a-fA-F:]+\]))\]
ignoreregex =
EOF
# Fail2ban 재시작
sudo systemctl restart fail2ban
DDoS 방어 구성
Cloudflare 설정
Cloudflare는 무료로 사용할 수 있는 기본적인 DDoS 방어 기능을 제공합니다:
- Cloudflare 계정 생성
- 도메인 등록 및 네임서버 설정
- DNS 레코드 설정
- DDoS 보호 설정 활성화
AWS Shield를 활용한 DDoS 방어
AWS Shield는 두 가지 버전으로 제공됩니다:
- AWS Shield Standard (기본 제공)
- 모든 AWS 고객에게 무료로 제공
- SYN/UDP 플러드, 반사 공격 등 일반적인 Layer 3/4 DDoS 공격 방어
- Amazon CloudFront와 Route 53에 자동 적용
- AWS Shield Advanced (유료)
- 더 정교한 DDoS 공격 방어
- Layer 7 공격 방어
- 24/7 DDoS 대응팀 지원
- DDoS 관련 비용 보호
AWS Shield 설정 방법:
# AWS CLI 설치
sudo apt install awscli
# AWS 자격 증명 설정
aws configure
# AWS WAF 규칙 생성 (Shield Advanced 사용 시)
aws wafv2 create-web-acl \
--name minecraft-protection \
--scope REGIONAL \
--default-action Block={} \
--description "Protection for Minecraft server" \
--region your-region
AWS + Cloudflare 하이브리드 보호 구성
두 서비스를 함께 사용하여 더 강력한 보호를 구현할 수 있습니다:
- AWS 설정
# 로드밸런서 생성
aws elbv2 create-load-balancer \
--name minecraft-lb \
--subnets subnet-xxxx subnet-yyyy \
--security-groups sg-zzzz \
--scheme internet-facing \
--type application
# 대상 그룹 생성
aws elbv2 create-target-group \
--name minecraft-targets \
--protocol TCP \
--port 25565 \
--vpc-id vpc-xxxx \
--target-type ip
- Cloudflare 설정
- Proxy 상태를 DNS Only로 설정
- AWS 로드밸런서를 Origin Server로 설정
- Under Attack 모드 활성화
비용 효율적인 DDoS 방어 방법
1. Cloudflare 무료 플랜 + UFW 설정
# UFW에서 Cloudflare IP만 허용
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
sudo ufw allow from $ip to any port 25565 proto tcp
done
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do
sudo ufw allow from $ip to any port 25565 proto tcp
done
2. TCP Shield 활용
- TCP Shield의 무료 플랜 사용
- 기본적인 DDoS 보호 기능 제공
- 간단한 설정으로 빠른 적용 가능
3. OVH Game Anti-DDoS
- OVH 호스팅 사용 시 제공되는 기본 보호
- 게임 서버에 최적화된 DDoS 방어
- 추가 비용 없이 사용 가능
8. 플러그인 관리 및 테스트 환경 구축
안정적인 서버 운영을 위한 플러그인 관리와 테스트 환경 구축 방법을 알아보겠습니다.
테스트 서버 구축
# 테스트 서버 디렉토리 생성
mkdir minecraft-test
cd minecraft-test
# 테스트 서버 설정
cp ../minecraft/paper.jar ./
cp ../minecraft/start.sh ./
# 테스트 서버용 설정 수정
sed -i 's/server-port=25565/server-port=25566/' server.properties
sed -i 's/Xms4G/Xms2G/' start.sh
sed -i 's/Xmx4G/Xmx2G/' start.sh
플러그인 테스트 프로세스
- 개발 환경 설정
# 플러그인 테스트 디렉토리 생성
mkdir plugins-test
cd plugins-test
# 버전 관리 설정
git init
- 테스트 스크립트 작성
#!/bin/bash
# test-plugin.sh
PLUGIN_NAME=$1
TEST_DIR="test-environment"
# 테스트 환경 준비
prepare_test_env() {
mkdir -p "$TEST_DIR"
cp ../minecraft/paper.jar "$TEST_DIR/"
cp ../minecraft/start.sh "$TEST_DIR/"
}
# 플러그인 설치
install_plugin() {
mkdir -p "$TEST_DIR/plugins"
cp "$PLUGIN_NAME" "$TEST_DIR/plugins/"
}
# 테스트 서버 실행
run_test_server() {
cd "$TEST_DIR"
./start.sh
}
# 메인 실행
prepare_test_env
install_plugin
run_test_server
추천 필수 플러그인 목록
- 성능 모니터링 및 최적화
- Spark: 서버 성능 분석
- CoreProtect: 블록 변경 로깅 및 롤백
- ClearLag: 서버 리소스 최적화
- 보안 및 관리
- LuckPerms: 권한 관리
- AuthMe: 로그인 보안
- WorldGuard: 지역 보호
- 게임플레이 향상
- Essentials: 기본 명령어
- WorldEdit: 월드 편집
- Vault: 경제 시스템
플러그인 충돌 해결
# 플러그인 의존성 체크 스크립트
#!/bin/bash
# check-dependencies.sh
PLUGINS_DIR="plugins"
for plugin in "$PLUGINS_DIR"/*.jar; do
# jar 파일에서 plugin.yml 추출
jar xf "$plugin" plugin.yml
# 의존성 확인
if grep -q "depend:" plugin.yml; then
echo "플러그인: $(basename "$plugin")"
echo "의존성:"
grep -A5 "depend:" plugin.yml
fi
rm plugin.yml
done
9. 문제 해결 및 유지보수 가이드
서버 운영 중 발생할 수 있는 다양한 문제들의 해결 방법과 유지보수 방법을 알아보겠습니다.
일반적인 문제 해결
1. 서버 지연(랙) 해결
# 성능 모니터링 스크립트
#!/bin/bash
# monitor-performance.sh
LOG_FILE="performance.log"
while true; do
# CPU 사용량 확인
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
# 메모리 사용량 확인
MEMORY_USAGE=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')
# 디스크 I/O 확인
DISK_IO=$(iostat -d -x 1 1 | tail -n 2)
echo "$(date) - CPU: $CPU_USAGE% | Memory: $MEMORY_USAGE | Disk I/O: $DISK_IO" >> $LOG_FILE
sleep 60
done
2. 메모리 누수 감지 및 해결
# 메모리 모니터링 스크립트
#!/bin/bash
# monitor-memory.sh
THRESHOLD=90
RESTART_SCRIPT="./restart.sh"
while true; do
MEMORY_USAGE=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2}')
if (( $(echo "$MEMORY_USAGE > $THRESHOLD" | bc -l) )); then
echo "메모리 사용량이 임계값을 초과했습니다. 서버를 재시작합니다."
$RESTART_SCRIPT
fi
sleep 300
done
정기 유지보수 체크리스트
- 일일 점검 사항
#!/bin/bash
# daily-maintenance.sh
# 로그 파일 정리
find logs/ -name "*.log.gz" -mtime +7 -delete
# 플러그인 업데이트 확인
for plugin in plugins/*.jar; do
# 플러그인 버전 확인 로직
echo "Checking $plugin..."
done
# 백업 상태 확인
if [ -f "backup.log" ]; then
if ! grep -q "SUCCESS" backup.log; then
echo "백업 실패 발생"
fi
fi
- 주간 점검 사항
#!/bin/bash
# weekly-maintenance.sh
# 월드 파일 최적화
java -jar paper.jar --optimize-chunks
# 데이터베이스 정리
mysql -u user -p database -e "
DELETE FROM player_data WHERE last_login < DATE_SUB(NOW(), INTERVAL 6 MONTH);
OPTIMIZE TABLE player_data;
"
# 시스템 업데이트
apt update && apt upgrade -y
모니터링 및 알림 시스템
Discord 웹훅을 이용한 알림 시스템
#!/bin/bash
# discord-notify.sh
WEBHOOK_URL="your_webhook_url"
send_discord_message() {
message=$1
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\":\"$message\"}" \
$WEBHOOK_URL
}
# TPS 모니터링
monitor_tps() {
current_tps=$(rcon-cli tps | awk '{print $1}')
if (( $(echo "$current_tps < 18" | bc -l) )); then
send_discord_message "서버 TPS가 낮습니다: $current_tps"
fi
}
# 플레이어 수 모니터링
monitor_players() {
player_count=$(rcon-cli list | grep -o '[0-9]\+')
if (( player_count > 50 )); then
send_discord_message "많은 플레이어가 접속 중입니다: $player_count 명"
fi
}
# 메인 루프
while true; do
monitor_tps
monitor_players
sleep 300
done
10. 추가 최적화 팁과 고급 설정
1. 자바 가비지 컬렉션 최적화
#!/bin/bash
# optimize-gc.sh
# JVM 옵션 설정
JVM_OPTS="-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"
# 시작 스크립트 업데이트
sed -i "s/^java/java $JVM_OPTS/" start.sh
2. 네트워크 최적화
# 네트워크 설정 최적화
cat << 'EOF' >> /etc/sysctl.conf
# 네트워크 버퍼 크기 증가
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP 튜닝
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
# 연결 튜닝
net.ipv4.tcp_max_syn_backlog = 4096
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
EOF
# 설정 적용
sysctl -p
3. 디스크 I/O 최적화
# 디스크 스케줄러 설정
echo "deadline" > /sys/block/sda/queue/scheduler
# 디스크 읽기/쓰기 캐시 설정
blockdev --setra 16384 /dev/sda
결론
이상으로 Ubuntu 환경에서 Paper 마인크래프트 서버를 구축하고 운영하는 방법에 대해 상세히 알아보았습니다. 단순히 서버를 여는 것을 넘어서, 안정적인 운영과 보안까지 고려한 전문적인 서버 구축 방법을 살펴보았습니다.
이 가이드에서 다룬 주요 내용을 다시 한번 정리해보면:
- 서버 하드웨어 선택과 구성
- Ubuntu 서버 설치와 최적화
- Paper 서버 설정과 성능 최적화
- 모니터링 및 관리 시스템 구축
- 자동화 시스템 구현
- 보안 설정과 DDoS 방어
- 플러그인 관리와 테스트
- 문제 해결과 유지보수
특히 DDoS 방어에 있어서는 비용과 효과를 모두 고려한 다양한 방법을 제시했습니다. Cloudflare의 무료 서비스부터 AWS Shield Advanced까지, 상황에 맞는 최적의 방어 전략을 선택할 수 있습니다.
추가 참고 자료
더 자세한 정보를 원하시는 분들을 위해 유용한 참고 자료들을 정리했습니다:
- Paper 공식 문서
- https://docs.papermc.io/
- 서버 설정과 최적화에 대한 상세 정보 제공
- 최신 업데이트와 변경사항 확인 가능
- Minecraft Wiki
- https://minecraft.wiki/
- 게임 메커니즘과 서버 관리에 대한 기본 정보
- 커뮤니티 기여 내용 포함
- SpigotMC 리소스
- https://www.spigotmc.org/
- 다양한 플러그인과 리소스 제공
- 커뮤니티 서포트 포럼
- AWS 게임 서버 호스팅 가이드
- https://aws.amazon.com/ko/gaming/game-server-hosting/
- 클라우드 환경에서의 게임 서버 구축 방법
- 비용 최적화 가이드
마지막 조언
마인크래프트 서버 운영은 단순히 서버를 열어두는 것 이상의 지속적인 관리와 모니터링이 필요한 작업입니다. 이 가이드에서 제시한 방법들을 기반으로 하되, 실제 운영 환경과 상황에 맞게 적절히 조정하여 사용하시기 바랍니다.
특히 다음 사항들을 항상 염두에 두시면 좋습니다:
- 정기적인 백업
- 최소 일 1회 전체 백업 수행
- 중요한 변경 사항 전후로 추가 백업
- 백업 파일의 무결성 정기 검증
- 성능 모니터링
- TPS(Ticks Per Second) 지속 관찰
- 메모리 사용량 추적
- 플레이어 수에 따른 서버 부하 모니터링
- 보안 업데이트
- 운영체제 보안 패치 적용
- Paper 서버 최신 버전 유지
- 플러그인 업데이트 관리
- 커뮤니티 관리
- 명확한 서버 규칙 설정
- 적절한 관리자 권한 분배
- 플레이어 피드백 수렴
이 가이드가 여러분의 마인크래프트 서버 운영에 도움이 되길 바랍니다. 추가적인 질문이나 의견이 있으시다면 언제든 댓글로 남겨주세요. 함께 더 나은 서버 운영 방법을 찾아가면 좋겠습니다.
유용한 커맨드 모음
마지막으로, 자주 사용하게 될 유용한 커맨드들을 정리했습니다:
# 서버 상태 확인
screen -r minecraft
# 서버 성능 모니터링
vmstat 1
iostat -x 1
htop
# 로그 실시간 확인
tail -f logs/latest.log
# 백업 상태 확인
ls -lh backups/
# 방화벽 상태 확인
sudo ufw status verbose
# 시스템 리소스 사용량 확인
free -h
df -h
이러한 명령어들을 적절히 활용하면 서버 관리가 한결 수월해질 것입니다. 모든 운영자 여러분의 성공적인 서버 운영을 기원합니다!
'마인크래프트' 카테고리의 다른 글
마인크래프트 서버 운영, 윈도우와 리눅스의 운영체제 선택 가이드: 전문가가 리눅스를 선택하는 14가지 이유와 성능 최적화 완벽 가이드 (0) | 2024.12.28 |
---|---|
마인크래프트 조명 모드 완벽 가이드: 당신의 게임을 화려하게 밝혀줄 최고의 Fabric 모드 20선 (1) | 2024.12.26 |
[맛있는 마인크래프트의 세계] 요리의 신이 되어보자! 페브릭 요리 모드 20선 완벽 가이드 (2024년 최신판) (3) | 2024.12.25 |
마인크래프트 2024 필수 패브릭 모드 완벽 가이드: 게임의 혁신적 변화를 가져올 30가지 모드 총정리 (1) | 2024.12.25 |
마인크래프트 인테리어의 끝판왕! 가구 모드 추천 20선 - 우리집이 달라졌어요 (0) | 2024.12.23 |