Windows Azure Virtual Machine에 Apache 2 + PHP 5 + Cubrid + XE 설치하기

안녕하세요. Windows Azure MVP 남정현입니다.


Windows Azure Virtual Machine에서 리눅스를 지원하는 것은 다들 잘 알고 계실 것입니다. Ubuntu, CentOS, RHEL, Suse Linux 등을 이미 지원하고 있고 앞으로 개발 진척 상황에 따라서 더 많은 배포판을 지원해 나가게 될듯 합니다. 이번 강좌에서 소개하려고 하는 내용은 Windows Azure Virtual Machine에서 리눅스를 사용하면서 Apache 2 + PHP 5 + Cubrid + XE의 조합으로 XpressEngine 기반의 웹 사이트를 만드는 방법에 대한 것입니다. 익히 알고 계시는대로 Cubrid는 국산 오픈소스 데이터베이스로 다양한 적용 레퍼런스를 가지고 있는 믿음직한 솔루션입니다. 충분한 테스트와 검증이 필요하겠으나, 첫 설치 과정과 기본적인 동작에서 Cubrid는 Windows Azure Virtual Machine 환경에서 안정적으로 잘 작동하고 있습니다.


ps. 2012년 초반에 문제가 되었던 Windows Azure Virtual Machine의 디스크 I/O 관련 이슈, 부팅 후 일정 시간이 지난 다음에 갑작스럽게 Kernel Panic이 찾아오는 현상은 이 글을 쓰는 현 시점에서 해결된 상태입니다.


업데이트: SkyDrive에 아래 60장의 스크린 샷을 모아서 XPS 문서와 ZIP 파일로 업로드하였습니다. 요약해서 보고 싶으신 분들께 도움이 될까하여 공유합니다.


링크 바로가기: http://sdrv.ms/TGXhWs


60장의 그림과 함께하는 설치 과정 따라하기


1. Windows Azure Virtual Machine 베타 프로그램의 신청 여부를 확인하고, http://manage.windowsazure.com/ 에서 하단의 NEW 버튼 클릭 -> Compute 클릭 -> Virtual Machine 클릭 -> Quick Create 순으로 클릭합니다.


 DNS 이름을 지정합니다.
Ubuntu 12.04 LTS (혹은 다른 Ubuntu 이미지도 무관합니다.)를 선택합니다.
* 적정한 Instance Size를 선택합니다.
* 사용자 ID가 azureuser 임을 기억하시고 비밀 번호를 새로 지정합니다.
* 데이터센터 위치는 대한민국 접속자 기준으로 East Asia를 선택하는 것이 유리합니다.


모든 정보를 입력하면 Create Virtual Machine 버튼을 클릭하고 잠시 기다립니다.



2. 새 Windows Azure Virtual Machine과 Storage가 생성된 것을 확인하면 만들어진 Virtual Machine을 선택하여 상세 관리 페이지로 이동합니다. 



3. Dashboard 화면의 오른쪽 Quick Glance 섹션에서 SSH Details 항목의 접속 주소와 포트 번호를 확인합니다. 이 접속 정보를 사용하여 여러분이 선호하는 Secure Shell 지원 Telnet 프로그램으로 접속을 시도합니다. Windows 환경에서 널리 사용되는 프로그램은 Putty이며, http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 에서 내려받아 설치할 수 있습니다. 



4. Putty를 실행하고, Host Name 입력 상자와 Port 입력 상자에 접속 정보를 입력한 후 Connection type은 SSH로 선택하고 Open 버튼을 클릭합니다. 필요한 경우 Saved Sessions 입력 상자 아래에 새로운 엔트리 이름을 입력하고 Save 버튼을 클릭하면 다음번에 리스트 상자에서 저장된 항목을 더블 클릭하여 바로 연결을 시작할 수도 있습니다. 



5. 처음 원격 서버에 접속하면 임의로 생성한 RSA2 지문 키 값의 유효성 여부를 놓고 경고하는 대화 상자가 나타나게 됩니다. 예 (Yes) 버튼을 클릭하여 항상 이 값을 수락하도록 설정을 저장합니다. 



6. 사용자 ID는 azureuser로, 암호는 Quick Create 당시 지정한 암호를 입력하여 로그인합니다. 



