Common Gateway Interface (CGI)

Giới thiệu về cơ chế CGI

Mục đích ban đầu của máy chủ web là để trả lời các yêu cầu từ khách hàng bằng việc phục vụ các tập tin nằm trên 1 thiết bị lưu trữ. Khách hàng gửi yêu cầu để tải 1 tập tin và máy chủ xử lý yêu cầu này và gửi 1 phản hồi tương ứng: 200 OK nếu tập tin có thể được phục vụ bình thường, 404 nếu tập tin không được tìm thấy, và các mã phản hồi khác.

Original purpose of web server

Original purpose of web server

Cơ chế này đã được sử dụng từ những ngày đầu của World Wide Web và đến nay nó vẫn còn được sử dụng. Tuy nhiên, theo thời gian thì các website tĩnh phải nhường chỗ cho sự phát triển của các website có nội dung động, chứa các kịch bản (script) được xử lý bởi các ứng dụng như PHP và Python, cùng những ứng dụng khác. Cơ chế phục vụ web do đó cũng thay đổi như sau:

Web serving mechanism

Web serving mechanism

Khi 1 khách hàng truy cập 1 trang động, máy chủ web nhận yêu cầu và chuyển tiếp nó đến ứng dụng của bên thứ 3. Ứng dụng này xử lý kịch bản độc lập và trả về phản hồi được tạo ra cho máy chủ web, máy chủ web sau đó chuyển tiếp phản hồi này cho khách hàng.

Để cho máy chủ web giao tiếp với các ứng dụng như vậy, giao thức CGI đã được phát minh vào đầu những năm 1990.

Common Gateway Interface (CGI)

Giao thức CGI được đề cập trong đặc tả kỹ thuật  RFC 3875 (CGI protocol v1.1), được thiết kế bởi Internet Society (ISOC) như sau:

Common Gateway Interface (CGI) cho phép 1 máy chủ HTTP và 1 kịch bản CGI chia sẻ trách nhiệm phản hồi các yêu cầu khách hàng […] Máy chủ chịu trách nhiệm quản lý các kết nối, việc truyền dữ liệu, và các vấn đề mạng liên quan đến yêu cầu của khách hàng, trong khi kịch bản CGI xử lý các vấn đề của ứng dụng như truy cập dữ liệu và xử lý tài liệu.

CGI là 1 giao thức diễn tả cách thông tin được trao đổi giữa máy chủ Web và các ứng dụng cổng (gateway application) như PHP, Python …). Trên thực tế, khi máy chủ web nhận 1 yêu cầu mà sẽ được chuyển tiếp cho ứng dụng cổng, nó đơn giản thực thi 1 câu lệnh tương ứng cho ứng dụng đó, ví dụ như là /usr/bin/php. Chi tiết về yêu cầu khách hàng (như là User Agent và các thông tin khác) được truyền qua hoặc bằng các đối số dòng lệnh hoặc trong các biến môi trường, trong khi dữ liệu thực sự từ các yêu cầu POST hoặc PUT được truyền qua các cổng nhập tiêu chuẩn. Ứng dụng được gọi sau đó viết nội dung tài liệu được xử lý cho cổng xuất tiêu chuẩn, mà được ghi nhận lại máy chủ web.

Trong khi kỹ thuật này trông có vẻ đủ đơn giản và hiệu quả ngay từ đầu, thì nó bộc lộ vài hạn chế chính như sau:

  •  1 tiến trình duy nhất được sinh ra cho mỗi yêu cầu. Bộ nhớ và các thông tin ngữ cảnh bị mất từ yêu cầu này đến yêu cầu khác.
  • Việc bắt đầu 1 tiến trình có thể tiêu tốn tài nguyên của hệ thống. Số lượng hàng loạt các yêu cầu đồng thời (mỗi yêu cầu sinh ra 1 tiến trình) có thể làm máy chủ nhanh chóng quá tải.
  • Việc thiết kế 1 kiến trúc nơi máy chủ web và ứng dụng nằm trên những máy tính khác nhau thường khó khăn.

Fast Common Gateway Interface (FastCGI)

FastCGI mang đến những cải thiện đáng kể so với CGI với việc thành lập theo những nguyên tắc sau:

  • Thay cho việc sinh ra 1 tiến trình mới cho từng yêu cầu, FastCGI sử dụng các tiến trình liên tục có khả năng xử lý nhiều yêu cầu.
  • Máy chủ web và ứng dụng cổng giao tiếp bằng việc sử dụng các socket như TCP hoặc POSIX Local IPC. Do đó, cả 2 tiến trình có thể nằm trên 2 máy tính khác nhau trong 1 mạng.
  • Máy chủ web chuyển tiếp yêu cầu khách hàng đến cổng và nhận phản hồi trong 1 kết nối. Các yêu cầu thêm cũng có thể theo mà không cần tạo ra các kết nối khác. Lưu ý rằng trên phần lớn máy chủ web, bao gồm Nginx và Apache, việc thực thi FastCGI không hỗ trợ (hoặc ít nhất là hỗ trợ không đầy đủ) truy cập đồng thời.
  • Từ khi FastCGI là 1 giao thực dựa trên socket, nó có thể được thực hiện trên bất kỳ nền tảng nào với bất kỳ ngôn ngữ lập trình nào.

uWSGI và SCGI

uWSGI (Web Server Gateway Interface) là 1 giao thức cho phép máy chủ web giao tiếp với các ứng dụng được viết bằng các ngôn ngữ Python, Perl và Ruby.

SCGI (Simple Common Gateway Interface) là 1 dạng khác của giao thức CGI, giống nhiều với FastCGI. Giao thức này có tuổi đời ít hơn FastCGI, khi mà các đặc tả kỹ thuật của nó được xuất bản lần đầu vào năm 2006, SCGI được thiết kế để việc thực hiện giao thức CGI dễ dàng hơn, như chính tên gọi của nó: simple. Giao thức này không liên quan đến 1 ngôn ngữ lập trình nào. Các giao diện và module của SCGI có thể được tìm thấy trong nhiều dự án phần mềm như Apache, IIS, Java, Cherokee …

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.