라이믹스 (사실상 PHP)의 특성상 리얼서버와 테스트 서버를 분리하기가 참 곤란합니다
소규모 사이트나 커뮤니티 같이 오류가 나도 중요하지 않은 서비스면 그냥 리얼서버 하나에 다 몰아넣고 해도 괜찮지만,
운영중에 버그가 나면 안된다거나, 클라이언트들에게 공개가 되면 안되는 기능같은걸 만들때는 테스트서버가 필연적으로 필요하죠
그래서 그냥 리얼서버를 덤프떠서 별도의 사이트(테스트 서버)를 하나 만들고, 도메인, DB만 변경한 후에 테스트 서버 변경사항 -> 리얼서버 배포하도록 야매 파이프라인(?)을 짜봤습니다.
> sync.sh (배포 스크립트)
#!/bin/bash rsync -avz /var/www/test-server/public /var/www/real-server\ --exclude files/
이렇게 하면 DB는 서로 다른곳을 바라보고 있으니 서로 데이터가 겹치는 오류도 없고
테스트 서버에서 기능 개발하고, 위의 스크립트만 실행하면 자동으로 리얼서버에 복제가 되니 요구조건은 다 맞춘거죠
예시) 좌측 리얼서버, 우측 테스트 서버
테스트 서버에서 작업 다 하고, sync.sh 명령어를 실행하면 리얼 서버에도 동일하게 적용됩니다.
추가로 서버 내부 로직은 도메인에 따라 개발/리얼서버 분기를 하도록 설정해두면 "테스트 서버에만 작동하는 코드!" 같은것도 구현이 가능합니다
도메인에따라 dev/real을 리턴해주는 간단한 코드를 짜고
아래와 같이 dev일 경우에만 코드 실행 같은 활용도 가능하네요
이상 팁 끝!
git을 사용하는 방법도 있습니다. github이나 개인서버에 비공개 저장소를 만들어 놓고, 테스트 서버에서 push한 후 실서버에서 pull하는 것이지요. 잘못 수정했더라도 rsync와 달리 언제든지 원하는 상태로 롤백할 수 있다는 장점이 있지만, 모듈마다 저장소가 따로 있다면 좀 귀찮아집니다. ㅎㅎ
조금 더 고급 스킬을 동원한다면 github의 webhook을 사용해서, 특정 브랜치에 push하면 자동으로 실서버에 적용되도록 할 수도 있습니다. 평소에는 테스트 서버에서 develop 브랜치에서 작업하다가 슬슬 실서버에 올려도 되겠다 싶으면 master로 merge하는 거예요. 마치 AWS의 Elastic Beanstalk을 사용하는 것 같은데, AWS에서 인스턴스를 통째로 갈아치우는 것보다 git pull이 훨씬 빠르기 때문에 자주 커밋하는 스타일이라면 이 쪽이 더 편리해요.