0. 세줄요약

로컬 환경 안에서 꼬마 웹서버를 하나 띄울겁니다.
그 서버는 공유폴더 기능을 이용해서 로컬에 존재하는 소스를 그대로 사용할 겁니다.
그 서버는 비록 CLI지만 포트포워딩을 이용해서 그 웹서버가 띄우는 웹사이트 실행결과를 로컬에서 볼수있게 됩니다.

전체 과정에 대략 3시간 ~ 1일 걸립니다.

1. 파일 구하기

1.1. 버추얼박스

공식사이트에서 최신본 쓰면 된다.

1.2. CentOS 7 ISO

DVD 버전 쓰면 된다.

더 이상의 자세한 설명은 생략한다.

2. CentOS 설치

2.1. 가상머신 만들어 시작

  1. 버추얼박스에서 "새로 만들기"
  2. 이름에 CentOS를 입력하면 Redhat 리눅스 타입을 잡아준다.
  3. x86이냐 x64는... x64 컴퓨터에서 64-bit 선택했지만 별문제 없었음
  4. 나머지는 아무 생각 없이 다음 다음 다음
  5. 실행

★ 버추얼박스를 오늘첨써보는 당신을 위한 1분 입문강좌

  • 이제부터 버추얼박스를 설치해 쓰는 컴퓨터를 '호스트', 버추얼박스 안의 가상컴퓨터를 '게스트'라고 합니다.
  • 실행되는 VM 창 내부를 클릭하면 모든 입력이 VM에 물립니다.
    결과 마우스/키보드가 VM 밖으로 빠져나오지 못하게 되는데 이거 빠져나오는 기본값 키는 F9입니다. (그 VM 창 우하단에 써있으니 까먹을 걱정 없음)
  • 창을 닫을 때 "현재 시스템 상태 저장하기" 옵션이 보일 텐데 이거 쓰지 마세요. 다른 건 아니고 reboot 실행시 깡통됨

2.2. CentOS 설치

  1. 최초 실행시 부팅디스크를 넣으라고 하는데 이때 미리 구해놓은 CentOS ISO 디스크를 꼽는다.
  2. 마우스가 안 먹어서 당황할 수 있지만 침착하게 키보드와 tab 키를 활용한다
  3. 최소사양으로 설치
  4. root 비밀번호는 설정해 줍시다. 이거 까먹지 말기
  5. OS 설치 과정은 대충 20분 정도 걸리니까 딴 일 하고 있을것...

3. 설치 직후 할 일들

기본값은 부팅시 항상 root로 로그인. 이거 귀찮을시 자동로그인 같은 건 알아서 하셈 그 설명은 이 문서의 범위를 벗어난다.
미리 말해두지만 이하의 명령은 모두 sudo를 생략한 것. (root 로그인이 기본이니까요)

★ 리눅스를 오늘첨써보는 당신을 위한 3분 입문강좌

  • 루트로 시작하면 당신은 /root라는 경로에 위치하게 됩니다.
  • cd /어쩌구를 치면 어쩌구라는 절대경로로 이동합니다. cd /는 기본디스크 최상위로 이동
  • ls -la를 치면 지금 내가 들어와 있는 디렉토리의 모든 것을 보여줍니다.
  • vi 어쩌구를 치면 지금 내가 들어와 있는 디렉토리의 어쩌구 파일을 편집할 수 있습니다.
    • vi 어쩌구를 쳐서 뭔가를 수정한 다음 저장하고 싶다면 ESC를 눌러 편집을 그만하고 :wq를 입력.
    • vi 어쩌구를 쳤는데 앗! 아무것도 저장하고 싶지 않다면 ESC를 눌러놓은 뒤 :q를 입력.
  • 스크롤은 Shift + PageUp / PageDown, 뭔가 명령을 실행했는데 그걸 중간에 그만두고 싶으면 Ctrl + C
  • rm -rf 어쩌구는 강제 완전삭제 명령이므로 어떤 경우에도 치지 말것
  • 옛날에 쳤던 명령을 찾아보려면 방향키 위아래를 눌러보기

나머지는 하면서 배우세요!! 중간에 실패하면 재시도해 보고 정 망했다 싶으면 지금 VM 날린 다음 CentOS 설치부터 새로 하면 됨.

3.1. 네트워크 잡아주기

리눅스는 네트워크 어댑터를 기본 비활성화합니다. 그래서 이걸 해줘야함.
VM 기본 네트워크 어댑터가 NAT로 잡혀 있다는 전제 하에 설명

  1. ping 8.8.8.8
    • Network Unreachable이 뜬다면 다음 단계로
    • 아니면 네트워크가 잡혔으므로 끝.
  2. vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
    • 아니면 ifcfg-eth0 이나 기타 뭔가 유의미한 설정값파일
  3. ONBOOT=no 라인을 ONBOOT=yes 로 변경
  4. reboot
  5. 재부팅되면 1로 돌아가서 다시

3.2. yum 관련 약간 작업

대충 10분 정도 걸리니까 담배라도 피우고 오자.

  1. yum update
  2. yum install unzip

