DỰ ÁN 9GAG CLONE

I. Yêu cầu Phát triển 1 website với các chức năng như 9gag.com Nhanh, đơn giản, đẹp Đáp ứng số lượng lớn người truy cập đồng thời Có khả năng mở rộng, phân tán, phân tải Có khả năng mở rộng sang ứng dụng trên smartphone Đa ngôn ngữ SEO tốt Bảo mật cao Code trong sáng, comment đầy đủ

II. Định hướng Viết phần core riêng bằng NodeJS, phần giao diện riêng, giao tiếp qua API để đảm bảo có thể tái sử dụng khi chuyển qua smartphone Phần giao diện sử dụng PHP, mô hình MVC, framework tự tạo Database MySQL Sử dụng Redis như 1 database phụ Sử dụng nhiều webserver để tối ưu cho từng nhiệm vụ
Các webserver sử dụng các tên miền khác nhau, như thế sẽ dễ dàng cho việc phân tải, tách server…

-

Sử dụng Sphinx cho tìm kiếm
NodeJS đang là công nghệ rất hot hiện nay. Từ lúc ra đời (2009) đến lúc hot node.js chỉ mất khoảng vài tháng. Điều này có lẽ chỉ có thể giải thích bằng lí do là viết cả client side và lẫn server side của cùng một trang web chỉ bằng một ngôn ngữ là ước mơ tối cao của giới làm web.

http://cntt.tv/nodes/show/575
 Nginx (phát âm "engine x") là một chương trình server HTTP, một reverse proxy cũng như IMAP/POP3 proxy server miễn phí, mã nguồn mở, có hiệu năng cao. Nginx được tác giả Igor Sysoev viết cho rambler.ru , trang web được truy cập nhiều thứ 2 trên nước Nga, đã chạy ổn định trong vòng hơn hai năm rưỡi.

http://cachcaidat.com/2011/05/tin-t%E1%BB%A9c-nginx-1-0-0-ram%E1%BA%AFt-sau-9-nam-phat-tri%E1%BB%83n/
Nghiêm Tiến Viễn – boygiandi!

Page 1

load balancing.com/wiki/G-WAN_vs_Nginx http://loadstorm.szone. Supporting tens of thousands of connections is clearly realistic with todays hardware. Varnish cũng là một phần mềm nguồn mở. and proxying for TCP and HTTP-based applications.tv/nodes/show/536  Redis có thể coi là 1 nosql database (hay key-value store) chạy trên RAM. Varnish và Nginx và GWan cái nào tốt hơn thì sẽ cài cả 3 rồi thử nghiệm.go. giúp Sphinx mở rộng thị trường ra rất nhiều. http://haproxy. while still offering the possibility not to expose fragile web servers to the Net. ta sẽ tách các request file tĩnh (ảnh. do đó để đảm bảo hiệu năng hệ thống.eu/  G-Wan là 1 webserver viết bằng C được quảng cáo là nhanh vượt trội so với tất cả các loại khác.com đã sử dụng thành công Sphinx. http://blogs.9-rc2 trở đi Sphinx hỗ trợ thêm XML. http://www.vn/viewpost/43314915/144896/redis-giai-quyet-mot-so-van-dethuong-gap-khi-lap-trinh-web-part-1-.) đi 1 đường và request PHP đi 1 đường. chuyển các request PHP cho Apache. Nó thường được sử dụng để chứa các dữ liệu có tần suất truy cập cao hoặc dữ liệu thường xuyên biến đổi. http://forum. với các request tĩnh thì dùng Nginx hoặc Varnish hoặc GWan Apache kết hợp với PHP tốt hơn còn Nginx thì xử lý file tĩnh tốt hơn.vn/threads/1357-Tim-hieu-nhung-cong-nghe-su-dung-trenFacebook?s=8f9aad5ce8b9842db575f166044e7838  HAProxy is a free. Its mode of operation makes its integration into existing architectures very easy and riskless. Facebook sử dụng Varnish để xử lý ảnh thông thường và các ảnh trong profile người dùng. Tương tự các phần mềm khác được Facebook sử dụng.. Một số trang web lớn của Việt Nam như RồngBay.wikivs.1wt.com/2011/web-server-performance-benchmarks - - - - Người dùng website chủ yếu là xem ảnh. http://cntt. css. It is particularly suited for web sites crawling under very high loads while needing persistence or Layer7 processing. NodeJS là 1 Server-side scripting ( như PHP ) có giao diện ngôn ngữ (syntax) là JavaScript do đó cực kỳ quen thuộc đối với người Page 2 Nghiêm Tiến Viễn – boygiandi! . Nó có thể xử lý hàng tỉ requests (yêu cầu) trong một ngày. Cái này còn ít người sử dụng nên mình thử luôn. js. Trước đây Sphinx chỉ hỗ trợ SQL DB như MySQL và PostgreSQL. Sphinx là search engine tốc độ cao có tiếng hiện nay. Các website có lượng người sử dụng lớn thường ứng dụng Redis để đảm bảo tốc độ đọc dữ liệu.htm  Varnish là trình tăng tốc HTTP hoạt động như một load balancer (bộ phân tải) và hệ thống cache nội dung giúp tốc độ tải trang là nhanh nhất.9. từ phiên bản 0. Dùng HAProxy đứng trước (cổng 80) làm reverse proxy và để cân bằng tải sau này. very fast and reliable solution offering high availability.

