게임 서버 구축 (16)

jw·2024년 2월 6일
0

게임 서버 구축

목록 보기
17/19

17번째 게임서버 구축 글을 기록하고있다.

저번 포스팅 이후 프록시 서버 구축, 베타테스트 등 많은 일이 있었는데,
AWS 해커톤 캠프 이전에는 클라우드 공부한다고.. 이후에는 컨디션이 완전히 무너져서
시간이 조금 지난 오늘 한번에 몰아서 기록한다.

(그래도 가능한 꾸준히 미리미리 해야지...)


1. 네이버 클라우드 - 프록시 서버 구축

보안 등의 이유로 프록시 서버를 네이버 클라우드 환경에 구축해보았다.

네이버 클라우드는 신규 가입 시 현금처럼 사용할 수 있는 10만크레딧을 제공한다.
연습장처럼 쓰기에는 아주 제격이다.

과정은 다음과 같다.

서버 생성

  1. 서버 이미지 선택

    사용하고 싶은 서버 이미지를 선택해준다.
    익숙한 centos-7.8을 선택하고, 서버 타입만 Standard로 변경해주었다.

  2. VPC, Subnet 생성
    네이버 클라우드 서버를 만들기 위해선 VPC와 Subnet을 생성해주어야 한다.
    IP 주소 범위 정도만 설정해주면 끝나는 간단한 작업이다.

  3. 서버 설정

    서버 세대와 서버 타입정도 변경해주었다.
    프록시 서버로만 쓰일 예정이기 때문에, 크게 고사양 서버가 필요하지 않다.
    Standard 타입의 최소 사양으로 설정해주었다.

  4. 공인 ip
    서비스를 제공하기 위해 지속적으로 사용하려면 공인ip(고정 ip)는 설정해주는 것이 좋다.
    한달에 880원이라고 한다. 설정해주었다.

이외에도 pem키 설정 등의 보안 설정을 마치면 서버를 매우 간단하게 만들 수 있다.

생성 끝!

ACG 설정

AWS로 따지면 보안그룹같은 느낌.
Inbound, Outbound로 나누어 방화벽 설정을 해준다.
마인크래프트 서비스에 해당하는 포트를 열어주었다.

nginx & 마인크래프트 프록시 설정

nginx란?

가벼우면서도 강력한 프로그램을 목표로 원래는 러시아에서 개발되었지만 2020년대 이후 현재는 미국에서 운영중인 오픈 소스 웹 서버 프로그램이다. '엔진엑스'라고 읽는다. HTTP와 리버스 프록시, IMAP/POP3 등의 서버 구동이 가능하다. Java 서블릿은 대개 Apache의 Tomcat을 연동해서 구동하고, PHP의 경우 PHP-FPM(FastCGI Process Manager)을 연동해서 구동한다.
(출처: 나무위키)

TCP 통신을 Nginx를 사용하여 프록시로 경유하려한다. 마인크래프트 서버는 본인 집에서 돌아가고있는 홈 서버이기 때문에.. 보안 강화를 위해 해당 방법을 택했다.

nginx

ACG 설정까지 끝이났다면, SSH연결을 통해 서버에 접속해준다.
이후, nginx 공식 문서를 따라 nginx를 설치해준다.

이후 nginx 디렉토리로 이동

$ cd /etc/nginx

해당 경로에서 conf파일을 열어준다.

$ sudo vi nginx.conf

해당 파일 안에 다음과 같은 내용을 추가한다.

stream {
	server {
    	listen    <port>;
    	proxy_pass <ip>:<port>;
    	proxy_protocol on;
	}
}

공식문서가 아주 잘나와있다. 참고하며 진행하면 된다.
이렇게만 세팅해주면 proxy서버 측의 준비는 끝이난다.

마인크래프트 프록시 설정

proxy protocol 방식으로 통신하려면, 마인크래프트 서버 측에도 설정을 해주어야 한다.
해주지 않으면.. 뭐 사실 딱히 해주지 않아도 가능하긴 했다.