7. 지금부터 수행하려는 작업들은 줄곧 권한 상승을 필요로 하기 때문에 작업의 효율성을 위하여 셸 자체를 권한 상승시키려고 합니다. sudo /bin/bash 명령을 실행하여 BASH 셸을 권한 상승 시킨 상태에서 실행합니다. 사용자 비밀 번호를 물어보는 경우 다시 입력합니다. 



8. vi /etc/hostname 명령어를 입력하여 /etc/hostname 파일을 아래와 같이 FQDN (Fully Qualified Domain Name) 이름으로 수정합니다. 초기값은 단순 호스트 이름으로만 되어있었을 것인데 이 이름을 앞에서 접속하기 위하여 사용한 전체 주소로 바꾸어주면 됩니다.


* VI에서 텍스트 편집 모드로 들어가려면 처음 상태에서 i 키를 누릅니다.
* 텍스트를 편집하고난 다음에는 Esc 키를 눌러 명령 모드로 전환합니다.
*  :wq! 를 입력하여 파일을 저장하고 VI를 닫습니다.



9. vi /etc/hosts 명령어를 입력하여 /etc/hosts 파일에 위에서 /etc/hostname에서 추가한 FQDN 이름에 대한 localhost 엔트리를 새로 추가합니다. VI에서의 파일 편집 방법은 8번 단계의 부연 설명을 참고하십시오. vi 사용이 익숙하지 않다면 nano 혹은 emacs 등의 유틸리티도 대안이 될 수 있습니다.



10. 새로 변경한 설정을 반영하기 위하여 service hostname start 명령을 입력합니다. 



11. SSL 인증서 갱신을 위한 유틸리티의 설치가 필요합니다. apt-get install ssl-cert 명령을 입력합니다.



12. 인증서 갱신을 위하여 make-ssl-cert generate-default-snakeoil –force-overwrite 명령어를 입력합니다. 



13. 이제 Apache HTTP Server를 설치할 차례입니다. apt-get install apache2 명령어를 입력합니다. 



14. PHP5를 설치합니다. apt-get install php5 명령어를 입력합니다. 



15. XpressEngine은 PHP GD 라이브러리의 기능을 활용합니다. GD 라이브러리는 .NET Framework의 GDI+가 ASP.NET이나 일반 응용프로그램을 위하여 해 줄 수 있는 백그라운드 이미지 렌더링에 대한 기능과 거의 일치하는 것으로 동적 이미지 생성 작업에 꼭 필요합니다. apt-get install php5-gd 명령어를 입력합니다.



16. Cubrid 측 Ubuntu Repository를 가져오기 위하여 Repository Entry를 수정해야 하는데 이를 위한 유틸리티를 설치하기 위하여 apt-get install python-software-properties 명령어를 입력합니다. 



17. add-apt-repository ppa:cubrid/cubrid 명령어를 입력하여 Cubrid Database 및 관련 구성 요소를 apt-get 명령어로 설치할 수 있도록 리포지터리 정보를 시스템으로 가져옵니다. 



18. 리포지터리 정보를 새로 내려받아 병합하기 위하여 apt-get update 명령을 수행합니다. 



19. 큐브리드 데이터베이스의 설치를 위하여 apt-get install cubrid 명령어를 실행합니다. 



20. PHP5에 큐브리드 데이터베이스 드라이버 설치를 위항 apt-get install php5-cubrid 명령어를 실행합니다. 



21. 큐브리드 데이터베이스의 환경 변수 반영 등 여러가지 부수적인 작업을 위하여 Windows Azure Virtual Machine의 리눅스 인스턴스를 shutdown -r now 명령어로 재시작합니다. 시스템 재 시작에는 얼마 시간이 걸리지 않습니다. 



22. 약 3~5분 정도 뒤에 아래 그림과 같이 PuTTY 창의 제목 표시줄을 오른쪽 버튼으로 클릭하여 Duplicate Session 혹은 Restart Session 메뉴를 클릭하면 같은 접속 정보를 사용하여 다시 접속을 시도합니다.



23. 다시 로그인합니다. 



24. 큐브리드 데이터베이스의 환경 설정을 위하여 전용 셸로 세션을 바꿉니다. sudo su -s $SHELL cubrid 명령어를 입력하고 azureuser 사용자의 비밀 번호를 다시 입력합니다.


