Windows 에서 Valet 으로 PHP 개발 환경 만들기

로컬 개발 환경 구성


PHP 개발 환경 구성은 일반적으로 LAMP(Linux, Apache, MySQL, PHP) stack 이라는 말로 표현하는 경우가 많습니다.


하지만 개발자의 로컬 개발 환경의 운영체제는 리눅스보다는 Windows 나 OS X 인 경우가 많으며 운영용 웹 서버는 nginx 도 많이 사용하며 로컬 개발용은 PHP 에 내장된 standalone 서버도 사용하므로 이제는 LAMP 가 정확한 표현은 아닙니다.


용어가 무엇이든 운영 체제에 PHP 를 설치하고 MySQL 과 웹 서버를 구성하는 것을 개발 환경의 대부분이라고 대부분이라고 생각하며 사실 이 부분이 제대로 안 되어 있으면 개발 진행 자체가 불가하므로 여기에 대부분의 시간을 쏟게 됩니다.

서비스 설정 문제

그러나 AMP 구성을 마쳤어도 사실 PHP 개발 환경 구성이 완료된 것은 아닙니다. 다양한 PHP 솔루션 기반으로 프로젝트를 진행할 수 있으며 각 솔루션마다 디플로이하려면 특징이 있습니다.


예로 워드프레스는 wp-config.php 나 wp-config-example.php 파일이 있어야 하며 소스의 root 폴더에 전체 소스가 있으므로 /var/www/wordpress/ 에 소스를 받았다면 이 폴더를 DocumentRoot 로 설정해야 합니다.

라라벨은 소스 root 의 public 만 노출하므로 /var/www/laravel 에 소스를 받았다면  /var/www/laravel/public 이 DocumentRoot 여야 합니다.

라라벨 기반의 CMS 인 statamic 은 public 대신 statamic 이라는 하위 폴더가 존재하며 이 폴더가 DocumentRoot 여야 합니다.


이렇게 다양한 PHP 솔루션의 디플로이를 웹 서버마다 설정하는 것은 매우 귀찮고 까다로운 작업입니다. 특히 개발자가 아닌 디자이너나 퍼블리셔도 협업을 위해 로컬 개발 환경을 구성해야 하는데  PHP 문법을 아는 것은 업무에 도움이 되지만 웹 서버 설정이나 MySQL 구성에 대한 지식은 쓸데없는 경우가 많습니다.

작업간 context 전환

보통 업무는 신규 개발 프로젝트와 유지 보수 프로젝트가 있으며 두 개의 특성을 가진 여러 프로젝트를 동시에 진행하는 경우가 많이 있습니다.

예로 신규 프로젝트인 New-service 프로젝트를 개발하다가 서비스중인 개발한 지 오래된 Legacy-Service 프로젝트에서 버그가 발견되서 시급하게 수정하고 패치를 해야 하는 경우입니다.


레거시는 다른 프레임워크와 기술로 개발된 경우가 많으므로 서비스하기 위해서는 별도의 설정이 필요할 수 있으며 로컬에 개발 환경이 잘 구성되어 있지 않았다면 프로젝트의 서비스를 구성하는데 꽤 시간을 들여야 합니다.


또 PHP 의 standalone 서버로 로컬에서 신규 프로젝트 테스트를 하고 있었다면 유지보수 프로젝트는 옵션을 주고 별도의 포트에 띄우거나 기존에 떠 있는 standalone 서버를 중지해야 합니다.


이런 불편함을 없애려면 웹 서버에 프로젝트마다 가상 호스트(예: new-service.dev, legacy-service.dev)를 구성하고 이를 hosts 파일에 등록하는 번거로운 절차를 거쳐야 합니다.


Laravel Valet 이란

라라벨은 homestead 라는 vagrant 기반의 제품을 통해 가상 머신에 Linux 를 설치하고 nginx, php, Mysql 을 구성하고 새로운 PHP 서비스가 있을 경우 serve 라는 명령어를 실행하면 가상 호스트에 자동 등록되도록 하여 로컬 개발 환경 구성의 편의를 획기적으로 높였습니다.


하지만 vagrant 는 가상 머신에 대한 이해가 필요하며 가끔 알수 없는 오류가 발생하지만 해결이 어려운 문제가 있었습니다. 


