I. Giới thiệu

Theo khảo sát đáng tin cậy thực hiện vào tháng 2/2016 của Netcraft (một công ty chuyên về khảo sát và thu thập biến thiên của Internet của Anh) trên gần 1 tỷ trang web, nginx hiện đang nằm trong top 3 web server được ưa chuộng nhất với thị phần 14,72% (hơn 137 triệu trang web).

all_sites.png

active_sites.png

busiest.png

computer.png

Netcraft cũng dự đoán có thể nginx sẽ vượt lên để chiếm vị trí của Microsoft trong tương lai nhờ những ưu điểm vượt trội của nó.

Vậy, nginx là gì? Các tính năng của nó ra sao mà lại được Netcraft lại đưa ra dự đoán như vậy? Chúng ta hãy cùng tìm hiểu nó ngay sau đây nhé.

II. Nginx là gì?

1. Định nghĩa

Theo wiki:

  • Nginx (phát âm là “engine x”) là 1 web server tập trung mạnh mẽ vào khả năng xử lý đồng thời cao, hiệu suất và sử dụng ít bộ nhớ. Nó cũng có thể hoạt động như một reverse proxy server cho các giao thức HTTP, HTTPS, SMTP, POP3 và IMAP, cũng như cân bằng tải (load balancer) và HTTP cache.
  • Được tạo ra bởi Igor Sysoev năm 2002, nginx chạy trên Unix, Linux, các biến thể BSD, Mac OS X, Solaris, AIX, HP-UX và Microsoft Windows.

2. Tính năng

a. Một số tính năng về HTTP proxy và web server

  • Khả năng xử lý hơn 10 nghìn kết nối đồng thời với bộ nhớ thấp
  • Xử lý các file tĩnh, file index và tự động đánh index
  • Tăng tốc với bộ nhớ đệm đảo ngược proxy
  • Cân bằng tải với khả năng check lỗi
  • Hỗ trợ TLS/SSL, FastCGI, SCGI với bộ nhớ đệm
  • Tên và địa chỉ IP dựa trên máy ảo
  • Tương thích với IPv6
  • Hỗ trợ giao thức HTTP/2 và SPDY

b. Một số tính năng về mail proxy

  • Hỗ trợ TLS/SSL, STARTTLS, SMTP, POP3, và IMAP proxy
  • Xác thực dựa trên máy chủ HTTP bên ngoài

III. Cài đặt nginx open source

1. Phiên bản

NGINX Open Source có sẵn 2 phiên bản sau:

a. Phiên bản mới nhất (mainline): bao gồm các tính năng mới nhất, các bản vá lỗi và được cập nhật thường xuyên. Đây là 1 phiên bản đáng tin cậy, tuy nhiên, nó cũng bao gồm 1 số module thử nghiệm và có thể có 1 số bug mới phát sinh.

b. Phiên bản ổn định (stable): ít được cập nhật các tính năng mới, tuy nhiên lại ít lỗi hơn so với phiên bản mainline. Vì vậy, nó thường được khuyến khích dùng hơn đối với developer.

2. Cài đặt

Với cả 2 phiên bản trên, ta đều có thể chọn 1 trong 2 cách sau để cài đặt:

a. Biên dịch từ source code

Bước 1: Cài đặt các thư viện liên quan

  • Cài đặt thư viện PCRE:
Đây là thư viện cần thiết để biên dịch nginx. Rewrite và các HTTP module của nginx sử dụng PCRE cho cú pháp của các biểu thức thông thường:
    $ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
    $ tar -zxf pcre-8.38.tar.gz
    $ cd pcre-8.38
    $ ./configure
    $ make
    $ sudo make install
  • Cài đặt thư viện zlib:
Cần thiết cho module Gzip của Nginx, cung cấp các thuật toán nén.
    $ wget http://zlib.net/zlib-1.2.8.tar.gz
    $ tar -zxf zlib-1.2.8.tar.gz
    $ cd zlib-1.2.8
    $ ./configure
    $ make
    $ sudo make install
  • Cài đặt thư viện OpenSSL:
Thư viện này được yêu cầu cho SSL module của nginx để hỗ trợ giao thức HTTPS.
    $ wget http://www.openssl.org/source/openssl-1.0.2f.tar.gz
    $ tar -zxf openssl-1.0.2f.tar.gz
    $ cd openssl-1.0.2f
    $ ./configure darwin64-x86_64-cc --prefix=/usr
    $ make
    $ sudo make install