가능은 한데.. 마인크래프트 서버 측에 오는 신호가, 모두 네이버 클라우드 서버의 ip를 달고 도착한다. 5명이 접속해도, 로그에는 모두 네이버 클라우드에서 보낸 신호로만 ip가 기록된다는 것 이다.

마인크래프트는 유저를 차단할때 두가지 방법이 있다.

  • 유저의 ip ban
  • 유저의 닉네임 ban

보통 2가지를 같이 해주어야 안전하다고 할 수 있는데, 이렇게되면 ip벤은 사용할 수 없지않은가...
그래서 방법을 찾아보았고 생각보다 무척 간단했다.

minecraft 버킷 설정 파일(paper-global.yml) 안을 보면 다음과 같은 옵션이 있다.

proxies:
	bungee-cord:
	online-mode: true
    proxy-protocol: true
    velocity:
    enabled: false
    online-mode: false
	secret: ''

여기서 proxy-protocl 옵션을 true로 바꿔주기만 하면 된다.

이후 원래 사용하던 방화벽은 규칙은 삭제하고,
네이버 클라우드 ip 주소의 마인크래프트 포트, tcp 프로토콜만 허용하도록 firewalld를 새로 설정해준다.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="[특정 IP 주소]" port port="[특정 포트]" protocol="tcp" accept'

DNS 설정

지금도 네이버 클라우드의 서버 ip주소로는 접속이 가능하지만,
사실 서버 주소가 ip주소면 좀 안예쁘지 않은가. (아닌가?)

기존의 포트를 지정해주던 srv레코드를 삭제하고,
A레코드로 이름만 바꿔주었다.

사실 이렇게 번거로운거 안하고, 클라우드 플레어 자체적으로도 proxy를 제공하긴 한다. 하지만, 너무 느리다. 진짜 너무 속터지게 느리다. 무료 유저라 그렇다해서, 그럼 결제하면 어떤가 봤더니.. 금액이.. 비싸다.
그래서 이럴바엔 내가 직접 프록시서버 만들고 말지. 어차피 나중에 웹도 배포하려면 리버스프록시 해야되는데 하는 생각으로 그냥 만들었다. 네이버 클라우드는 해당 사양의 서버를 한달 정액제 기준 88,000원에 사용할 수 있다. 연습용으로는 아주 충분한 것 같다.

이제 일반 유저는 네이버 클라우드 서버를 통해서만 우리 서버에 접근이 가능하다.
본인의 외부 ip로 직접 연결하여 들어가는 방법은
정기 점검을 한다거나, 패치 사항 업데이트 등 외부 유저가 접근하면 안될때 사용하려한다.

네이버 클라우드 서버 ip 주소, A record 모두 잘 접속되는 것 확인.


2. 클라우드 플레어 - workers serverless system

CloudFlare Workers

베타테스트 진행 전에 서비스들을 하나씩 점검하며 문제점을 발견했다.
기존 DNS 레코드 설정 방식을 사용하면, 프록시 설정 시 요청할 수 있는 쿼리 수에 제한이 있었다.
일정 이상 쿼리 요청을 넘어가면 자동으로 외부의 공격이라고 판단하고.. 429에러가 뜨며 약 1분간 연결이 끊겨버린다.

2-3명 정도만 접속해서 맵을 봐도 금방 에러가 떠버린다.
지도 특성상 이미지를 계속 불러와야 하다보니 그런 것 같다..
답답해서 방법을 찾아보았다.

DNS 네임서버로 사용중인 클라우드 플레어에 들어가니 이런 서비스가 있었다.

더 자세히 알아보자. 클릭하고 들어가보았다.

흠... AWS Lambda와 매우 흡사한 느낌. 찾아보니 실제로 그렇다고 한다.
그래서, 현재 제공중인 게임 내부 지도를 보여주는 웹사이트를 해당 서비스를 활용하여 serverless 방식으로 배포해보았다.

프록시 설정

