PHP로 만든 단순한 CDN 서비스 모듈
트래픽 부하를 줄이기 위해 CloudFlare 를 사용하였는데 연결위치가 LAX(로스엔젤레스)라 속도가 많이 느려지는것을 확인하고 급하게 CDN 형태로 사용하고자 만들었습니다.
해당 서버는 도쿄(Vultr)에 위치해 있습니다.
원리는 kilho.net/{파일} 을 cdn.kilho.net/{파일} 로 연결하여 메인 호스팅의 트래픽을 분산합니다.
[PHP]
<?
$cfg[‘url’] = ‘kilho.net’;
$cfg[‘cache’] = ‘../data/cache’;
$url = $_SERVER[‘REQUEST_SCHEME’].’://’.$cfg[‘url’].$_SERVER[‘REQUEST_URI’];
$url_arr = parse_url($url);
switch($_SERVER[‘REQUEST_METHOD’])
{
case ‘GET’:
$filename = $cfg[‘cache’].$url_arr[‘path’];
$dirname = dirname($filename);
if(!is_file($filename))
{
if(!is_dir($dirname)) mkdir($dirname, 0707, true);
$ch = curl_init();
$fp = fopen($filename, ‘w’);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER[‘REQUEST_SCHEME’].’://’.$cfg[‘url’]);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
fclose($fp);
switch($code = curl_getinfo($ch, CURLINFO_HTTP_CODE))
{
case 200:
break;
default:
touch($filename, $code);
}
curl_close($ch);
}
if(is_file($filename))
{
$filetime = filemtime($filename);
if($filetime<1000)
{
header(‘HTTP/1.0 ‘.$filetime);
} else {
include ‘_mime.php’;
$filetype = get_mime($filename);
$lastmodified = filemtime($filename);
$etag = md5_file($filename);
header(‘Content-Type: ‘.$filetype);
header(‘Expires: ‘.gmdate(‘D, d M Y H:i:s’, time()+77760000).’ GMT’);
header(‘Cache-Control: public, max-age=77760000’);
header(‘Last-Modified: ‘.gmdate(‘D, d M Y H:i:s’, $lastmodified).’ GMT’);
header(‘Etag: ‘.$etag);
header(‘Access-Control-Allow-Origin: *’);
if(isset($_SERVER[‘HTTP_IF_MODIFIED_SINCE’]))
{
if($_SERVER[‘HTTP_IF_MODIFIED_SINCE’]==gmdate(‘D, d M Y H:i:s’, $lastmodified).’ GMT’||$_SERVER[‘HTTP_IF_NONE_MATCH’]==$etag)
{
header(‘HTTP/1.0 304 Not Modified’);
exit;
}
}
}
if(strstr($_SERVER[‘HTTP_ACCEPT_ENCODING’], ‘gzip’))
if(in_array($filetype, array(‘text/plain’, ‘text/html’, ‘text/css’, ‘text/javascript’, ‘application/json’, ‘application/xml’)))
ob_start(‘ob_gzhandler’);
$fp = fopen($filename, ‘rb’);
fpassthru($fp);
fclose ($fp);
exit;
}
break;
case ‘POST’:
case ‘PUT’:
case ‘DELETE’;
break;
}
header(‘HTTP/1.0 404 File Not Found.’);
?>
[/PHP]
Comment (1)
eeee