본문 바로가기

게임/마인크래프트

마인크래프트 서버 구축 #3 - 버킷 24시간 구동시키기

가끔 버킷으로 서버를 켰다가 껐다가 하다보면 이 버킷을 컴퓨터를 종료해도 실행할 수 있으면 좋겠다는 생각을 해본 적이 있을 것이다.

 

오늘은 24시간 컴퓨터가 꺼져있어도 구동가능한 버킷을 만들어볼 것이다.

 

솔직히 말해서, 굳이 마인크래프트 버킷이 아니더라도, 웹 서버를 항상 열거나 또 다른 프로세스를 항상 열고 싶을 때에도 사용할 수 있는 방법이다.

 

시작하기 전에...

이 포스팅은 Linux나 Ubuntu의 터미널을 사용해보지 않은 사람들에게는 매우 어렵고 복잡한 과정처럼 느껴질 수 있다.

하지만 어떻게든 버킷을 항상 켜보고 싶다면 잘 따라와주길 바란다.

 

추가) 생각보다 이 글을 읽으시는 분들이 생각보다 많은 것으로 알고 있습니다, 프로그래밍이나 컴퓨터 소프트웨어 관련 지식이 없으시다면 힘드실 겁니다. 질문 많이 하셔도 좋으니 참고해 가시기 바랍니다.

 

대략적인 과정은 이렇다.

1. 24시간 돌아가는 가상 서버 호스팅.
2. 그 가상 서버 (LINUX)에 기존에 가지고 있던 버킷을 업로드.
3. putty를 이용하여 SSH로 그 서버에 접속
4. 접속한 서버에서 버킷 실행
5. putty의 SSH 세션 유지 기능을 이용하여 버킷 실행 유지

 

이미 윈도우나 기존 OS에 버킷을 가지고 있다고 생각하고 설명하겠다.

 

또한, SSH로 접속할 수 있는 가상 서버가 있어야 한다.

 

없고 만들고 싶다면, 다음 포스트를 참고하라.

 

2019/07/11 - [기타/AWS] - AWS 가상 우분투 서버 호스팅하기 (무료) & putty로 접속하기

 

AWS 가상 우분투 서버 호스팅하기 (무료) & putty로 접속하기

1. 시작하기 전에.. AWS 홈페이지에서 계정을 생성한 후의 상황을 기준으로 설명하겠다. https://aws.amazon.com/ko/ 에 접속하여 계정 생성할 수 있음. 내가 기억하기론, AWS가 네트워크 응답 속도가 너무 느렸던..

shyunku.tistory.com

1. putty 환경 설정

putty로 접속가능한 가상 서버가 있다고 가정하고 시작한다.
putty뿐 아니라 tabby, terminus 등 SSH연결이 가능한 프로그램은 다 가능하다.

 

터미널에 다음과 같은 명령어를 한 줄 씩 친다.

$ sudo apt-get update
$ sudo apt-get install default-jre
$ sudo apt-get install vim

이제 기본적인 것들은 설치되었다.

$ mkdir bukkits

위 명령어를 실행하여 bukkits라는 이름의 폴더를 만든다.

 

이곳에 버킷들을 담을 것이다.

$ ls

를 사용하여 bukkits라는 폴더가 잘 생성되었는지 확인한다.

$ cd bukkits

이제, 자신이 만드려는 버전에 따라 폴더를 만들 것이다.

 

나는 1.12.2 버전의 마인크래프트에 대해 버킷을 만들 것이므로,

$ mkdir bukkit-1.12.2

명령어를 사용하여 bukkits 폴더 하위에 bukkit-1.12.2 폴더를 생성할 것이다.

$ cd bukkit-1.12.2

하위 폴더로 이동해준다. (팁 : 웬만하면 bukk까지만치고 탭을 눌러서 자동완성 시킬 수도 있다. candidates가 많으면 안 뜰 듯)

 

2. 버킷 파일 이동

기존에 있던 버킷 파일을 복사하여 putty로 업로드할 것이다.

 

과정을 진행하기 전에, putty 터미널에서 bukkit 디렉터리를 포함하는 디렉터리에서

$ sudo chmod 755 bukkits/bukkit-1.12.2

위 명령어를 쳐준다. (bukkit 폴더 안에 bukkit-1.12.2가 있으며, $ ls 명령어에서 bukkit 폴더가 출력 될 경우)

 

버킷을 옮길 수 있게 쓰기 권한을 변경한 것이다.

 

이제 아래 설명은 윈도우 사용자가 자신의 컴퓨터에 있던 버킷을 putty package를 사용하여 AWS의 EC2 인스턴스로 전송하려는 상황 기준으로 설명할 것이다. (아래 내용은 pscp를 사용한 것으로써, Filezilla나 Tabby등 타 SFTP 프로그램을 이용하여 옮기는 게 훨씬 쉽다. 오래 전 글이라 양해바란다.)

 