Bước 2: Download source

  • Chọn phiên bản bạn muốn sử dụng trong list source

  • Ví dụ với bản mainline 1.9.15, bạn chạy các command sau:

    $ wget http://nginx.org/download/nginx-1.9.15.tar.gz
    $ tar zxf nginx-1.9.15.tar.gz
    $ cd nginx-1.9.15
- Cấu hình để build source

Nếu bạn không quan tâm đến việc thiết lập cấu hình thì sau khi làm các bước trên, bạn chỉ cần chạy:
    $ ./configure
    $ make
    $ make install
Vậy là cài đặt xong. Bây giờ, bạn có thể dùng command sau để chạy nginx:
    $ sudo nginx
Tuy nhiên, nếu bạn muốn thiết lập theo cấu hình như ý mình, hoặc muốn tìm hiểu kỹ hơn về nginx chả hạn, thì bạn có thể quan tâm đến các tùy chọn cấu hình sau:
    $ ./configure [--options]
Ví dụ:
    $ ./configure
    --sbin-path=/usr/local/nginx/nginx
    --conf-path=/usr/local/nginx/nginx.conf
    --pid-path=/usr/local/nginx/nginx.pid
    --with-pcre=../pcre-8.38
    --with-zlib=../zlib-1.2.8
    --with-http_ssl_module
    --with-stream
    --with-mail=dynamic
    --add-module=/usr/build/nginx-rtmp-module
    --add-dynamic-module=/usr/build/3party_module
Nhìn loằng ngoằng quá phải không nào? Ta cùng xem các bảng option dưới đây để hiểu rõ hơn về cấu hình build nhé.
  • Cấu hình đường dẫn:
_.Option_.Mô tả_.Mặc định
--prefix=pathĐường dẫn đến thư mục nginx được cài đặt/usr/local/nginx
--sbin-path=pathĐường dẫn đến file thực thiprefix/sbin/nginx
--conf-path=pathĐường dẫn đến file cấu hình chínhprefix/conf/nginx.conf
--pid-path=pathĐường dẫn đến file nginx.pid lưu trữ process IDprefix/logs/nginx.pid
--error-log-path=pathĐường dẫn đến file log ghi lỗiprefix/logs/error.log
--http-log-path=pathĐường dẫn đến file ghi lịch sử truy cậpprefix/logs/access.log
--with-pcre=pathĐường dẫn đến các file thực thi của pcre
--with-zlib=pathĐường dẫn đến thư viện zlib
- Cấu hình gcc
_.Option_.Mô tả
--with-cc-opt=parametersXác định các tham số được thêm vào biến CFLAGS
--with-ld-opt=parametersXác định các tham số được sử dụng linking
  • Nginx module

    Nginx bao gồm các module. Và các module cũng được thiết lập bởi ./configure script.

    • Các module được build mặc định:
    _.Module_.Mô tả
    http_charset_moduleThêm charset cụ thể đến trường Content Type của response header, có thể convert dữ liệu từ kiểu charset này sang kiểu khác
    http_gzip_moduleNén dữ liệu với hàm gzip, có thể giúp giảm kích thước dữ liệu xuống còn 1 nửa
    http_ssi_moduleXử lý SSI (Server Side Includes)
    http_userid_moduleCung cấp định danh cho user thông qua cookie
    http_access_moduleCho phép cấu hình truy cập cho các dải IP
    http_access_moduleGiới hạn truy cập đến địa chỉ khách hàng nhất định
    http_auth_basic_moduleGiới hạn truy cập đến resource bằng việc validate username và password sử dụng giao thức HTTP Basic Authentication
    http_autoindex_moduleXử lý request được kết thúc bởi dấu gạch chéo ('/') và tạo list thư mục
    http_geo_moduleTạo các biến với giá trị phụ thuộc vào địa chỉ IP khách
    http_map_moduleTạo các biến với giá trị phụ thuộc vào các biến khác
    http_split_clients_moduleTạo các biến phù hợp với thử nghiệm A/B (chia nhỏ)
    http_referer_moduleChặn truy cập đến các trang web có request với giá trị không hợp lệ trong trường Referer header
    http_rewrite_moduleThay đổi request URI sử dụng regular expressions và trả về redirect
    http_proxy_moduleTruyền các request đến server khác
    http_fastcgi_moduleTruyền các request đến FastCGI server
    http_uwsgi_moduleTruyền các request đến uwsgi server
    http_scgi_moduleTruyền các request đến SCGI server
    http_memcached_moduleNhận response từ memcached server
    http_limit_conn_moduleGiới hạn số kết nối trên mỗi key được định nghĩa
    http_limit_req_moduleGiới hạn tốc độ xử lý request trên mỗi key được định nghĩa
    http_empty_gif_moduleTạo 1 ảnh GIF rỗng
    http_browser_moduleTạo các biến có giá trị phụ thuộc vào giá trị của trường 'User-Agent' của request header
    http_upstream_hash_moduleKích hoạt hàm băm load balancing
    http_upstream_ip_hash_moduleKích hoạt hàm băm IP load balancing
    http_upstream_least_conn_moduleKích hoạt hàm least_conn load balancing
    http_upstream_keepalive_moduleKích hoạt keepalive connections
    http_upstream_zone_moduleKích hoạt vùng bộ nhớ được chia sẻ
    • Các module không được build mặc định: Bạn cần kích hoạt chúng bằng tay thông qua /configure command.

    Ví dụ:

    $ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_ssl_module --with-stream --with-mail
