웹사이트 성능 최적화 정리 (High Performance Web Sites)
Back-end = 5%, Front-end = 95% 정도 성능에 영향을 미침
1. HTTP Requests 를 최소화 한다.
- 사용자 응답시간의 80%는 프론트앤드단에서 발생한다.
많은 시간을 페이지의 컴포넌트(이미지, css, script, flash등)를 다운받는데 쓰인다는 얘기다.
위의 컴포넌트는 각각의 http request를 유발시켜서 페이지를 느리게 한다.
- Image Maps - 이미지 맵은 하나의 이미지로 여러장의 이미지 효과를 나타낸다.
또한 같은 사이즈를 가지고 많은량의 http request를 줄여준다.
- Css Request - 이미지맵처럼 필요한 이미지를 한장에 담고 css 스타일 적용으로 필요한 부분만 보이게 한다.
- Inline Images - data:URL scheme를 이용하여 페이지에 이미지 데이터를 삽입시킨다.
따라서 html 페이지의 사이즈는 엄청 커지는데 반해 요청은 줄게 된다.
- Comblined Files - 스타일시트, 스크립트 파일을 모두 통합하여 하나의 파일에 포함시켜 http request를 줄인다.
- CSS sprites
-> 종합 이미지에서 필요한 부분만 자르는 방식
예) <span style="background-image: url('sprites.gif'); background-position: -260px -90px;"> </span> (자바스크립트를 한줄로 빌드로 할 경우 용량이 줄어드는걸 이용하는 사이트도 늘고 있다) 예) data: URL scheme AAMAAwAAAQzcElZyryTEHyTUgknHd9xGV+qKsYirKkwDYiKDBiatt2H1KBLQRFIJAIKywRgmhwAIlEEADs="> 2. CDN(Content Delivery Network) 사용 - CDN 서비스라고 하면 사용자의 위치에 따라서 가장 가까운 서버에 접속해서 데이터를 가져오는 서비스를 말한다. 데이터를 가장 빠르게 받을수 있는 서버에서 데이터를 받는다면 당연히 페이지가 빨리 뜰것이다. 야후의 경우 약 20%정도의 성능향상이 있었다고 한다. - ISP의 네트워크 하단에 캐시서버(임시저장서버)를 설치/컨텐츠를 저장해 놓고 사용자 요청이 있을 때 미리 올려놓은 컨텐츠를 전달해주는 시스템 - 여러 네트워크 경로를 거치지 않아 빠름(병목현상 줄어듬) 예) amazon.com, aol.com, ebay.com, myspace.com 등에서 Akamai 를 이용함 하지만 expire header를 추가 한다면 이것들을 캐싱시킬수 있다. 만약 아파치서버를 사용중이라면 ExpireDefault값을 이용하여 지정을 해줄수 있다. <httpHandlers> <!--*압축할 파일 설정*--> <add verb="*" path="*.aspx" type="Gzip"/> <add verb="*" path="*.ashx" type="Gzip"/> using System.IO.Compression; public class Gzip : IHttpHandler #region IHttpHandler Members public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { string file = context.Server.MapPath(context.Request.FilePath.Replace(".ashx",""));//파일 경로 string filename = file.Substring(file.LastIndexOf('\\') + 1);//파일 이름 if (fileInfo.Length > 1024)//1K 용량 설정 그리고 위의 13가지의 항목의 우선순위를정해 가중치를 둬 우선순위가 높은 항목부터 우선 적용해서 효율적인 웹 서비스를 할 수 있도록 합시다.
[참고] Book: http://www.oreilly.com/catalog/9780596514211/
- 자바스크립트 파일과 CSS 파일을 한 두개로 병합한다
- image maps
- inline (data) images(IE 는 지원 하지 않는듯)
data:[<mediatype>][;base64],<data>
<IMG ALT=”Red Star” SRC="https://t1.daumcdn.net/cfile/tistory/2146463456E72FA806"MARGIN-LEFT: 40px">LMLAPN8ffBiYvWWlvrKy/FvcPewsO9VVfajo+w6O/zl5estLv/8/AAAAAAAAAAAAAAAACH5BAEAAAsALAAAA
- Expire header를 사용하면 그 날짜가 지나기 전에는 각 컴퍼넌트를 재 호출하지 않는다.
- gzip의 경우 약 70%의 압축률을 보여주며, 현재 90%의 인터넷 브라우저가 gzip을 지원한다. 다만 압축방식의 경우 image와 같은 이미 압축이 되어있는 파일을 대상으로 할경우에는 오히려 사이즈가 더 커지는 문제가 있으므로, script같은 text로 이루어져있는 컴포넌트 같은경우 매우 효율적일 수 있다.
- 국제표준 무료 압축 포맷이며 HTTP 통신에 이용할 수 있다.
- 텍스트 파일에 적용 가능 : HTML, JS, CSS (바이너리 안됨 - 예:이미지)
</httpHandlers>
using System.IO;
{
public Gzip() { }
string extension = file.Substring(file.LastIndexOf('.') + 1);//파일 확장자
//1순위 - Gzip
if (context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains("gzip"))
{
FileInfo fileInfo = new FileInfo(file);
{
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
context.Response.AddHeader("Content-Encoding", "gzip");
}
}//2순위 - Deflate
else if (context.Request.Headers["Accept-encoding"] != null && context.Request.Headers["Accept-encoding"].Contains("deflate"))
{
FileInfo fileInfo = new FileInfo(file);
if (fileInfo.Length > 1024)//1K 용량 설정
{
context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress, true);
context.Response.AddHeader("Content-encoding", "deflate");
}
}
//ContentType설정
if (extension == "aspx")
context.Response.ContentType = "text/html";
if (extension == "js")
context.Response.ContentType = "application/x-javascript";
if (extension == "css")
context.Response.ContentType = "text/css";
//화면 출력
context.Response.WriteFile(file);
}
#endregion
}
- 화면이 점진적으로 나타나도록 하려면 CSS 파일이 내용(html)보다 먼저 다운로드되어야 한다.
- 스크립트를 다운로드하는 동안에는 다른 파일 다운로드는 이루어지지 않는다.
- 매력적인 기술이지만 UI 이벤트가 필터링되지 않기 때문에 매우 민감하게 반복적으로 반응함
- 파일로 분리하여 캐쉬 기능을 이용할 수 있도록 한다.
- 도메인 이름을 최소화한다.
- js, css 파일을 압축 : 다른 리소스들(이미지와 같은)은 http connection이 모두 사용되어 다운로드를 하지만 유독 js만은 하나의 커넥션으로만 진행됨
: 압축 해주는 사이트 : http://alex.dojotoolkit.org/shrinksafe/
: java -jar custom_rhino.jar -c all.js > all_comp.js 2>&1
: 캐싱되는 문제점을 보완하기 위해서 <script src="script1.js?v=001"></script> 식으로 js src 지정자를 변형시킵니다.
- 브라우저가 서버에 요청을 한번 하면 서버는 브라우저에게 바뀐 주소로 다시 요청하게 한다.
그럼 해더에 있는 다른 주소로 브라우저가 다시 요청하게 된다.
- 클러스터링 환경에서 문제가 될 가능성이 다분
Rule 4: Gzip Components
Rule 9: Reduce DNS Lookups
Rule 10: Minify JavaScript
Rule 11: Avoid Redirects
Rule 13: Configure ETags 를 이용해서 Ajax 를 성능을 높일 수 있다.
Weight 11
3. Add an Expires Header
4. GZip Components
13. Configure ETags
Weight 10
2. Use a Content Delivery Network
5. Put CSS at the Top
10. Minify JavaScript
11. Avoid Redirects
Weight 5
9. Reduce DNS Lookups
6. Move Scripts to the Bottom
12. Remove Duplicate Scripts
Weight 4
1. Make Fewer Requests (CSS)
1. Make Fewer Requests (JS)
Weight 3
1. Make Fewer Requests (CSS background images)
Weight 2
7. Avoid CSS Expressions
Examples: http://stevesouders.com/examples/
Image maps: http://www.w3.org/TR/html401/struct/objects.html#h-13.6
CSS sprites: http://alistapart.com/articles/sprites
Inline images: http://tools.ietf.org/html/rfc2397
jsmin: http://crockford.com/javascript/jsmin
dojo compressor: http://dojotoolkit.org/docs/shrinksafe
HTTP status codes: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
IBM Page Detailer: http://alphaworks.ibm.com/tech/pagedetailer
Fasterfox: http://fasterfox.mozdev.org/
LiveHTTPHeaders: http://livehttpheaders.mozdev.org/
Firebug: http://getfirebug.com/
YUIBlog: http://yuiblog.com/blog/2006/11/28/performance-research-part-1/
http://yuiblog.com/blog/2007/01/04/performance-research-part-2/
http://yuiblog.com/blog/2007/03/01/performance-research-part-3/
http://yuiblog.com/blog/2007/04/11/performance-research-part-4/
YDN: http://developer.yahoo.net/blog/archives/2007/03/high_performanc.html
http://developer.yahoo.net/blog/archives/2007/04/rule_1_make_few.html
'Internet W3' 카테고리의 다른 글
[REST ①] RESTful 웹서비스에 대해 알아보자! (0) | 2015.07.21 |
---|---|
웹 사이트 최적화 기법 (0) | 2015.07.17 |
CERN, NCSA, W3C 개요 (0) | 2015.07.17 |
RPC, CORBA, DCOM, SOAP, REST 의 개요 (0) | 2015.07.17 |
URI, URL, URN 이란? (0) | 2015.07.17 |