putty 패키지를 깔은 상태라면, 그리고 설치 시 Default Condition(아무것도 터치 안하고 진행)으로 설치했다면,

cmd로 진입하여

> cd C:\ProgramFiles\PuTTY

를 입력해보자. 만약 없다면 디폴트로 재설치해야 할 것이다.

> dir

위 명령어를 입력하면, 해당 폴더의 파일들이 쭉 나오는데,

그 중에 pscp.exe가 있다면 된 것이다.

 

pscp를 통해 AWS SSH로 전송할 것이다.

 

그 상태에서 다음 명령어를 입력한다.

pscp -r -i <AWS_private_key_path> -l <username> "<bukkit_file_path>/*" <AWS_public_dns>:/home/<username>/bukkits/bukkit-<version>

많이 복잡하다 .. 인자에 대해 설명하겠다.

 

<AWS_private_key_path> : putty에 넣은 private key 경로

<username> : SSH 진입 유저네임. Ubuntu으로 만들었다면 ubuntu.

<bukkit_file_path> : 버킷 폴더 경로.

<AWS_public_dns> : AWS public DNS. putty 접속시 Host Name으로 넣었던 주소이다.

<version> : 버킷 버전.

 

나는 바탕화면에 private_key를 두었고, 버킷은 마인크래프트 버킷 폴더에 넣었으며, 버전은 1.12.2이다.

따라서 명령어는 이와 같이 되었다.

> pscp -r -i D:\desktop\ec2_private.ppk -l ubuntu "D:\desktop\마인크래프트 버킷\1.12.2 버킷\*" ec2-??-???-???-???.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/bukkits/bukkit-1.12.2

중간에 DNS 주소가 ??로 되어있는데 내가 비공개로 바꾸어 놓은 것이다.

실제로 칠 때에는 자신의 public DNS 주소를 쳐주면 된다.

 

정상적으로 실행이 되었다면 위와 같은 화면이 뜰 것이다.

 

권한 설정을 제대로 해주지 않으면 permission denied 가 뜰 것이다.

 

윗 단계를 차근차근 다시 해보는 것을 추천한다.

 

이제 새로운 jar파일을 구동시킬 쉘 스크립트 파일을 작성할 것이다.

$ vi server.sh

를 입력하여 server.sh 파일을 생성하고 편집을 시작한다.

 

vim을 처음 사용하는 사람들에게는 다루기 힘들 수도 있지만, 간단하다.

 

처음에 아무것도 입력할 수가 없을 것이다. 이 상태에서 (Insert의 앞 글자인) I 키를 누르면 삽입모드가 되어 글을 입력할 수 있다.

echo "Bukkit 1.12.2 Executing..."
java -Xms2G -Xmx4G -jar craftbukkit.jar

이라고 쓰고, Esc를 누르면 모드를 선택할 수 있는데,

:wq

라고 입력하고 엔터치면 저장이 된다.

 

참고로, -Xms 뒤의 인자는 서버에서 사용할 최소 RAM 크기이고, -Xmx는 최대 RAM 크기이다.

 

만약 AWS 프리티어를 사용한다면 512M~1G나 256M~512M 정도만 될 것이다( 프리티어 인스턴스가 램을 1G 밖에 지원 안하기 때문에..)

 

MB 단위로 사용하려면 G 대신 M을 사용하라.

$ ls

를 사용하여 jar파일과 sh파일이 잘 생성되었는지 확인하라.

 

잘 생성되었다면, 다음 명령어를 입력하면 된다.

$ sudo chmod 755 server.sh
$ sudo ./server.sh

쉘 스크립트 파일에 실행 권한을 부여하고, 실행하는 과정이다.

 

실행이 되면, 익숙한 버킷 실행 장면이 보일 것이다.

만약 UnsupportedClassVersionError 에러가 발생한다면 더 최신 버전의 JRE/JDK 을 설치해야한다. (설치 방법은 따로 적지 않겠음)

 

3. 포트 포워딩

사실 이 AWS 서버는 내 개인적인 프로세스로 사용할 것이므로 포트포워딩이랄 것도 없고, 그냥 포트를 다 열어주는 것이다.

 

AWS의 EC2 서비스의 왼쪽 카테고리에서, 네트워크 및 보안 탭의 보안 그룹을 눌러보자.

 

여러 보안 그룹들이 나타날 것이다.

 

좌측 상단의 보안 그룹 생성을 눌러 보안 그룹을 추가한다.

 

어차피 마인크래프트로만 사용할 것이니 보안 그룹 이름에 minecraft를, 설명에 minecraft port를 기입한다.

 