Worker를 만들면 다음과 같은 기능이 추가된다.
해당 스크린샷은 이미 사용중인 worker를 캡쳐해온 것이라, 요청과 cpu 시간 중앙값이 나와있다.

빠른 편집으로 들어가서 js 파일을 수정해준다.
매우 간단한 방식으로 해주었다.

이후 트리거 탭에서, 우리 웹사이트 url를 입력한다.
그럼 끝. 진짜 너무 간단하다.. 요새 웹 배포나, 통신 방식 배우면서 드는 생각이
일반적인 인프라보다 너무 간단하다는 것 이다. 너무 쉽게, 사용하기 편하게 되어있다.

설정을 마치고 몇 번 접속해서 사용하면 다음과 같이 요청이 잘오고있는 것을 확인할 수 있다.

프록시 켜주고~ ssl 암호화도 해주었다.


3. 베타테스트

그렇게 손님 맞을 준비를 다 하고, 베타테스트를 위해 조금 더 준비를 했다.
이전에 업로드했던 유저용 디스코드와 깃북도 조금 더 깔끔하게 다듬었다.

디스코드: https://discord.gg/VmqBwuCU
깃북: https://minecraft-11.gitbook.io/minecraft-forecity/

베타테스트는 2/6일 저녁 7시 진행되었으며, 지인 5분이 함께 해주었다.
우리 팀원 3명 역시 함께 플레이하며 모니터링했다.

게임 플레이

인게임

9명이 접속해있다.

채팅도 북적북적

우리 팀원들

로그

로그 일부를 캡쳐해왔다.
사람이 많다보니 평소 볼 수 없었던 로그들도 종종 있었고, 의외로 에러 로그는 없었다.
평상시 우리 내부적으로만 테스트 할 때 보다 훨씬 재미도있고, 도움이 된 것 같다.
로그파일 크기만 평소 로그의 20배 정도..

유저 피드백

베타테스트를 진행하며 이전 글에서 개발했다고 언급했던 편지봇을 활용하여 피드백을 받고있다.
벌써 약 20개 정도 글이 DB에 저장되어있으며,
알림 시스템을 만들어두어 피드백이 들어오는대로 확인하고있다.

잘 보이지는 않지만.. 뭐랄까 DB에 들어온 내용 그대로를 기록하고싶었다!
이 피드백을 남겨주신 분은 블로그 보고 찾아와주신 분이다. 게임 내부 ㅋ ㅏ ㅈ ㅣ 노의(아니 이거 왜 비공개 처리돼... 진짜 velog!!) 확률 세팅 관련하여 의견을 내주셨다.

이 글도 보실지는 모르겠지만, 아직 홍보도 안했는데 찾아와서 플레이해주시고,
좋은 피드백까지 남겨주셔서 감사하다는 말씀을 다시 한 번 드리고싶다.

베타테스트는 2/6 ~ 2/13 동안 진행 예정이고, 14일 점검 후 15일부터 오픈 및 홍보 예정이다.
이전까지는 수시로 모니터링하며, 밸런스 등 게임 내부 조정에 힘쓸 것 같다.


4. 아키텍처

현재 아키텍쳐

최종 아키텍처 (미완)

  • 개발 환경 세팅은 아키텍처에 따로 넣지 않았다. (디스코드 ap서버, db 연동 등)
    다음 사항들을 변경하려한다.
  • 현재 DB서버가 열려있다.. pc가 여유가있는게 아니다보니, DB양도 적고 해서 일단 DB서버에 웹을 만들기 시작했었다. 따로 분리하여, 로컬 서버에서만 접속 가능하고, 실시간 연동을 하더라도 AP서버를 통해 통신하는 방식으로 수정할 예정
  • naver cloud 크레딧을 모두 사용한다면, AWS로 migrate해 볼 생각이다. AWS의 다양한 서비스를 이용해보려한다.

분명 더 추가되고, 빠지고 아직 고칠게 많은 서비스 아키텍처다.
수정되면 수정되는대로 또 기록하겠다.


5. etc

로그 모니터링 시스템 개선

