|

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]

Similar Posts

  • |

    그누보드 백업 예행 연습

    기존 사용중인 DB 를 euc-kr 에서 utf8 로 변환하기 위해, 백업을 정성스레(??) 받은 후 editplus 로 열었더니, 현재 인코딩에서 손실될 수 있는 문자가 포함되어 있다고 함, 일딴 무시하고 UTF8 로 바꾸고 Import …. 젠장 ㅠㅠ 깨진 글자들 때문에 안됨 급하게 검색~~~~ 결국 방법이 안보임.. (덤프 할 때 –default-character-set 까지 옵션 다 주고 해도 안되는 이런 경우는…

  • 윈도우클리너 3.0 베타 공개

    오랜만에 윈도우클리너를 업그레이드 하였습니다.   이전버전에 비해 속도가 대폭 향상 되었습니다. 시작프로그램, 브라우저 플러그인 관리를 보다 쉽게 할 수 있게 하였습니다. 시작프로그램 관리는 MSConfig 와 호환성이 있고, 복구도 완벽하게 됩니다. 리포트 화면은 사용자의 기본 브라우저에서 출력되게 하였습니다. 강제로 설치해야되는 서비스를 이용할 수 있는 프로그램들을 보다 손쉽게 삭제할 수 있도록 하였습니다. (인터넷 뱅킹 이용, 만화 등…

  • V3 오진 ㅠㅠ

    델파이7 에 EmbeddedWB, Memo, IdTCPServer 콤포넌트만 넣었을 뿐인데 V3 lite 에서 악성코드로 오진 ㅠㅠ 맨날 쓸때없는 오진이나 하고, 최근 해킹 사건 같은거나….. ㅉㅉ 취미로, 공개프로그램을 만들때 이딴것들 신경쓰는건 ㅠㅠ V3 삭제!

  • |

    K플레이어 0.9.0 배포

    유명한 동영상 플레이어들을 여러 개 사용해 왔습니다. 그런데 어느 순간부터 실행할 때마다 광고가 뜨기 시작했습니다. 광고 정도는 그냥 이해하고 넘어갔습니다. 하지만 최근, 아주 유명한 플레이어가 사용자의 동의 없이 몰래 악성 애드웨어를 설치하는 일을 직접 겪게 되었습니다. 그 순간 확신했습니다.“이건 아니다.” 그래서 만들었습니다.광고 없고, 애드웨어 없고, 군더더기 없는 동영상 플레이어 — KPlayer. KPlayer란? KPlayer는 고성능 미디어…

  • |

    한국에서 Stripe 사용하기

    Stripe 를 한국에서 사용할 수 없을까 고민하던 중 재미난(?) 방법이 떠올라 실행해 보았습니다.   호주에서는 주민등록번호 또는 사업자등록번호 같은 ID 입력 없이 Stripe 를 사용할 수 있습니다. Stripe 에서 입력할 정보는 현지 계좌번호, 전화번호, 주소가 필요합니다. Payoneer 에서 호주 계좌(AUD)를 발급받습니다. Skype 로 호주 전화번호를 생성합니다. (한국에서 불가능하기에 호주쪽 클라우드로 원격접속하여 생성) 호주 쪽 배송대행지에서…

One Comment

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다