3.3. EPEL 저장소 추가

Extra Packages for Enterprise Linux

  1. rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

4. 언어 및 패키지 깔기

여기서는 이 소스가 Mix를 활용하는 라라벨(Laravel) 소스라고 가정합니다. 그러므로 언어는 nodephp를 설치할 것.
mysql은 생략합니다.

4.1. NGINX

  1. yum install nginx
  2. nginx -v
    • 버전 정보가 뜨면 성공.

4.2. Node.js 그리고 npm

  1. yum install nodejs npm
  2. node -v && npm -v
    • 버전 숫자가 두 개 나와야 한다. 안 나오면 1부터 다시

4.3. 라라벨 요구사항 설치

4.3.1. PHP 7.1 및 그 확장들

Remi란 사람이 만든 저장소를 추가한 다음, 설치 환경 설정을 PHP 7.1에 맞게 고치고, 필요한 패키지를 쫙 내려받는 방식.

  1. rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
  2. yum install yum-utils
  3. yum-config-manger --enable remi-php71
  4. yum install php php-fpm php-common php-xml php-mbstring php-json php-zip
  5. php -v
    • 버전이 제대로 나오지 않으면 1부터 다시

4.3.2. Composer

바이너리를 그대로 내려받아 바이너리 폴더에 꽂아넣고 적당한 권한을 줘서 쓸 수 있게 해주는 방식.
컴포저가 뭐냐는 질문은 사절한다.

  1. 어딘가 조용한 곳(/root 등)으로 이동한다 (optional)
  2. curl -sS https://getcomposer.org/installer | php
  3. mv composer.phar /usr/local/bin/composer
  4. chmod +x /usr/local/bin/composer
  5. composer -V
    • 버전이 제대로 나오지 않으면 2부터 다시

5. 소스 가져오기: 공유폴더 기능으로

5.1. 공유폴더 기능을 켜보자

공유폴더 기능을 가상 CD로 설치하고 재부팅하는 과정이다.
옛날에 인터넷을 쓰기 위해 설치 CD를 집어넣어 브라우저를 설치하던 시절 기억나십니까? 그것과 매우 흡사한 짓거리입니다.

  1. 지금 켜놓은 버추얼박스 창의 메뉴에서 '장치' → '게스트 확장 CD 이미지 삽입'
    • 갑자기 창 상단에 보기 싫은 알림이 뜰건데 일단 과감하게 무시한다
  2. yum install perl gcc dkms kernel-devel kernel-headers make bzip2
  3. mkdir /media/cdrom
  4. mount /dev/cdrom /media/cdrom
  5. sh /media/cdrom/VBoxLinuxAdditions.run 아니면 sh /media/cdrom/autorun.run
    • 이 설치 과정은 5분 정도 걸리니까 화장실이라도 갔다올것
  6. 일단 리부트하지 말고 아래 5.2.로 진행한다.

5.2. 호스트의 소스폴더를 게스트의 임의 폴더에 공유받아보자

  1. 호스트 컴퓨터 (내 로컬컴퓨터) 어딘가에서 git clone 저장소
    • 딱히 깃 저장소 클론받지 않더라도, 게스트와 공유할 폴더의 내용만 있으면 됨.
  2. 지금 켜놓은 버추얼박스 창의 메뉴에서 '장치' → '공유 폴더' → '공유 폴더 설정'
  3. 오른쪽 가장자리의 폴더+ 아이콘 클릭하여 공유 폴더 추가
    • 폴더 경로: 아까 클론받은 소스 위치
    • 폴더 이름: 잘 모르겠으면 저장소폴더명 그대로 쓸것
    • 읽기 전용: 절대 체크하지 말것
    • 자동 마운트: 안함
    • 마운트 포인트: 안함
    • 항상 사용하기: 함
  4. mkdir /전용폴더
  5. mount -t vboxsf 저장소폴더명 /전용폴더/
  6. ls /전용폴더
    • 아무것도 없으면 → 실패이므로 → 1부터 다시 점검
    • 어디서 많이 보던 파일들이 여기도 보이면 → 성공이므로 → 만세 삼창
  7. 이제 자동마운트로 설정 바꿀 수 있습니다. 3번으로 돌아가서 이미 등록한 공유폴더 설정을 더블클릭해 다음과 같이 수정하고 저장하세요.
    • 자동 마운트: 함

6. 소스를 설치

cd /전용폴더를 실행한 다음 아래를 따라할 것.

6.1. 소스 의존성 설치

  1. composer update
    • 처음 1~2분 정도가 조용할 수 있는데 이는 정상이다. composer update -vvv를 쓰면 전체 절차를 볼수있음.
  2. npm install --save
    • 쓸데없이 오래 걸리는데 인내심을 갖고 지켜보도록 한다.
    • (혹시라도) 윈도 호스트에서 이 명령을 한번 써봤을 경우에는 CentOS 쪽에서 컴파일 에러가 나게 된다. 이때는 rm -rf node_modules로 과감하게 다 지우고 다시 시도한다.
    • text file is busy 어쩌고 하는 에러가 뜰 수 있는데 이건 무시해도 됨.
  3. npm run dev
    • cross-env 관련 에러가 터지면 npm install cross-env --save
    • 몬가 알수없는 에러가 터지면 호스트 컴퓨터에서 시도해 본다.