* 주의: 이 명령어는 CUBRID 데이터베이스의 환경 변수 설정이 시스템 전체에 반영되지 않은 경우 작동하지 않습니다. 그런 경우 21단계의 명령어 shutdown -r now 명령어를 사용하여 시스템을 다시 시작해야 합니다. 권한이 없다고 나오는 경우 sudo shutdown -r now 명령어를 이용하여 권한 상승을 요청합니다.



25. cubrid service start 명령어를 입력하여 큐브리드 핵심 서비스를 시작합니다. 그리고 cubrid createdb xe 명령어를 입력하여 새 데이터베이스 ‘xe’를 생성합니다. 데이터베이스의 초기 크기는 512MB로 만들어지며 이 과정에서 시간이 다소 걸릴 수 있습니다.



26. cubrid server start xe 명령어를 입력하여 25단계에서 만들어진 데이터베이스 xe를 활성화시킵니다.



27. 새로 만들어진 xe 데이터베이스의 dba 계정 비밀 번호 변경을 위하여 csql -u[사용자 ID] [데이터베이스 이름] 형식으로 명령어를 입력합니다. 이번 강좌의 내용을 기준으로 하면 csql -udba xe 명령어를 입력하면 됩니다. 



28. CUBRID SQL Interpreter 배너가 출력되는 것을 확인할 수 있습니다. 이제 C-SQL 명령어를 입력해야 하는데 alter user dba password ‘[사용할 비밀 번호]’; 명령어를 입력합니다. 



29. 정상적으로 명령이 수행되었음을 확인한 다음 ;ex 명령어를 입력하여 CSQL 세션을 닫습니다. 



30. 이제 Apache HTTP Server의 디렉터리 컨텐츠를 구성해야 합니다. 정확한 디렉터리 위치를 알아보기 위해서 /etc/apache2 디렉터리로 이동한 다음 ‘DocumentRoot’ 지시자를 포함하는 파일들의 내용을 grep -nr ‘DocumentRoot’ * 명령어로 검색해봅니다. 결과가 /var/www로 나타나므로 실제로 해당 위치로 이동해야겠군요.



31. 위치로 이동하기에 앞서 CUBRID 셸을 exit 명령으로 빠져 나옵니다. 그 다음 다시 원래의 셸에서 sudo /bin/bash 명령으로 권한 상승을 시도합니다.



32. 이제 cd /var/www 명령어를 입력하여 Apache HTTP Server의 기본 Contents 디렉터리로 이동합니다. 그리고 이곳에서 PHP의 정상 설치 여부를 확인하기 위하여 cat > test.php 명령어를 입력하여 표준 입력 장치로부터 들어오는 내용을 파일로 기록하도록 만듭니다. 여기서의 표준 입력 장치는 우리가 PuTTY를 통해서 밀어넣는 키보드 입력이 될 것이므로 간단한 스크립트 작성이 가능해집니다. 스크립트 파일의 내용은 다음과 같습니다.


<?php
phpinfo();
?>
[Ctrl+Z 키 입력] 



