|

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

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

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

  • V3 오진 ㅠㅠ

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

  • php.ini 파일 설정

    서버 설치 후 확인 short_open_tag = On “<?php” 와 “<?” 를 사용 할 수 있도록 한다. display_errors = On PHP 스크립트 실행시 에러 발생시 해당 메세지를 출력한다. (off 인 경우에는 HTTP 500 내부 서버 오류 출력) date.timezone = Asia/Seoul 해당 타임존을 설정한다. error_reporting=E_ALL & ~E_NOTICE & ~E_DEPRECATED notice 에러는 무시한다. (* php.ini 경로 : php…

  • Delphi 10.2 Toyko Linux PAServer 설치 및 사용

    델파이가 10.2 으로 업데이트 되었습니다. CentOS7 에서 사용하기 위해 처음 설치방법입니다. [php] # yum -y update # yum install -y firewalld # systemctl unmask firewalld # systemctl enable firewalld # systemctl start firewalld # firewall-cmd –permanent –add-port=64211/tcp # firewall-cmd –reload # yum group install "Development Tools" # yum install wget curl-devel # wget https://down.kilho.net/data/LinuxPAServer19.0.tar.gz #…

  • |

    SSHScript – 리눅스(웹호스팅)백업을 편하게

    사용방법 프로그램을 실행시킵니다. File 버튼을 클릭 후, 아래와 같이 작업내용을 작성 후 저장합니다. (여러 계정인 경우 반복해서 작성하시면 됩니다.) [php] # 백업 파일을 만들기 위해 계정에 접속합니다. ssh://{아이디}:{패스워드}@{아이피}:{포트} # 백업할 파일이 있는 위치로 이동합니다. cd {경로} # 파일을 묶고 압축합니다. {date} 를 입력하시면 날짜가 입력됩니다. tar cvfz {아이디}.{date}.tar.gz . # 데이터를 백업받습니다. mysqldump -u{아이디} -p{패스워드}…

  • 웹해킹, 백도어 위험코드 감지 플러그인

    서버 해킹을 위해 몰래 설치된 백도어(PHP) 를 쉽게 찾고자 만든 플러그인입니다. PHP 에서 악용할 수 있는 함수가 사용된 파일을 찾아 메일로 알려줍니다.   워드프레스, 그누보드5 에서 쉽게 설치해서 사용하실 수 있습니다.   처음 활성화시 전체적으로 검사를 하며, 매시간마다 의심가는 파일이 발견되는 경우 관리자 메일로 알려드립니다.   사용방법 해당 솔루션에 맞는 플러그인을 다운받습니다. 아래와 같은 폴더에…

One Comment

답글 남기기

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