NGINX là gì? Tổng quan về NGINX

3869

NGINX là gì?

NGINX là một web server mạnh mẽ mã nguồn mở. Nginx sử dụng kiến trúc đơn luồng, hướng sự kiện vì thế nó hiệu quả hơn Apache server. Nó cũng có thể làm những thứ quan trọng khác, chẳng hạn như load balancing, HTTP caching, hay sử dụng như một reverse proxy. Nginx là kiến thức không thể thiếu đối với một web developer, system administrator hay devops.

Các mốc ra đời và phát triển của Nginx

Năm 2002, Igor Sysoev phát triển Nginx ban đầu và công bố lần đầu vào năm 2004. Tháng 7 năm 2011, công ty Nginx Inc được thành lập với trụ sở đầu tiên tại San Francisco, California, USA.

Nginx có tính năng gì?

Những tính năng của máy chủ HTTP Nginx

  • Có khả năng xử lý hơn 10.000 kết nối cùng lúc với bộ nhớ thấp.
  • Phục vụ tập tin tĩnh (static files) và lập chỉ mục tập tin.
  • Tăng tốc reverse proxy bằng bộ nhớ đệm (cache), cân bằng tải đơn giản và khả năng chịu lỗi.
  • Hỗ trợ tăng tốc với bộ nhớ đệm của FastCGI, uwsgi, SCGI, và các máy chủ memcached.
  • Kiến trúc modular, tăng tốc độ nạp trang bằng nén gzip tự động.
  • Hỗ trợ mã hoá SSL và TLS.
  • Cấu hình linh hoạt; lưu lại nhật ký truy vấn
  • Chuyển hướng lỗi 3XX-5XX
  • Rewrite URL (URL rewriting) dùng regular expressions
  • Hạn chế tỷ lệ đáp ứng truy vấn
  • Giới hạn số kết nối đồng thời hoặc truy vấn từ 1 địa chỉ
  • Khả năng nhúng mã PERL
  • Hỗ trợ và tương thích với IPv6
  • Hỗ trợ WebSockets
  • Hỗ trợ truyền tải file FLV và MP4

Những tính năng máy chủ mail proxy của Nginx

Các phương pháp xác thực :

  • POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5;
  • IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5;
  • SMTP: AUTH LOGIN/PLAIN/CRAM-MD5;
  • Hỗ trợ SSL, STARTTLS và STLS

Cài đặt NGINX

Có 2 cách để cài đặt NGINX, có thể sử dụng gói (package) dựng sẵn hoặc cài đặt từ source.

Phương thức đầu tiên dễ và nhanh hơn, nhưng cài đặt từ source cung cấp khả năng cài đặt thêm các module khác giúp NGINX mạnh mẽ hơn. Nó cho phép chúng ta tùy chỉnh cho phù hợp với nhu cầu của ứng dụng.

Để cài đặt một gói Debian dựng sẵn, thứ duy nhất cần làm là:

sudo apt-get update
sudo apt-get install nginx

Sau khi quá trình cài đặt kết thúc, bạn có thể kiểm tra mọi thứ là ỔN bằng cách chạy lệnh dưới đây, nó sẽ hiển thị phiên bản NGINX được cài đặt:

sudo nginx -v
nginx version: nginx/1.18.2

Webserver mới sẽ được cài đặt tại /etc/nginx/. Nếu bạn vào trong thư mục này, bạn sẽ thấy nhiều tệp tin và thư mục. Nhưng thứ quan trọng nhất cần chú ý là tệp tin nginx.conf và thư mục sites-available.

Cấu hình NGINX

Những thiết lập quan trọng nhất ở trong tập tin nginx.conf, mặc định nó sẽ như thế này:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Tệp tin được cấu trúc thành các ngữ cảnh. Đầu tiên là events, và thứ 2 là http. Cấu trúc này có một vài lợi thế trong việc cấu hình, như mỗi ngữ cảnh có thể lồng trong ngữ cảnh khác, cái kế thừa mọi thứ từ cha mẹ của chúng nhưng cũng có thể ghi đè thiết lập nếu cần.

Nhiều thứ trong tệp tin này có thể tinh chỉnh dựa theo nhu cầu của bạn, nhưng bạn cũng có thể sử dụng các thiết lập mặc định. Một số phần quan trọng của tệp tin cấu hình này là:

  • worker_processes: Thiết lập này định nghĩa số worker processes mà NGINX sẽ sử dụng. Bởi vì NGINX là đơn luồng (single threaded), nó thường bằng với số lõi CPU.
  • worker_connection: Đây là số lượng tối đa của các kết nối đồng thời cho mỗi worker process và nói cho các worker process của chúng ta có bao nhiêu người có thể được phục vụ đồng thời bởi NGINX.
  • access_log & error_log: Đây là những tệp tin mà NGINX sẽ sử dụng để log bất kỳ lỗi và số lần truy cập. Các bản ghi này thường được sử dụng để gỡ lỗi hoặc sửa chữa.
  • gzip: Đây là các thiết lập nén GZIP của các NGINX reponse. Tính năng này có nhiều thiết lập phụ, phần bị comment bởi mặc định có thể giúp hiệu suất được cải thiện đáng kể. Trong các thiết lập phụ của GZIP, cần quan tâm tới gzip_comp_level, nó là mức nén và nằm trong khoảng từ 1 tới 10. Thông thường, giá trị này không nên lớn hơn 6 — trên mức này lợi ích từ việc nén là không đáng kể, vì nó cần sử dụng nhiều CPU hơn. gzip_types là một danh sách các kiểu response sẽ được nén.