7. 웹서버 설정

7.1. 호스트-게스트 80 포트 공유

이건 왜 하느냐면... CLI로 되어있는 현재 VM에서 사이트를 볼 방법이 없기 때문입니다.
우리는 결과적으로 호스트 컴퓨터에서 http://localhost:5600으로 접속하여 해당 사이트를 열어볼 것임.

  1. 지금 켜놓은 버추얼박스 창의 메뉴에서 '머신' → '설정'
  2. '네트워크' → '어댑터 1' → '고급' → '포트 포워딩'
  3. 우측 가장자리 + 아이콘 눌러 포워딩 설정
    • 이름: HTTP
    • 프로토콜: TCP
    • 호스트 IP, 게스트 IP: 내버려둘 것
    • 호스트 포트: 5600
    • 게스트 포트: 80
  4. 저장
    • 별도 재시작은 필요없음

7.2. 웹서버 띄우기

SELinux 기능을 끄고, 방화벽의 80번 포트를 열어 외부에 공개한 다음, nginx를 실행한다.
SELinux 기능을 안끄고 이걸 하는 방법이 있는지는 확인을 해봐야함.

  1. setenforce 0
  2. firewall-cmd --permanent --add-port=80/tcp
  3. firewall-cmd --reload
  4. systemctl start nginx

여기까지 순서대로 한 다음 호스트 컴퓨터에서 아무 브라우저나 열어 http://localhost:5600을 열면 기본 웹페이지가 뜹니다.
자 그럼 이제부터는 그 웹페이지 대신 /전용폴더/public/index.php를 띄우도록 해볼까요?

7.3. 웹서버 설정

7.3.1. 사용자 그룹 설정

/전용폴더/public/index.php를 NGINX와 PHP-FPM(그리고 이 작업을 돌리는 root)이 쓰기 가능해야 한다.
그런데 이 폴더는 vboxsf라는 그룹이 소유하고 있다.
어떡하지? 별거없다. 그냥 nginxrootvboxsf 그룹에 넣어주면 된다.

  1. namei -o /전용폴더/public/index.php
    • 그룹 자리에 vboxsf가 나오는지 확인한다.
  2. usermod -aG vboxsf root
  3. usermod -aG vboxsf nginx
  4. reboot

7.3.2. NGINX 및 PHP-FPM 환경설정 수정

★ 웹서버를 띄워본 적이 없는 당신을 위한 1분 서버강좌

NGINX만 띄운 상태에서 index.php를 요청하면, index.php가 다운로드됩니다!!!
우리가 원하는 것은 index.phpPHP에 실행되는 것이겠지요?
그 실행을 php-fpm이라는 애가 해줍니다.
php-fpm은 상시 켜져 있는 프로세스입니다. 전형적으로 127.0.0.1:9000이라는 내부 네트워크에 들어오는 요청을 처리해 줍니다.
이 프로세스에게 "야!! 어디어디 있는 이 PHP 파일 실행해서 반환해!!!"라고 명령해야 합니다.
그 명령을 하는 요령을 NGINX에게 가르쳐야 하는 거고요.

  1. vi /etc/nginx/nginx.conf 수정

    • 80번 포트를 듣고 있을 서버를 하나 설정한다.

    • 그 서버의 웹루트는 /전용폴더/public이다.

    • 무슨 요청이 들어오든 전부 그 웹루트의 index.php에게 넘긴다.

    • .php로 끝나는 요청이 들어오면 그 응답 책임은 127.0.0.1:9000(을 열고 기다리고 있는 php-fpm.sock)에게 떠넘긴다.

    • 결과적으로 이것비슷할것임

      server {
        listen          80 default_server;
        listen          [::]:80 default_server;
        server_name     clink-ico-admin;
        root            /전용폴더/public
        index           index.php index.html index.htm;
      
        location / {
            try_files $uri $uri/ /index.php?$query_string
        }
      
        location ~ \.php$ {
            try_files       $uri =404;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME     /전용폴더/public$fastcgi_script_name;
            include         fastcgi_params;
        }
      }
  2. nginx -s reload

  3. mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/nginx.conf

  4. vi /etc/php-fpm.d/nginx.conf

    • [www][nginx]
    • user = apacheuser = nginx
    • group = apachegroup = vboxsf
    • ;listen.owner = nginxlisten.owner = nginx
    • ;listen.group = nginxlisten.group = vboxsf
    • ;listen.mode = 0660listen.mode = 0660

8. 드디어 실행

  1. systemctl enable php-fpm
  2. systemctl start php-fpm
  3. systemctl restart nginx

여기까지 하고 나서 호스트 컴퓨터 브라우저로 http://localhost:5600에 접속하면 우리가 기대하는 바로 그 라라벨 웹사이트가 뜬다.

휴.. 사흘을 버려서 이 치트시트를 만들었다..
내용 보강은 해주시면 감사합니다.