laravel valet 은 PHP 기반 프로젝트를 빠르게 로컬 개발 환경에서 서비스할수 있도록 하는 프로젝트입니다.

부팅과 동시에 nginx 를 구동하고 PHP 프로젝트 특성에 맞게 nginx 와 연결을 해주고 dnsmasq 를 설치하여 hosts 파일을 수정하지 않아도 모든 .dev 도메인을 로컬 개발 서버로 포워딩 되게 해주어 개발 환경의 편의성을 획기적으로 높였습니다.

Homestead 랑 달리 valet 은 PHP 와 MySQL 을 사전에 별도로 설치해 두어야 합니다.



즉 워드프레스, 라라벨, 드루팔등 유명한 PHP 제품에 맞게 서비스할 수 있도록 구성을 자동으로 해주고 또 커스텀 드라이버를 작성할 수도 있습니다.


OS X 에서 valet 을 사용한다면 개발자는 모든 PHP 서비스 개발 환경 구성을 발렛에 맡기고 개발에만 집중할 수가 있습니다.

출처: https://i.ytimg.com/vi/rvln9U9w8ZI/maxresdefault.jpg


Valet for Windows 는 valet 의 windows 포팅으로 nginx 와 php 서버를 Windows의 서비스에 등록하여 부팅시 자동으로 구동되며 Acrylic DNS 라는 제품을 사용(Dnsmasq 가 Windows 용 부재)하여 .dev 도메인 요청을 로컬 개발 환경으로 가도록  처리하고 있습니다.


사전 작업

  1. PHP 와 MySQL 이 설치되어 있어야 하며 PHP 설치는 RHEL/CentOS 와 Windows 및 Unix 에 php 설치#Window에설치 를 참고하고 PATH 에 등록하고  MySQL 은 https://dev.mysql.com/downloads/mysql/ 에서 다운 받습니다.

    PHP는 XAMPP 나 Autoset 등 패키지보다는 PHP 만 다운받아서 설치하는 것을 권장합니다.

  2. Composer 를 설치하고 PATH 에 걸려 있어야 합니다. 즉 임의이 폴더에서 cmd.exe 를 열고 composer 라고 쳤을 때 정상 실행되어야 합니다.  (PHP Composer 설치 및 사용법 참고)

  3. 80 포트를 사용하는 데몬(IIS, Apache, nginx 등)이 없어야 합니다.
  4. PHP FPM 이 사용하는 9000 포트가 비어 있어야 합니다

    실제로는 windows용 php-fpm 은 없고 명령행 php 를 9000 번 포트에 띄웁니다.

설치

  1. valet 패키지를 설치합니다.

    composer global require cretueusebiu/valet-windows
  2. valet 명령어가 설치된 경로를 PATH 에 추가해 줍니다.  보통 %APPDATA%\Roaming\Composer\vendor\bin 경로입니다

  3. 이제 Administrator 권한으로 cmd.exe 를 실행한 후에 다음 명령어로 valet 을 설치합니다.

    valet install

     만약 다음과 같은 에러가 난다면 ~/.valet/Log 폴더의 로그를 확인하고 조치하면 됩니다. 대개 일반 사용자로 cmd 를 띄워서 windows service 를 설치하지 못해서 발생합니다.

    Could not install the nginxservice service. Check ~/.valet/Log for errors.

  4. .dev 도메인으로 연결할 수 있도록 첫 번째 DNS 서버로 로컬 DNS 를 설정해 줍니다.

php 경로 설정

%USERPROFILE%\.valet\Services 에 php-fpm 설정 파일(phpfpmservice.xml) 이 있으므로 php 버전을 변경하려면 이 파일을 수정하면 됩니다.

<service>
  <id>valet_phpfpm</id>
  <name>valet_phpfpm</name>
  <description>Valet PHP-FPM</description>
  <executable>d:\devel\php\php-7.1.8-Win32-VC14-x64\php-cgi.exe</executable>
  <!-- 
  <executable>php-7.0.16-Win32-VC14-x64</executable>
  <executable>php-5.6.30-Win32-VC11-x64</executable>
  -->    
  <arguments>-b 127.0.0.1:9000</arguments>
  <logpath>C:\Users\lesstif/.valet\Log\</logpath>
  <logmode>reset</logmode>
  <onfailure action="restart"/>