List các module các bạn có thể xem thêm [tại đây](https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/).

b. Build từ package:

Đây là cách nhanh chóng và dễ dàng nhất để cài đặt nginx. Bạn không cần quan tâm xem phải add module nào, công dụng của nó ra làm sao, vì package bạn cài đặt đã bao gồm tất cả các module cần thiết của nginx đối với hệ điều hành bạn sử dụng rồi.

Bạn có thể cài đặt thông qua Red Hat/CentOS hoặc Debian/Ubuntu package:

  • Cài đặt qua Red Hat/CentOS package:
$ sudo yum install epel-release
$ sudo yum update
$ sudo nginx -v
  • Cài đặt qua Debian/Ubuntu package:
$ sudo apt-get update
$ sudo apt-get install nginx
$ sudo nginx -v

Sau khi cài đặt xong, tất cả các file cấu hình của nginx được lưu trữ trong thư mục /etc/nginx/ (hoặc /opt/nginx/conf/). Trong đó, file cấu hình chính là nginx.conf.

Ví dụ:

#/etc/nginx/nginx.conf

user       www www;  ## Default: nobody
worker_processes  5;  ## Default: 1
error_log  logs/error.log;
pid        logs/nginx.pid;
worker_rlimit_nofile 8192;

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  include    conf/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;

  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log   logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts

  server { # php/fastcgi
    listen       80;
    server_name  domain1.com www.domain1.com;
    access_log   logs/domain1.access.log  main;
    root         html;

    location ~ \.php$ {
      fastcgi_pass   127.0.0.1:1025;
    }
  }

  server { # simple reverse-proxy
    listen       80;
    server_name  domain2.com www.domain2.com;
    access_log   logs/domain2.access.log  main;

    # serve static files
    location ~ ^/(images|javascript|js|css|flash|media|static)/  {
      root    /var/www/virtual/big.server.com/htdocs;
      expires 30d;
    }

    # pass requests for dynamic content to rails/turbogears/zope, et al
    location / {
      proxy_pass      http://127.0.0.1:8080;
    }
  }

  upstream big_server_com {
    server 127.0.0.3:8000 weight=5;
    server 127.0.0.3:8001 weight=5;
    server 192.168.0.1:8000;
    server 192.168.0.1:8001;
  }

  server { # simple load balancing
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;

    location / {
      proxy_pass      http://big_server_com;
    }
  }
}

Trong các phần trên, đã giới thiệu về nginx cũng như cách cài đặt và cấu hình module cho nginx. Chúng ta sẽ tiếp tục tìm hiểu kỹ hơn về việc cấu hình trong nginx sau ở phần tiếp theo của series này nhé.

IV. Tài liệu tham khảo

  1. Nginx
  2. INSTALLING NGINX OPEN SOURCE
  3. February 2016 Web Server Survey
  4. Full Example Configuration