기존 로그 채널은 너무 무작위하게 로그가 오고, 게임 내부의 모든 로그가 다 전송되었기 때문에 알람을 켜두기가 어려웠다.~~ (마치 디도스...)~~ 하지만, 게임서버를 정식으로 열게되면 서버 에러는 즉시 인지할 수 있게끔 시스템을 만들어두어야 한다고 판단했다. 그래서 기존 로그 모니터링 시스템 데몬을 수정, 스크립트 파일도 수정하였다.

결과적으로, error라는 채널을 신설하여, ERROR 로그는 따로 받도록 나누었다.
하지만, ERROR 로그가 발생하면 발생하기 시작한 그 한 줄만 전송되도록 해두었기 때문에 사실상 알림용이고, 풀 로그는 로그에 시간대를 직접 검색해서 보는 방식으로 남겨두었다.

로그 분석(키바나)

이전 aws 캠프 멘토님께서, 지금 우리 게임서버에 이용할만한 방법이나 툴들을 많이 알려주셨는데
로그 분석 관련하여 키바나라는 오픈소스를 사용해보면 좋을 것 같다 말씀해주셨다.

마인크래프트 자체가 로그를 꽤나 자세하게 잘 기록해줘서 이걸 활용하지 않는다는건... 소 뼈를 그냥 버리는 것 같은 느낌이랄까. 제대로 분석하면 다양한 곳에 활용할 수 있을 것 같음.

데이터 분석을 맡고있는 팀원이 현재 공부하며 시도하고있다.
사골국을 끓여보자!

서버 홍보 팜플렛 제작

본인이 이전 서버를 운영할때는 방송을 켜서 플레이했기에, 그게 자연스레 홍보가 되었던 것 같다.
방송을 켜서 플레이하고, 한 명 들어오면 같이 하실래요? 하고, 또 들어오면 같이해요~ 하고..
그렇게 한명,두명 늘며 방송 시청 인원은 평균 30명까지 늘었고,
카페 인원도 1000명 가까이 되었었다. 친구가 친구에 친구를 불렀달까..

요새는 홍보를 어떻게하나 찾아봤다.

한마포: https://www.koreaminecraft.net/
마크 서버리스트: https://minelist.kr/

대표적으로 유행하는 마인크래프트 커뮤니티 사이트들이다.
이런 사이트에 영상이나, 자체 홍보 팜플렛을 만들어 주로 홍보하는 것 같다.
아래는 우리가 현재 제작중인 팜플렛.



확실히 우리는 공대생이다. (디자인 잼병들... 디자인도 재능이다)
공대 3명이서 뭘 하겠냐만은... 일단 더 시도해보고 아 이건 진짜 아니다 싶으면 디자인 전공 친구에게 약간의 보수를 주고 맡길 예정이다.


6. 향후 계획

  • 자체제작 웹 개발
  • 웹 QA 시스템 구축
  • AWS 마이그레이션

이정도가 앞으로 계획임.
이제 운영까지 하면 머리가 굉장히 아플 것 같지만...
그래도 좋은건 테스트 진행중이라 지금도 계속 서버를 열어두고 있는데, 들어와서 플레이 해주시면 그 로그를 보는 재미가 아주 쏠쏠하다.

사실 뭔가 해보려고 해도 데이터가 없거나 서비스 이용자가 많지 않아서 프로젝트 구상 선에서 끝나는 경우가 많은데, 이렇게 직접 우리가 주도적으로 서비스를 해볼 수 있다는게 참 좋은 것 같다.

많은 사람들이 이용해줬으면 좋겠다.


여담으로, 웹 & QA 서비스 구축과 aws 마이그레이션까지 끝나면 또 새로운 프로젝트를 진행할 생각이다.

2월까지 해당 프로젝트를 마무리하고, 운영만 계속 하는 걸 계획으로 잡고있으니
3월에는 새로운 프로젝트로 또 블로그를 써나갈 수 있지 않을까?

profile
『Infra Engineering』

0개의 댓글

관련 채용 정보