NGINX có thể hỗ trợ nhiều hơn một website, và các tệp tin định nghĩa các trang web của bạn ở trong thư mục /etc/nginx/sites-available.

Tuy nhiên, các tệp tin trong thư mục này không “live” — bạn có thể có nhiều tệp tin định nghĩa các trang web ở đây, nhưng NGINX không thực sự làm bất cứ điều gì với chúng trừ khi chúng được symlink (liên kết tượng trưng) tới thư mục /etc/nginx/sites-enabled (bạn cũng có thể copy chúng tới thư mục này, nhưng symlink đảm bảo rằng chỉ có duy nhất một bản copy của mỗi tệp tin được theo dõi).

Nó cung cấp cho bạn một phương thức để nhanh chóng đưa các trang web online hoặc offilne mà không cần phải thực sự xóa bất kỳ tệp tin nào — khi bạn sẵn sàng cho một trang web online, tạo symlink tới sites-enabled và khởi động lại NGINX.

Thư mục site-available bao gồm các cấu hình cho các host ảo (virtual host). Nó cho phép web server có thể cấu hình cho nhiều trang web với các cấu hình riêng biệt. Các trang web trong thư mục không live và chỉ được cho phép nếu chúng ta tạo một symlink tới thư mục sites-enabled.

Bạn có thể tạo một tệp tin mới cho ứng dụng của mình hoặc chỉnh sửa một tệp tin mặc định. Một cấu hình thông thường sẽ như dưới đây:

upstream remoteApplicationServer {
    server 10.10.10.10;
}

upstream remoteAPIServer {
    server 20.20.20.20;
    server 20.20.20.21;
    server 20.20.20.22;
    server 20.20.20.23;
}


server {
    listen 80;
    server_name www.customapp.com customapp.com
    root /var/www/html;
    index index.html

        location / {
            alias /var/www/html/customapp/;
            try_files $uri $uri/ =404;
        }

        location /remoteapp {
            proxy_set_header   Host             $host:$server_port;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass http://remoteAPIServer/;
        }

        location /api/v1/ {
            proxy_pass https://remoteAPIServer/api/v1/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_redirect http:// https://;
        }
}

Giống như nginx.conf, nó cũng sử dụng khái niệm các ngữ cảnh lồng nhau (và tất cả cũng được lồng trong ngữ cảnh HTTP CỦA nginx.conf, vì thế chúng cũng kế thừa mọi thứ từ nó).

Ngữ cảnh server định nghĩa một server ảo để xử lý các request từ client của bạn. Bạn có thể có nhiều khối server, và NGINX sẽ chọn một trong số chúng dựa trên các chỉ thị listen và server_name.

Trong một khối server, chúng ta định nghĩa nhiều ngữ cảnh location được sử dụng để quyết định cách xử lý các request từ client. Bất cứ khi nào một request đến, NGINX sẽ thử khớp URI tới một trong số các định nghĩa location và xử lý nó cho phù hợp.

Có nhiều chỉ thị quan trọng có thể được sử dụng dưới ngữ cảnh location, chẳng hạn như:

  • try_files sẽ cố gắng phục vụ các tệp tin tĩnh được tìm thấy trong thư mục được trỏ tới bởi chỉ thị gốc.
  • proxy_pass sẽ gửi request tới một proxy server cụ thể.
  • rewrite sẽ viết lại URI tới dựa trên một regular expression để một khối location có thể xử lý nó.

Ngữ cảnh upstream định nghĩa một pool của các server cái NGINX sẽ ủy quyền các request tới. Sau khi chúng ta tạo một khối upstream và định nghĩa một server bên trong nó chúng có thể tham chiếu nó bằng tên bên trong các khối location. Thêm nữa, một ngữ cảnh upstream có thể có nhiều server được gán trong nó vì rằng NGINX sẽ làm một vài load balancing khi ủy quyền các request.

Khởi động NGINX

Sau khi chúng ta hoàn tất cấu hình và di chuyển ứng dụng web tới thư mục phù hợp, chúng ta có thể khởi động NGINX sử dụng lệnh dưới đây: sudo service nginx start

Sau đó, bất cứ khi nào chúng ta thay đổi cấu hình, chúng ta chỉ cần tải lại (không có thời gian downtime) sử dụng lệnh dưới đây: service nginx reload Cuối cùng, chúng ta có thể kiểm tra trạng thái của NGINX sử dụng lệnh dưới đây: service nginx status

Báo cáo bài viết vi phạm bản quyền>>