đủ số lượng sẽ tự động tạo thư mục tiếp theo (upload/0/1/ ) Thư mục upload/0/ chứa tối đa 1024 thư mục con từ 0-1023. Thư mục chứa ảnh được chia làm 3 cấp. Thư mục upload/0/0/ sẽ chứa 1024 file.jpg .count . Nếu không có 2 cái này có thể dùng Full text search sẵn có của MySQL nhưng chất lượng không bằng.- - - - phát triển web.Kiểm tra đầu vào . Imagick dùng cho xử lý ảnh bao gồm resize. Thư mục upload/ sẽ chứa 1024 thư mục con từ 0-1023. Như vậy sẽ chứa được tối đa 1024 * 1024 * 1024 = 230 file. rất dễ phát triển và đặc biệt là tốc độ nhanh hơn PHP. start+count) rồi dùng MySQL để đọc nội dung bài viết. crop. Chúng ta sẽ dùng Redis để lấy id bài viết trong khoảng (start. tốc độ thực hiện truy vấn này sẽ rất chậm khi start lớn và table lớn. Phần core đảm nhiệm việc kết nối và xử lý truy vấn tới database mysql. Các lỗi bảo mật thường gặp Hướng tấn công Cách phòng tránh SQL Injection XSS Upload Script Nghiêm Tiến Viễn – boygiandi! . Sở dĩ như vậy là bởi hàm liệt kê bài viết của chúng ta cần lấy trong 1 khoảng thì câu lệnh truy vấn MySQL sẽ ~ SELECT * FROM `post` LIMIT start. Giả sử mỗi ngày người dùng upload 1024 ảnh thì sẽ mất 2.873 năm để dùng lấp đầy các thư mục này  Hàm lưu ảnh vào ổ cứng cần được thiết kế dự phòng cho trường hợp sau này tách server chứa ảnh thành 1 server riêng.Kiểm tra đầu vào . Search có thể dùng Solr hoặc Sphinx.Kiểm tra file upload lên đúng là file ảnh thì mới thông qua Page 3 . VD : upload/0/0/file. nhưng mình viết Python không quen bằng NodeJS. Do đó mình sẽ dùng NodeJS để viết phần core. Phần core và phần giao diện PHP sẽ giao tiếp với nhau qua HTTP API. Redis làm việc này tốt hơn nhiều. Solr mình đã dùng qua nên lần này thử dùng Sphinx. gắn watermark… File ảnh lưu trên ổ cứng.Sử dụng MySQL Procedure . 1 ứng viên khác có thể đảm nhận vị trí này là Python. phần giao diện muốn tương tác với database phải gọi qua API. Redis sẽ được dùng để lưu danh sách id các bài viết.

aspx III. Dự kiến các công nghệ sử dụng Apache PHP MySQL Varnish Imagick Nginx G-Wan HAProxy Sphinx NodeJS Redis Mô hình mạng Webserver Cache file ảnh người dùng Xử lý ảnh Webserver for static file Webserver for static file Proxy cân bằng tải Search Viết webservice Dùng như 1 database phụ Nghiêm Tiến Viễn – boygiandi! Page 4 .vn/post/2011/10/03/Bao-mat-web-server-Apache-voi-modSecurity-Phan-3.http://khanh.com.

d/httpd start Nghiêm Tiến Viễn – boygiandi! Page 5 . Cài đặt môi trường 1. Cài đặt Apache yum install httpd httpd-devel /etc/init.IV. Cài đặt các phần mềm cơ bản yum install make pcre-devel libtool gcc gcc-c++ screen glibc glibc-devel libgcc sqlite sqlite-devel 2.

d/mysqld start mysql 5.vcl ) Nghiêm Tiến Viễn – boygiandi! Page 6 ./nginx-1.tar.d/httpd restart 4.2.2 .org/download/nginx-1.2.0./varnish-3./configure make make install 7.varnish-cache.tar.org/source/varnish-3./varnish cd .gz tar -vxzf .0.0. Cài đặt MySQL yum install mysql mysql-server mysql-devel /etc/init.12.12 .tar./nginx .tar./varnish make make install Config varnish ( varnish./nginx-1.0.d/httpd restart 6.0.gz mv ./varnish-3.gz mv . restart 3. Cài đặt PHP yum install php php-mysql php-common php-gd php-mbstring phpmcrypt php-devel php-xml /etc/init./nginx cd .12. Cài đặt Imagick yum install ImageMagick* yum install php-pear pecl install imagick /etc/init. Cài đặt Varnish wget http://repo.gz tar -vxzf .0.Config apache chạy ở cổng 81. Cài đặt Nginx wget http://nginx.

if (req.net". } return (lookup).status != 200 ) { set beresp. .port = "81".between_bytes_timeout = 600s.".".cookie.http. } } sub vcl_fetch { if ( beresp.http. . } return (lookup).connect_timeout = 600s.url ~ "\. } sub vcl_hit { if (req.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") { unset req. . } acl purge { "localhost". } } sub vcl_miss { if (req.". purge. . Nghiêm Tiến Viễn – boygiandi! Page 7 . return (lookup).request == "PURGE") { purge.host = "cdn1.xxx.max_connections = 800. error 200 "Purged xxxxxxxxxxxx.request == "PURGE") { set obj.backend apache { . } else { return (pipe). .". } # Cache things with these extensions js|css| if (req. } else { error 405 "Not allowed.(js|css)$") { return (pass).host ~ "cdn1.net") { set req. } else if (req. } } sub vcl_recv { if (req. set req.ttl = 0s.host = "localhost". error 200 "Purged yyyyy.xxx.http.url ~ "\.ttl = 0s.first_byte_timeout = 600s.ip ~ purge) { error 405 "Not allowed.backend = apache.request == "PURGE") { if (!client.

0.3-release.gz mv ./node-v0.10 .http.public".com/files/sphinx-2.tar. } } Start varnish. } } sub vcl_deliver { if (resp.gz tar -vxzf .magicmarker = "1".10.http.10/node-v0.http.6./nodejs npm install express Nghiêm Tiến Viễn – boygiandi! Page 8 .url ~ "\.Cache-Control = "max-age = 2678406. chạy cổng 82. set resp.10./sphinx cd .(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$") { set beresp.6.Age = "0"./nodejs cd . unset resp.http.} if (req.http. set resp.gz tar -vxzf .6. Cài đặt Sphinx wget http://sphinxsearch./sphinx-2.magicmarker) { unset resp.magicmarker.vcl -s file. 16 Feb 2013 12:24:25 GMT".3-release.3-release .tar.Expires = "Thu./var/cache/varnish.tar.6. 2G RAM varnishd -a :82 -T localhost:6082 -f /var/www/config/varnish. Cài đặt NodeJS wget http://nodejs./sphinx-2./sphinx .http.cache.http./nodejs .tar.0.org/dist/v0.2G 8./configure make make install Cài module cd ./configure --prefix=/usr/local/sphinx make make install 9.0./node-v0.Cache-Control.gz mv . set resp.

/redis cd . phụ thuộc thời Page 9 Nghiêm Tiến Viễn – boygiandi! .com/files/redis-2.bz2 cd gwan sudo . Điểm số phải phụ thuộc vào lượng like. Như vậy cần xây dựng 1 hàm tính điểm cho từng bài. Cài đặt HA Proxy http://linuxadminzone./redis make screen –S redis src/redis-server Ctrl+A Ctrl+D src/redis-cli config set maxmemory 524288000 quit 11.bz2 tar -xjf gwan_linux64-bit.7.gz mv .gz tar xzf redis-2. comment./gwan 12.Tính độ hot Ở trang chủ website có 1 tab là Hot topic.tar.com/kurokikaze/limestone 10.googlecode.tar. Cài đặt Redis wget http://redis.tar./redis-2.7 . Cài đặt gwan wget http://gwan.4. Phát triển phần mềm .com/archives/gwan_linux64-bit.7.4. bài nào điểm cao thì ở trên (hot hơn). vậy cần 1 hàm để đánh giá thế nào là 1 hot topic.npm npm npm npm npm npm install install install install install install db-mysql generic-pool mysql-libmysqlclient hiredis redis winston express-request-logger Một số module phải cài bằng tay https://github.4.com/how-to-install-setup-and-config-haproxy-loadbalancerfor-content-switching/ V.tar.

- gian để nó có thể trôi đi được (tránh trường hợp 1 bài là hot thì nó cứ hot mãi) công thức : (like+comment)/time^alpha Cần viết 1 chương trình. lấy 1000 bài mới nhất từ redis ra tính độ hot. Tối ưu : Công cụ tối ưu hiệu quả nhất cho PHP là XDebug. Tuy nhiên Xdebug cũng làm PHP xử lý chậm đi.auto_trace=On xdebug. Với xdebug ta có thể biết được từng câu lệnh 1 chiếm bao nhiêu thời gian. Cài đặt: http://xdebug.profiler_enable=On xdebug. 15 phút chạy 1 lần. Cập nhật lại vào redis.trace_output_name= trace.%R File log sẽ được lưu vào /tmp . bạn dùng phần mềm WinCacheGrind để đọc file này Nghiêm Tiến Viễn – boygiandi! Page 10 . từ đó tối ưu nhiều nhất có thể.profiler_enable_trigger=On xdebug. Do đó khi đã tối ưu xong rồi thì cũng nên disable xdebug đi.org/docs/install Cấu hình: xdebug.profiler_append=On xdebug.

15 ******.apache. http://httpd.net (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Server Hostname: Server Port: Document Path: Document Length: Concurrency Level: Apache/2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss.0/programs/ab.net/ This is ApacheBench. http://www. Version 2.net 80 / 17058 bytes 100 Nghiêm Tiến Viễn – boygiandi! Page 11 .net/ Licensed to The Apache Software Foundation. http://www.- Benchmark : Sử dụng công cụ Apache Benchmark. Zeus Technology Ltd.org/ Benchmarking goodmeme.org/docs/2.apache.2.zeustech.html $ab -n 1000 -c 100 http://******.

Kết quả Chưa đo được Performance do người dùng chưa đông VII.797 [ms] (mean.9 201 Waiting: 28 269 184.728 [ms] (mean) Time per request: 2. Length: 7.49 [#/sec] (mean) Time per request: 279.Time taken for tests: 2. Kiểm thử 1. Receive: 0. across all concurrent requests) Transfer rate: 5993. Bảo trì … Nghiêm Tiến Viễn – boygiandi! Page 12 .5 0 Processing: 29 270 184.Thời gian thực hiện dự án : 3 tuần VI.797 seconds Complete requests: 1000 Failed requests: 7 (Connect: 0.83 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median Connect: 0 1 1. Tiêu chí o Tải bất kỳ trang nào đều dưới 200ms (giống tiêu chí của Zing) o CPU thường xuyên dưới 10%.6 201 max 7 1021 1021 1028 Percentage of the requests served within a certain time (ms) 50% 201 66% 211 75% 216 80% 222 90% 551 95% 805 98% 905 99% 941 100% 1028 (longest request) . max không quá 30% o I/O Wait dưới 5% 2. Exceptions: 0) Write errors: 0 Total transferred: 17168778 bytes HTML transferred: 16996778 bytes Requests per second: 357.9 200 Total: 36 270 185.

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.