12/08/2018, 15:40

Chuyện gì xảy ra khi bạn tạo 1 request

Bạn có bao giờ tự hỏi điều: what happen when you create a request to server? Dạo gần đây mình có đọc một bài viết khá hay về vấn đề này và muốn trình bày lại cho mọi người. Khi bạn gõ 1 đường link vào url, ví dụ: www.example.com/courses có nghĩa là bạn đã tạo ra một request trong browser của ...

Bạn có bao giờ tự hỏi điều: what happen when you create a request to server? Dạo gần đây mình có đọc một bài viết khá hay về vấn đề này và muốn trình bày lại cho mọi người.

  1. Khi bạn gõ 1 đường link vào url, ví dụ: www.example.com/courses có nghĩa là bạn đã tạo ra một request trong browser của bạn.
  2. Trình duyệt của bạn sẽ tra cứu DNS ( Domain Name System là Hệ thống phân giải tên) để tìm ra địa chỉ IP của server mà bạn vừa gửi request tới.
  3. Mỗi trình duyệt của bạn đều có một địa chỉ ip riêngcos thể tạo ra một http request tới webserver (đây cũng là địa chỉ dùng để gửi reponse từ web server về). HTTP request có dạng như thế này:
GET http://example.com/courses/ HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.example.com
  1. Next, request sẽ được gửi tời web server( nginx và apache là 2 web server phổ biến nhất). Web Server sẽ xử lí the incoming HTTP request và cho phép nó đi vào app server( nếu nó có quyền ). Ví dụ, Nếu như request chỉ lấy thông tin từ các file tĩnh thì nó sẽ không cần phải đi qua app server. Còn nếu không, web server sẽ cho phép request tiếp tục truy cập vào app server (unicorn, Thin or puma) ở đây mình dùng passenger cho đơn giản: nginx.conf
user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    ##
    # nginx-passenger config
    ##
    include /etc/nginx/passenger.conf;
    
    ##
    # public sites
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

sites-enabled/cfn.framgia.vn

server {
        server_name cfn.framgia.vn;
        passenger_enabled on;
        root /var/www/tuanna2704/public;
}

App server sẽ có trách nhiệm chạy đến rails application load code của application và giữ nó trong memory. Và khi App Server tiếp nhận request từ web server và bắt đầu xử lí ( bạn có thể chạy một app server mà không cần đến web server).

  1. Ruby Rack, lớp trung gian giữa app server và framework. Nếu bạn đã dùng qua nhiều fw thì bạn có thể thấy tư tưởng chủ đạo của của đa số các fw là validate request, còn với rails là validate model, vậy nếu rails muốn validate model thì phải làm ntn, câu trả lời chính là ruby rack

  2. Mỗi web server đều cso thể handle request trong app server. Đây cũng là điểm vào trong rails và là router trong mô hình MVC. App Server sẽ điều hướng request tới router. Nó chỉ ra cho Rails Application phải lấy file từ đâu.DV:

resources :courses, only: [:index, :show] do
end
  1. Sau khi hitting router, request sẽ move tới controller và action được gọi tới.
class CoursesController < ApplicationController
  def index
    @courses = Course.all
  end
end

và phần còn lại thì các bạn đã biết rồi đấy vì đó là công việc hàng ngày của web developer chúng ta mà             </div>
            
            <div class=

0