33. 기본적인 구성이 완료되었으므로 이제 Windows Azure Management Portal (http://manage.windowsazure.com/)으로 이동하여 방화벽 설정을 조금 변경해야 합니다. 현재 방화벽은 Secure Shell을 위해서 TCP 22번 포트만 개방된 상태이며 Apache HTTP Server가 열어놓은 TCP 80 포트가 밖에서도 연결될 수 있도록 설정을 변경해야 합니다. 아래 그림에서처럼 Endpoints 메뉴를 클릭하고 하단의 Add Endpoint 버튼을 클릭하여 새 설정을 추가합니다.


note. Linux VM 자체의 방화벽 설정이 있더라도 Windows Azure Firewall에서 열지 않으면 외부에서는 특정 포트 번호로 연결을 맺을 수 없습니다. 그러나 여러 VM이 단일 Cloud Service 안에 Join하는 경우 이 영역 안의 각각의 VM들은 상호 간의 자체 방화벽 구성이 Windows Azure 방화벽 구성보다 우선시됩니다.



34. Add Endpoint 라디오 버튼을 체크한 상태에서 다음 버튼을 클릭합니다.



35. NAME에는 알아보기 쉬운 설정 명칭 (여기서는 HTTP로 정했습니다.)을, PROTOCOL은 TCP를, PUBLIC PORT, 즉 밖에서 받아들일 포트 번호는 80, PUBLIC PORT로 받은 연결을 실제로 이어줄 VM 측의 PORT인 PRIVATE PORT도 80으로 지정하여 웹 연결을 개통시킵니다. 설정을 마쳤으면 완료 버튼을 클릭합니다.



36. 설정이 완료될 때 까지 잠시 기다립니다.



37. 정상적으로 반영되면 아래 그림과 같이 녹색 체크 마크가 설정 앞에 나타납니다. 이제 테스트 URL로 접속을 시도합니다. 지금 여러분의 브라우저에서 http://[호스트 이름].cloudapp.net/test.php 와 같이 주소를 입력해봅니다.



38. PHP 5.3 인터프리터가 잘 작동하고 있음을 확인할 수 있습니다. PHP 보완 솔루션도 같이 설치되었다고 나오는데 특이하게도 해외 프로젝트이지만 이름이 SUHOSIN (수호신)이라고 하는군요. 😀



39. Ctrl+F 키를 눌러서 페이지 내 검색 창을 엽니다. 검색 키워드로 CUBRID를 입력하여 아래 그림과 같이 Cubrid Driver가 활성화되어있는지 확인합니다.



40. 이어서 gd를 검색 키워드로 넣었을 때 아래 그림과 같이 항목이 검색되고 GD Support가 enabled로 되어있는지 확인합니다.



41. 이제 드디어 XpressEngine을 설치할 차례입니다. 브라우저 창에서 http://www.xpressengine.com/ 으로 주소를 넣어 이동한 다음, 최신 버전의 XE Core 패키지 다운로드 메뉴를 찾아 클릭합니다.



42. 다운로드 버튼을 오른쪽 버튼으로 클릭하여 바로 가기 복사 메뉴 (혹은 다른 브라우저의 경우 이에 준하는 기능을 활용하세요.)를 클릭하여 다운로드 링크를 가져옵니다. 이 주소를 이용하여 바로 xe.zip 파일을 리눅스 VM에서 내려받으려고 합니다. 이 방법을 사용하지 않고 PuTTY 유틸리티의 자매 도구인 PSFTP 툴을 사용하여 직접 업로드해도 무방하지만 추가 프로그램 없이 손쉽게 접근할 수 있어 이 방법으로 시도하려고 합니다.



43. 리눅스 VM에서 웹의 파일을 콘솔 상에서 다운로드받기 위해 wget 유틸리티를 설치하려고 합니다. 보통은 설치가 이미 되어있지만 업데이트 확인 차 apt-get install wget 명령을 입력하여 다시 설치를 확인합니다.



44. 파일을 다운로드받기 위해서 wget -O xe.zip [42단계에서 복사한 URL] 명령어를 입력합니다. -O 스위치는 HTTP 서버로부터 파일 다운로드가 발생할 때 저장할 파일의 이름을 미리 스위치로 지정한 것입니다. 그리고 42단계에서 복사한 URL은 wget -O xe.zip 명령어 다음에 공백을 한 칸 넣고 콘솔 윈도우에서 마우스 오른쪽 버튼을 클릭하면 아래와 같이 자동으로 붙여넣기가 됩니다. 이제 45단계의 내용을 꼭 참고하세요.



45. 리눅스 Bash 셸의 특성 상 URL에 붙어있는 기호들 중 & (Ampersand) 기호는 꼭 이스케이프 처리를 해주어야 합니다. 키보드의 좌우 방향키를 이용하여 명령어를 수정할 수 있으므로 & 기호를 & 기호로 아래 그림과 같이 수정해줍니다. 이로서 전체 명령어는 다음과 같습니다.


wget -O xe.zip http://www.xpressengine.com/?module=file&act=procFileDownload&file_srl=21367347&sid=2e7e5518f7168e68513400404840b5f1



46. 정상적으로 아래 그림과 같이 다운로드가 완료되었는지 확인합니다.



47. ZIP 파일의 압축을 풀기 위해서 unzip 유틸리티를 설치해야 합니다. apt-get install unzip 명령을 실행하여 unzip 유틸리티를 설치합니다.



48. unzip xe.zip 명령어를 실행하여 /var/www/xe 디렉터리에 XpressEngine 패키지를 압축 해제하여 설치합니다.



49. 이제 불필요한 파일을 정리하고 퍼미션 설정을 할 차례입니다. /var/www 디렉터리의 xe.zip, test.php 파일을 삭제하고 xe 디렉터리 내에 files 디렉터리를 새로 생성한 다음 chmod 명령어로 디렉터리 퍼미션을 조정합니다.


cd /var/www
rm xe.zip
rm test.php
cd xe
mkdir files
chmod 707 files



50. 이제 브라우저 창에서 http://[호스트 이름].cloudapp.net/xe/ 주소를 넣어 아래 그림과 같이 설치 마법사가 나타나는지 확인합니다.




51. 페이지 언어가 한국어로 변경되었으면 다음 버튼을 클릭합니다.



52. 아래 그림과 같이 모든 사항이 가능으로 표시되면 설치할 준비가 된 것입니다. “설치를 진행합니다.” 버튼을 클릭합니다.



53. 이번 강좌에서 데이터베이스로 CUBRID를 사용할 것이므로 데이터베이스 종류는 cubrid를 선택하고 다음 버튼을 클릭하여 진행합니다.



54. 데이터베이스 접속 정보를 설정합니다.


* Apache HTTP Server와 DB 서버가 같은 위치에서 실행 중이므로 loopback 주소인 127.0.0.1을 입력합니다.
* DB 서버에 대해 별도로 포트 번호를 변경하지 않았으므로 포트 번호는 기본값을 사용합니다.
* DB 아이디는 빠른 진행을 위해서 dba로 사용하고, DB 비밀 번호는 28단계에서 지정한 비밀 번호를 입력합니다.
* DB 이름은 25단계에서 지정한 인스턴스 이름인 xe를 입력합니다.
* 테이블 머리말은 기존에 xe를 설치한 적이 없는 DB 위에 설치하는 경우 기본 값을 그대로 사용해도 됩니다.


여기서 참고할 사항은 데이터베이스의 경우 Windows Azure Firewall에서 해당 포트 번호인 33000을 임의로 개방하지 않을 경우 밖에서는 Cubrid 데이터베이스로 접속할 방법이 없습니다. 필요한 경우 Cubrid 서버의 기본 포트 번호를 변경하여 한층 더 강력한 보안을 유지할 수도 있습니다.



55. 데이터베이스 접속이 완료되면 아래와 같이 짧은 주소 사용 여부와 시간대 설정 페이지가 나타납니다. 짧은 주소 모듈이 Apache2 패키지와 함께 설치되므로 체크를 하고, 시간대는 적절하게 선택합니다. 대한민국 사용자들을 대상으로 하는 경우 GMT +09:00 Korea Standard Time, Japan Standard Time 항목을 선택하고 다음 버튼을 클릭합니다.



56. 관리자에 대한 기본적인 정보를 입력합니다. 메일 주소, XE 계정 접속 시 사용할 비밀 번호, 내부 아이디, 닉네임을 빠짐없이 적절하게 모두 입력한 다음 완료 버튼을 클릭합니다.



57. 아래와 같이 Welcome 페이지가 나타나면 설치가 끝난 것입니다. 왼쪽 메뉴들 중 관리 메뉴를 클릭하여 관리자 페이지로 이동합니다. 이 과정에서 다소 시간이 걸릴 수 있습니다.



58. 관리자 페이지가 나타납니다. 설치 환경 수집 동의 팝업에 적절한 응답을 선택합니다.



59. 이제 사이트를 구성할 준비가 완료되었습니다.



60. Azure Virtual Machine 관리자 페이지로 되돌아와서 보면 가상 컴퓨터의 움직임이 그래프로 기록된 것을 볼 수 있습니다. 이제 이 그래프가 점점 활기차고 높게 그려질 것을 기대해도 되겠군요. 🙂



마무리하기


지난번에는 Windows Azure Web Site에서 XpressEngine을 설치하는 과정을 설명드렸습니다. 여기서는 MySQL의 클라우드 버전인 ClearDB의 서비스를 사용하는 것을 예로 들어드렸습니다. 이 방법을 사용하시면 동시 접속자 수가 많은 웹 사이트에서 최고의 확장성을 목표로 운영할 수 있습니다. 오늘 소개해드린 방법은 일반적인 서버 호스팅 환경에 익숙하신 분들께 더 친숙하고 유익한 방법이 될 수 있습니다. 늘 그렇지만, 비용과 목적에 알맞는 적절한 서비스 구성이 최적의 클라우드 서비스 선택이 될 것입니다.


감사합니다.

댓글 남기기