</service>

설정을 마쳤으면 반영되도록 재구동해야 하며 administrator 권한으로 cmd.exe 를 실행해서 다음 명령어를 실행합니다.

valet restart

또는 시작 메뉴의 실행창에서 services.msc 를 입력한 후에 서비스 관리자에서 valet-phpfpm 을 재시작해주면 됩니다.

Valet 사용

OS X 용 발렛과 사용이 동일하므로 전체 기능은 valet 공식 문서를 참고하세요.


park

PHP 프로젝트들이 특정 폴더(예: c:\Users\lesstif\Sites) 밑에 모여 있다면 모든 하위 폴더가 자동으로 등록되면 편리할 것입니다.


즉 위와 같이 폴더가 구성되어 있을 경우 laravel-blog 는 public 하위 폴더가 root 이고 wordpress-site-a, b 는 폴더 자체가 루트입니다.


프로젝트가 모여있는 Site 폴더에서 park 명령을 사용하면 자동으로 현재 디렉터리의 하위 폴더를 프로젝트에 추가해 줍니다.

valet park

이제 하위 폴더의 이름.dev 로 브라우저에서 연결하면 되며 위의 경우 각 프로젝트의 도메인 주소는 lavalet-blog.dev, wordpress-site-a.dev, wordpress-site-b.dev 가 되므로 브라우저에서 이 주소로 연결하면 됩니다.

모든 폴더가 아닌 특정 폴더만 valet 에 등록해서 서비스하고 싶다면 link 명령을 사용하면 되며 park 와는 달리 해당 프로젝트 경로(예: laravel-blog) 로 들어가서 실행해야 합니다.

[C:\Users\lesstif\Sites\laravel-blog]valet link

A [laravel-blog] symbolic link has been created in [c:/users/lesstif/.valet/Sites/laravel-blog].


로컬 사이트 공유

ngrok 를 설치했다면 현재의 로컬 개발 사이트를 발렛을 통해 공유할 수 있습니다.

공유할 프로젝트 폴더(예: wordpress-site-a) 에 들어간 후에 다음 명령을 실행하면 됩니다.

valet share



기본 도메인 변경

기본 도메인은 .dev 이며 변경을 원할 경우 valet domain newdomain 명령으로 기본 도메인을 수정하면 되며 newdomain 은 새로 지정할 도메인(예: local) 을 적어주면 됩니다.

예로 다음 설정은 .dev 대신 .local 을 사용하는 예제이며 administrator 권한으로 실행해야 합니다.

valet domain local


현재 도메인을 확인하려면 valet domain 명령을 옵션없이 실행하면 됩니다.

valet domain


dev


문제 해결

APM 패키지와 충돌

xampp 등의 패키지는 apache httpd 서버를 80 포트에 설치하므로 valet 이 제대로 동작하지 않습니다. xampp 제어판에서 apache 를 중지한 후에 administrator 로 cmd.exe 를 실행해서 발렛을 재시작해야 합니다.

발렛 재시작
valet stop
valet start

service 구동 실패 로그 확인

제대로 동작하지 않았다면 시작메뉴 실행에서 services.msc 를 입력해서 서비스 관리자를 구동합니다.

서비스 목록에서 valet_phpfpm 을 찾은 후에 상단의 서비스 다시 시작 을 클릭합니다.

에러가 발생했다면 %USERPROFILE%\.valet\Log 내의 로그 파일을 열어서 에러 로그를 보고 조치를 취해야 합니다.

많이 발생하는 원인은 설정한 php 가 경로에 없거나, 필요 포트(80, 443, 9000)에 이미 프로세스가 뜬 경우등입니다.


ERR_ICANN_NAME_COLLISION 에러 발생

크롬에서 위와 같은 에러가 나는 건 .dev 가 구글이 보유한 top level domain 이기 때문입니다.

해결책은 두 가지로 DNS 서버를 127.0.0.1 로 변경하거나 또는 .dev 대신 .local 로 도메인을 변경하면 됩니다.


참고