그리고 인바운드 탭에서 규칙 추가를 클릭한다.

 

위와 같이 유형을 모든 TCP로, 소스를 위치 무관으로 설정하고 생성을 클릭한다.

 

보안 그룹에 추가된 것이 보일 것이다.

 

다시 인스턴스 탭의 인스턴스 옵션으로 돌아간다.

 

실행 중인 인스턴스를 우클릭으로 옵션을 다음과 같이 선택한다.

 

보안 그룹 중 추가한 minecraft를 체크해주고 보안 그룹 할당을 클릭한다.

 

포트 포워딩 끝.

 

4. 테스트

이제 마인크래프트 Multiplay 에 들어가 직접 연결로 테스트해보자.

 

주소에는 AWS public DNS 주소를 기입하면 된다.

 

접속이 잘 된다!

 

ConnectException: refused no further 뭐시기 오류가 뜬다면 서버단의 포트포워딩(보안 그룹 할당) 부분이 잘못되었을 확률이 높다.

 

오류가 나면 다시 천천히 해보는 것을 추천한다.

 

안된다면 서버를 stop하고 다시 구동해보길 바란다. (stop = ctrl+c)

 

이제 24시간 계속 돌아가게 만들어보자.

 

 

5. 24시간 세션 유지

당연히 24시간만 세션 유지하는 것이 아니라 항상 유지시키는 작업이다.

 

물론 도메인이나 AWS 서비스가 만료될 때까지겠지만.

 

putty를 종료했다가 재시작하여 AWS-Connection(AWS 환경 저장 이름)을 Load한다.

 

왼쪽 카테고리의 Connection을 선택한다.

 

우측의 Seconds between keepalives의 인자를 30~120 정도로 잡아주고,

하단의 Enable TCP keepalives 를 체크해준다.

 

이는 SSH 세션으로 null packet을 주기적으로 전송해 깨어있게 만드는 것이다.

 

이 옵션을 다시 Session에 가서 Save하고 Open한다.

 

로그인 한 후,

$ cd bukkits/bukkit-1.12.2
$ screen -S bukkit		# bukkit 이라는 이름의 스크린 생성
$ screen -R bukkit		# bukkit 이라는 이름의 스크린으로 이동
$ sudo ./server.sh		# 서버 버킷 실행
$ ctrl+z			# 중단 및 프로세스 Index 확인, 맨 앞의 숫자가 index임
$ bg %<Index>			# <Index> 자리에 프로세스 Index 기입
$ jobs				# 백그라운드 프로세스 Index 확인
$ disown %<Index>		# 프로세스 Index 기입

위의 명령어로 백그라운드 실행을 하게 만든다.

 

저렇게 하면 putty를 나와도 실행이 유지된다.

 

만약에 서버 버킷을 수정하기 위해 종료하고 싶다하면, screen -R 명령어를 이용해 해당 screen으로 이동 후,

ps -ef | grep java

실행 문구가 적혀 있는 PSID를 찾은 후,

$ sudo kill -9 <PSID>

를 입력해 주면 프로세스를 죽일 수 있다.

 

 

이로써 모든 과정이 끝났다.

 

중간 중간 오류가 잡다한게 많이 일어날 수 있는데 질문은 댓글로 받겠다.

(2020.05.12 학교 일로 바쁘게 되어 이제 더이상 이 포스팅에 대한 질문은 받지 않겠습니다.)

 

5-1. 24시간 세션 유지 (추가)

회사에서 일하다가 새롭게 알게된건 위의 screen과 같은 기능을 하며 더 쉬운 사용이 가능한 nohup이 존재한다는 것이다. screen의 단점은 저러한 명령어를 외워두거나 알아야한다는 점인데, nohup은 쓰기 간편하고 쉽다.

$ sudo su
$ nohup source ./server.sh &

마크 실행도 이렇게 해보진 않았는데, 보통 nohup '<원래 사용하려던 실행 명령어>' & 과 같이 실행하면 백그라운드로 프로그램이 돌아가고 (세션 접속이 꺼져도 유지된다), 프로그램 출력값 (stdout)은 nohup.out에 출력되니 tail -f nohup.out 명령어로 프로그램이 뱉는 로그를 볼 수도 있다.

 

+) nohup은 사실 백그라운드 프로세스의 로그 출력을 뽑아내는 용도일 뿐 실제로 프로세스를 백그라운드로 보내는 것은 "&"이다.

 

+) supervisorctl을 사용해 더 간편하게 프로세스를 백그라운드에서 관리할 수 있다. (여기에 포스트하진 않겠다.)

 

추가적으로 pm2라는 것도 있는데, 이건 node.js 용이지 java의 용도는 아니기에 pass하겠다.