HHVM과 PHP-FPM을 함께 사용하여 안정성 높이기

HHVM과 PHP-FPM을 함께 사용하여 안정성 높이기

HHVM과 PHP7을 서로 벤치마크한 자료를 보면 대개 php7이 더 나은 성능을 보여줍니다. 하지만 대부분의 php로 작성된 웹사이트는 php5 버전의 코드를 사용하고 있기에 php7으로 업데이트 하려면 신경 써야 할 것이 많이 있습니다. 이런 경우 php의 성능 향상을 위해서 hhvm을 많이 사용하는데 hhvm은 빠르긴 하지만 안정적이지는 않은 것 같습니다. 이를 보완하기 위해서 nginx에서 php-fpm을 fallback으로 설정하여 사용하고, ps-watcher를 이용하여 hhvm이 죽으면 다시 시작하는 방식으로 보완하면 안정적으로 서버를 운영할 수 있습니다.  이 자료는 웹서버로 nginx를 사용한 경우 적용 가능합니다.

 

원본 : https://bjornjohansen.no/hhvm-with-fallback-to-php

이 글은 원본 글에 대한 번역글입니다.

 

hhvm은 PHP기반의 웹사이트를 정말 빠르게 구동시켜줍니다. 대부분의 리포트에서 2배~4배 정도 빠르다고 말합니다. 불행하게도 hhvm은 매우 불안정적이고 갑자기 서비스가 멈추기도 합니다. 다행히 nginx를 사용하고 있다면 php-fpm을 fallback으로 설정하기가 매우 쉽습니다.

HHVM과 PHP-FPM설정하기

먼저 웹사이트가 php-fpm으로도 구동되도록 설정합니다. 그런 다음 이것을 hhvm으로 교체합니다. (아래 코드를 nignx의 설정 파일에 세팅합니다.)

PHP 설정 예

location ~ \.php$ {

try_files $uri =404;

fastcgi_split_path_info ^(.+\.php)(/.+)$;

include fastcgi_params;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param SERVER_NAME $host;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
}

 

HHVM 설정 예

location ~ \.(hh|php)$ {

try_files $uri =404;

fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_keep_conn on;

include fastcgi_params;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param SERVER_NAME $host;
 fastcgi_pass 127.0.0.1:9000;
}

 

위와 같은 설정에서는 php-fpm과 hhvm이 각각 구동됩니다. php-fpm은 유닉스소켓으로, hhvm은 9000번 포트로 작동되지요. 이제 이 두 서비스를 동시에 맞물려서 설정해봅시다.

hhvm 서비스가 멈추면 nginx 는 502 bad gateway 오류를 표시합니다. nginx에서 에러를 가로채서(intercept) hhvm이 죽으면 php-fpm으로 돌려주도록 하는겁니다.

코드 완성

location ~ \.(hh|php)$ {
 fastcgi_intercept_errors on;
 error_page 502 = @fallback;

try_files $uri =404;

fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_keep_conn on;

include fastcgi_params;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param SERVER_NAME $host;
 fastcgi_pass 127.0.0.1:9000;
}

location @fallback {

try_files $uri =404;

fastcgi_split_path_info ^(.+\.php)(/.+)$;

include fastcgi_params;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param SERVER_NAME $host;
 fastcgi_pass unix:/var/run/php5-fpm.sock;

}

 

제대로 작동하는지 테스트해봅니다. 아래 테스트한 주소는 여러분의 사이트에서 설정한 값으로 변경해서 테스트해보세요.

$ curl -I https://example.com

만약 헤더의 X-Powered-By 정보를 제거하지 않았다면 아래와 같이 나올겁니다.

X-Powered-By: HHVM/3.4.0

(hhvm의 버전은 설치한 버전에 따라 다르게 나오겠지요)

 

이제 hhvm을 멈추고 테스트 해봅니다.

$ service hhvm stop

위에서 테스트했던 curl 명령을 다시 시도한 후 헤더 정보를 확인해보면 아래처럼 php-fpm이 대신하고 있습니다.

X-Powered-By: PHP/5.5.9-1ubuntu4.5

 

HHVM을 자동으로 재시작하기

hhvm을 자동으로 재시작하게 하기 위해서 ps-watcher를 사용합니다. 아래와 같이 설치해주세요.

$ apt-get install ps-watcher

설치 후 ps-watcher의 설정 파일을 아래와 같이 변경해줍니다. 설정 파일이 없는 경우에 아래처럼 만들어줍니다. 수정하거나 만들 파일은 /etc/ps-watcher.conf 입니다.

[hhvm]

occurs = none

action = service hhvm restart

 

ps-watcher를 시작할 수 있도록 아래처럼 입력합니다.

$ sed -i -e 's/# startup=1/startup=1/g' /etc/default/ps-watcher

 

ps-watcher의 기본 설정은 매 5분마다 설정 파일에 기록된 내용을 확인하게 되어 있습니다.(우분투의 경우).

위에서 설정한대로 따라하면 정규식으로 ps 출력을 검사하여 service hhvm restart 라는 명령을 실행합니다.

ps-watcher를 시작합니다.

$ service ps-watcher start

 

이제 안정적으로 hhvm 서비스를 이용할 수 있습니다! ^^