Định cấu hình Nginx cho Hiệu suất và Bảo mật

Trong hướng dẫn này, chúng tôi sẽ xem xét cách chúng tôi có thể định cấu hình máy chủ web Nginx cho môi trường sản xuất.


Máy chủ web trong môi trường sản xuất khác với máy chủ web trong môi trường thử nghiệm về hiệu suất, bảo mật, v.v..

Theo mặc định, luôn có cài đặt cấu hình sẵn sàng sử dụng cho máy chủ web Nginx sau khi bạn đã cài đặt thành công. Tuy nhiên, cấu hình mặc định không đủ tốt cho môi trường sản xuất. Do đó, chúng tôi sẽ tập trung vào cách định cấu hình Nginx để hoạt động tốt hơn trong khi tăng lưu lượng truy cập lớn và bình thường và cách bảo mật nó khỏi những người dùng có ý định lạm dụng nó.

Nếu bạn chưa cài đặt Nginx trên máy của mình, bạn có thể kiểm tra cách thực hiện tại đây. Nó chỉ cho bạn cách cài đặt Nginx trên nền tảng Unix. Chọn cài đặt Nginx thông qua các tệp nguồn vì Nginx dựng sẵn không đi kèm với một số mô-đun được sử dụng trong hướng dẫn này.

Yêu cầu

Bạn cần cài đặt các phần sau trên máy của mình và đảm bảo bạn chạy hướng dẫn này trên bất kỳ nền tảng dựa trên Debian nào như Ubuntu.

  • Ubuntu hoặc bất kỳ nền tảng dựa trên Debian nào khác
  • wget
  • Vim (soạn thảo văn bản)

Ngoài ra, bạn cần chạy hoặc thực thi một số lệnh trong hướng dẫn này với tư cách là người dùng root thông qua lệnh sudo.

Hiểu cấu trúc cấu hình Nginx

Trong phần này chúng ta sẽ xem xét như sau:

  • Cấu trúc của Nginx
  • Các phần như sự kiện, HTTP và thư
  • Cú pháp hợp lệ của Nginx

Ở cuối phần này, bạn sẽ hiểu cấu trúc của cấu hình Nginx, mục đích hoặc vai trò của các phần cũng như cách xác định các chỉ thị hợp lệ bên trong các phần.

Tệp cấu hình Nginx hoàn chỉnh có cấu trúc logic bao gồm các lệnh được nhóm thành một số phần như phần sự kiện, phần http, phần thư, v.v..

Tệp cấu hình chính được đặt tại /etc/nginx/nginx.conf trong khi các tệp cấu hình khác được đặt tại / etc / nginx.

Bối cảnh chính

Phần hoặc ngữ cảnh này chứa các chỉ thị bên ngoài các phần cụ thể như phần thư.

Bất kỳ chỉ thị nào khác như người dùng nginx; , Worker_ Processes 1; , Error_log /var/log/nginx/error.log cảnh báo; và pid /var/run/nginx.pid có thể được đặt trong phần chính hoặc bối cảnh.

Nhưng một số trong các lệnh này như worker_ Processes cũng có thể tồn tại trong phần sự kiện.

Phần

Các phần trong Nginx xác định cấu hình cho các mô-đun Nginx.

Chẳng hạn, phần http xác định cấu hình cho mô đun ngx_http_core, phần sự kiện xác định cấu hình cho ngx_event_module trong khi phần thư xác định cấu hình cho ngx_mail_module.

Bạn có thể kiểm tra đây cho một danh sách đầy đủ các phần trong Nginx.

Chỉ thị

Các chỉ thị trong Nginx được tạo thành từ một tên biến và một số đối số như sau:

Worker_ Processes là một tên biến trong khi auto tự động làm đối số.

worker_ Processes auto;

Chỉ thị kết thúc bằng dấu chấm phẩy như hình trên.

Cuối cùng, tệp cấu hình Nginx phải tuân thủ một bộ quy tắc cụ thể. Sau đây là cú pháp hợp lệ của cấu hình Nginx:

  • Các chỉ thị hợp lệ bắt đầu bằng một tên biến sau đó theo sau là một hoặc nhiều đối số
  • Tất cả các chỉ thị hợp lệ kết thúc bằng một dấu chấm phẩy;
  • Các phần được xác định bằng dấu ngoặc nhọn {}
  • Một phần có thể được nhúng trong một phần khác
  • Cấu hình bên ngoài bất kỳ phần nào là một phần của cấu hình toàn cầu Nginx.
  • Các dòng bắt đầu bằng dấu băm # là các bình luận.

Điều chỉnh Nginx cho hiệu suất

Trong phần này, chúng tôi sẽ định cấu hình Nginx để hoạt động tốt hơn trong khi lưu lượng truy cập lớn và tăng lưu lượng truy cập.

Chúng tôi sẽ xem xét cách cấu hình:

  • Công nhân
  • Hoạt động đĩa I / O
  • Hoạt động mạng
  • Bộ đệm
  • Nén
  • Bộ nhớ đệm
  • Hết giờ

Tuy nhiên, bên trong môi trường ảo được kích hoạt, nhập các lệnh sau để thay đổi thư mục Nginx và liệt kê nội dung của nó.

cd nginx && ls

Tìm kiếm thư mục conf. Bên trong thư mục này là tập tin nginx.conf.

Chúng tôi sẽ sử dụng tệp này để định cấu hình Nginx

Bây giờ thực hiện các lệnh sau để điều hướng đến thư mục conf và mở tệp nginx.conf bằng trình soạn thảo vim

cd conf
sudo vim nginx.conf

Dưới đây là ảnh chụp màn hình của tệp nginx.conf theo mặc định.

Công nhân

Để cho phép Nginx hoạt động tốt hơn, chúng ta cần cấu hình các công nhân trong phần sự kiện. Định cấu hình nhân viên Nginx cho phép bạn xử lý các kết nối từ máy khách một cách hiệu quả.

Giả sử bạn chưa đóng trình chỉnh sửa vim, hãy nhấn vào nút i trên bàn phím để chỉnh sửa tệp nginx.conf.

Sao chép và dán phần bên trong phần sự kiện như bên dưới:

sự kiện {
worker_ Processes auto;
worker_connections 1024;
worker_rlimit_nofile 20960;
đa_accept trên;
mutex_accept trên;
mutex_accept_delay 500ms;
sử dụng epoll;
epoll_events 512;
}

worker_ Processes: Lệnh này kiểm soát số lượng công nhân trong Nginx. Giá trị của lệnh này được đặt thành tự động để cho phép Nginx xác định số lượng lõi có sẵn, đĩa, tải máy chủ và hệ thống con mạng. Tuy nhiên, bạn có thể khám phá số lượng lõi bằng cách thực hiện lệnh lscpu trên thiết bị đầu cuối.

worker_connections: Lệnh này đặt giá trị của số lượng kết nối đồng thời có thể được mở bởi một worker. Giá trị mặc định là 512 nhưng chúng tôi đặt nó thành 1.024 để cho phép một nhân viên chấp nhận kết nối đồng thời từ máy khách.

worker_rlimit_nofile: Lệnh này bằng cách nào đó có liên quan đến worker_connections. Để xử lý kết nối đồng thời lớn, chúng tôi đặt nó thành một giá trị lớn.

multi_accept: Lệnh này cho phép một công nhân chấp nhận nhiều kết nối trong hàng đợi tại một thời điểm. Một hàng đợi trong ngữ cảnh này chỉ đơn giản có nghĩa là một chuỗi các đối tượng dữ liệu đang chờ xử lý.

mutex_accept: Lệnh này được tắt theo mặc định. Nhưng vì chúng tôi đã cấu hình nhiều công nhân trong Nginx, chúng tôi cần bật nó như được hiển thị trong đoạn mã trên để cho phép các công nhân chấp nhận từng kết nối mới.

mutex_accept_delay: Lệnh này xác định thời gian một công nhân sẽ đợi bao lâu trước khi chấp nhận kết nối mới. Khi accept_mutex được bật, khóa mutex được gán cho công nhân cho khung thời gian được chỉ định bởi accept_mutex_delay. Khi khung thời gian kết thúc, nhân viên tiếp theo trong dòng sẵn sàng chấp nhận các kết nối mới.

use: Lệnh này chỉ định phương thức xử lý kết nối từ máy khách. Trong hướng dẫn này, chúng tôi đã quyết định đặt giá trị thành epoll vì chúng tôi đang làm việc trên nền tảng Ubuntu. Phương thức epoll là phương thức xử lý hiệu quả nhất cho các nền tảng Linux.

epoll_events: Giá trị của lệnh này chỉ định số lượng sự kiện Nginx sẽ chuyển đến kernel.

Đĩa I / O

Trong phần này, chúng tôi sẽ định cấu hình hoạt động I / O không đồng bộ trong Nginx để cho phép nó thực hiện truyền dữ liệu hiệu quả và cải thiện hiệu quả của bộ đệm.

Đĩa I / O chỉ đơn giản là nói đến hoạt động ghi và đọc giữa đĩa cứng và RAM. Chúng tôi sẽ sử dụng gửi tài liệu() Hàm bên trong kernel để gửi các tệp nhỏ.

Bạn có thể sử dụng phần http, phần vị trí và phần máy chủ cho các chỉ thị trong khu vực này.

Phần vị trí, phần máy chủ có thể được nhúng hoặc đặt trong phần http để làm cho cấu hình có thể đọc được.

Sao chép và dán mã sau vào phần vị trí được nhúng trong phần HTTP.

vị trí / pdf / {
sendfile trên;
aio trên;
}

vị trí / âm thanh / {
chỉ đạo 4m
directio_alocation 512
}

sendfile: Để sử dụng tài nguyên hệ điều hành, hãy đặt giá trị của lệnh này thành bật. sendfile chuyển dữ liệu giữa các bộ mô tả tệp trong không gian nhân hệ điều hành mà không gửi nó đến bộ đệm ứng dụng. Lệnh này sẽ được sử dụng để phục vụ các tệp nhỏ.

directio: Lệnh này cải thiện hiệu quả bộ đệm bằng cách cho phép đọc và ghi được gửi trực tiếp đến ứng dụng. directio là một tính năng hệ thống tập tin của mọi hệ điều hành hiện đại. Lệnh này sẽ được sử dụng để phục vụ các tệp lớn hơn như video.

aio: Lệnh này cho phép đa luồng khi được đặt thành bật cho hoạt động ghi và đọc. Đa luồng là một mô hình thực thi cho phép nhiều luồng thực thi tách biệt với nhau trong khi chia sẻ tài nguyên quy trình lưu trữ của chúng.

directio_alocation: Lệnh này gán giá trị kích thước khối cho truyền dữ liệu. Nó liên quan đến chỉ thị.

Lớp mạng

Trong phần này, chúng tôi sẽ sử dụng các lệnh như tcp_nodelay và tcp_nopush để ngăn các gói nhỏ chờ đợi một khung thời gian xác định khoảng 200 mili giây trước khi chúng được gửi cùng một lúc.

Thông thường khi các gói được truyền trong ‘miếng, chúng có xu hướng bão hòa mạng được tải cao. Vì vậy, John Nagle đã xây dựng một thuật toán đệm để giải quyết vấn đề này. Mục đích của thuật toán đệm Nagle, là để ngăn các gói nhỏ bão hòa mạng được tải cao.

Sao chép và dán mã sau vào phần HTTP.

http {

tcp_nopush trên;
tcp_nodelay trên;

}

tcp_nodelay: Lệnh này, theo mặc định, bị vô hiệu hóa để cho phép các gói nhỏ chờ trong một khoảng thời gian xác định trước khi chúng được gửi cùng một lúc. Để cho phép tất cả dữ liệu được gửi cùng một lúc, lệnh này được bật.

tcp_nopush: Bởi vì chúng tôi đã kích hoạt chỉ thị tcp_nodelay, các gói nhỏ được gửi cùng một lúc. Tuy nhiên, nếu bạn vẫn muốn sử dụng thuật toán đệm John Nagle, chúng tôi cũng có thể kích hoạt tcp_nopush để thêm các gói với nhau và gửi tất cả chúng cùng một lúc.

Bộ đệm

Chúng ta hãy xem cách cấu hình bộ đệm yêu cầu trong Nginx để xử lý các yêu cầu một cách hiệu quả. Bộ đệm là bộ lưu trữ tạm thời, nơi dữ liệu được lưu giữ trong một thời gian và được xử lý.

Bạn có thể sao chép phần bên dưới trong phần máy chủ.

người phục vụ {

client_body_buffer_size 8k;
client_max_body_size 2m;
client_body_in_single_buffer trên;
client_body_temp_pathtemp_files 1 2;
client_header_buffer_size 1m;
lớn_client_header_buffers 4 8k;

}

Điều quan trọng là phải hiểu những gì các dòng đệm làm.

client_body_buffer_size: Lệnh này đặt kích thước bộ đệm cho thân yêu cầu. Nếu bạn dự định chạy máy chủ web trên hệ thống 64 bit, bạn cần đặt giá trị thành 16k. Nếu bạn muốn chạy máy chủ web trên hệ thống 32 bit, hãy đặt giá trị thành 8k.

client_max_body_size: Nếu bạn có ý định xử lý các tệp tải lên lớn, bạn cần đặt lệnh này ít nhất là 2m trở lên. Theo mặc định, nó được đặt thành 1m.

client_body_in_file_only: Nếu bạn đã vô hiệu hóa lệnh client_body_buffer_size với ký hiệu hashtag # và lệnh này client_body_in_file_only được đặt, Nginx sẽ lưu bộ đệm yêu cầu vào một tệp tạm thời. Điều này không được khuyến khích cho môi trường sản xuất.

client_body_in_single_buffer: Đôi khi không phải tất cả phần thân yêu cầu được lưu trữ trong bộ đệm. Phần còn lại của nó được lưu hoặc ghi vào một tập tin tạm thời. Tuy nhiên, nếu bạn có ý định lưu hoặc lưu trữ bộ đệm yêu cầu hoàn chỉnh trong một bộ đệm, bạn cần kích hoạt lệnh này.

client_header_buffer_size: Bạn có thể sử dụng lệnh này để đặt hoặc phân bổ bộ đệm cho các tiêu đề yêu cầu. Bạn có thể đặt giá trị này thành 1m.

Large_client_header_buffers: Lệnh này được sử dụng để đặt số lượng và kích thước tối đa để đọc các tiêu đề yêu cầu lớn. Bạn có thể đặt chính xác số lượng và kích thước bộ đệm thành 4 và 8k.

Nén

Nén lượng dữ liệu được truyền qua mạng là một cách khác để đảm bảo rằng máy chủ web của bạn hoạt động tốt hơn. Trong phần này, chúng tôi sẽ sử dụng các lệnh như gzip, gzip_comp_level và gzip_min_length để nén dữ liệu.

Dán đoạn mã sau vào phần http như hình dưới đây:

http {

gzip trên;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_types văn bản / xml văn bản / css;
gzip_http_version 1.1;
gzip_vary trên;
gzip_disable "MSIE [4-6] \.";

}

gzip: Nếu bạn muốn kích hoạt tính năng nén, hãy đặt giá trị của lệnh này thành bật. Theo mặc định, nó bị vô hiệu hóa.

gzip_comp_level: Bạn có thể sử dụng lệnh này để đặt mức nén. Để không lãng phí tài nguyên CPU, bạn không cần đặt mức nén quá cao. Từ 1 đến 9, bạn có thể đặt mức nén thành 2 hoặc 3.

gzip_min_length: Đặt độ dài phản hồi tối thiểu để nén thông qua trường tiêu đề phản hồi có độ dài nội dung. Bạn có thể đặt nó thành hơn 20 byte.

gzip_types: Lệnh này cho phép bạn chọn loại phản hồi bạn muốn nén. Theo mặc định, loại văn bản / html đáp ứng luôn được nén. Bạn có thể thêm loại phản hồi khác, chẳng hạn như văn bản / css như được hiển thị trong đoạn mã trên.

gzip_http_version: Lệnh này cho phép bạn chọn phiên bản HTTP tối thiểu của yêu cầu cho phản hồi được nén. Bạn có thể sử dụng giá trị mặc định là 1.1.

gzip_vary: Khi lệnh gzip được bật, lệnh này thêm trường tiêu đề Vary: Accept Encoding vào phản hồi.

gzip_disables: Một số trình duyệt như Internet Explorer 6 không hỗ trợ nén gzip. Lệnh này sử dụng trường tiêu đề yêu cầu Tác nhân người dùng để tắt tính năng nén cho một số trình duyệt nhất định.

Bộ nhớ đệm

Tận dụng các tính năng lưu trữ để giảm số lần tải cùng một dữ liệu nhiều lần. Nginx cung cấp các tính năng để lưu trữ siêu dữ liệu nội dung tĩnh thông qua chỉ thị open_file_cache.

Bạn có thể đặt lệnh này bên trong máy chủ, vị trí và phần http.

http {

open_file_cache max = 1.000 không hoạt động = 30 giây;
open_file_cache_valid 30s;
open_file_cache_min_uses 4;
open_file_cache_errors trên;

}

open_file_cache: Lệnh này bị tắt theo mặc định. Kích hoạt nó nếu bạn muốn triển khai bộ nhớ đệm trong Nginx. Lệnh này lưu trữ siêu dữ liệu của các tệp và thư mục thường được người dùng yêu cầu.

open_file_cache_valid: Lệnh này chứa thông tin sao lưu bên trong lệnh open_file_cache. Bạn có thể sử dụng lệnh này để đặt khoảng thời gian hợp lệ thường là trong vài giây sau đó thông tin liên quan đến tệp và thư mục được xác thực lại một lần nữa.

open_file_cache_min_uses: Nginx thường xóa thông tin bên trong chỉ thị open_file_cache sau một thời gian không hoạt động dựa trên open_file_cache_min_uses. Bạn có thể sử dụng chỉ thị này để đặt số lượng truy cập tối thiểu để xác định tệp và thư mục nào được truy cập tích cực.

open_file_cache_errors: Bạn có thể sử dụng lệnh này để cho phép Nginx khắc phục các lỗi bộ nhớ cache như quyền cho phép bị từ chối, hoặc có thể truy cập vào tập tin này khi các tệp được truy cập. Vì vậy, bất cứ khi nào một tài nguyên được truy cập bởi người dùng không có quyền làm như vậy, Nginx sẽ hiển thị cùng một báo cáo lỗi cho phép.

Hết giờ

Định cấu hình thời gian chờ bằng cách sử dụng các lệnh như keepalive_timeout và keepalive_Vquests để ngăn chặn các kết nối chờ đợi lâu làm lãng phí tài nguyên.

Trong phần HTTP, sao chép và dán mã sau đây:

http {

keepalive_timeout 30s;
keepalive_Vquests 30;
send_timeout 30s;

}

keepalive_timeout: Giữ kết nối sống trong khoảng 30 giây. Mặc định là 75 giây.

keepalive_Vquests: Định cấu hình một số yêu cầu để duy trì sự sống trong một khoảng thời gian cụ thể. Bạn có thể đặt số lượng yêu cầu thành 20 hoặc 30.

keepalive_disable: nếu bạn muốn tắt kết nối keepalive cho một nhóm trình duyệt cụ thể, hãy sử dụng lệnh này.

send_timeout: Đặt thời gian chờ để truyền dữ liệu đến máy khách.

Cấu hình bảo mật cho Nginx

Dưới đây chỉ tập trung vào cách định cấu hình Nginx an toàn thay vì ứng dụng web. Do đó, chúng tôi sẽ không xem xét các cuộc tấn công dựa trên web như SQL tiêm, v.v..

Trong phần này chúng ta sẽ xem xét cách cấu hình như sau:

  • Hạn chế quyền truy cập vào các tập tin và thư mục
  • Định cấu hình nhật ký để theo dõi các hoạt động độc hại
  • Ngăn chặn DDoS
  • Vô hiệu hóa danh sách thư mục

Hạn chế quyền truy cập vào các tập tin và thư mục

Hãy cùng xem xét cách hạn chế quyền truy cập vào các tệp và thư mục nhạy cảm thông qua các phương pháp sau.

Bằng cách sử dụng Xác thực HTTP

Chúng tôi có thể hạn chế quyền truy cập vào các tệp hoặc khu vực nhạy cảm không dành cho xem công khai bằng cách nhắc xác thực từ người dùng hoặc thậm chí quản trị viên. Chạy lệnh sau để cài đặt tiện ích tạo tệp mật khẩu nếu bạn chưa cài đặt nó.

apt-get install -y apache-utils

Tiếp theo, tạo một tệp mật khẩu và người dùng bằng công cụ htpasswd như bên dưới. Công cụ htpasswd được cung cấp bởi tiện ích apache2-utils.

sudo htpasswd -c / etc / apache2 / .htpasswd mike

Bạn có thể xác nhận nếu bạn đã tạo thành công một người dùng và mật khẩu ngẫu nhiên thông qua lệnh sau

mèo v.v / apache2 / .htpasswd

Trong phần vị trí, bạn có thể dán đoạn mã sau để nhắc người dùng xác thực bằng cách sử dụng lệnh auth_basic.

vị trí / quản trị viên {

cơ bản "Khu vực quản trị";
auth_basic_user_file / etc / apache2 / .htpasswd;

}

Bằng cách sử dụng lệnh Cho phép

Ngoài chỉ thị basic_auth, chúng tôi có thể sử dụng lệnh cho phép để hạn chế quyền truy cập.

Trong phần vị trí, bạn có thể sử dụng mã sau để cho phép các địa chỉ IP được chỉ định truy cập vào khu vực nhạy cảm.

vị trí / quản trị viên {
cho phép 192.168.34.12;
cho phép 192.168.12.34;
}

Định cấu hình nhật ký để theo dõi các hoạt động độc hại

Trong phần này, chúng tôi sẽ cấu hình lỗi và nhật ký truy cập để theo dõi cụ thể các yêu cầu hợp lệ và không hợp lệ. Bạn có thể kiểm tra các nhật ký này để tìm ra ai đã đăng nhập vào một thời điểm cụ thể hoặc người dùng nào đã truy cập vào một tệp cụ thể, v.v..

error_log: Cho phép bạn thiết lập đăng nhập vào một tệp cụ thể như syslog hoặc stderr. Bạn cũng có thể chỉ định mức độ thông báo lỗi bạn muốn đăng nhập.

access_log: Cho phép ghi yêu cầu người dùng vào tệp access.log

Trong phần HTTP, bạn có thể sử dụng như sau.

http {

access_log log / access.log kết hợp;
error_log log / warn.log cảnh báo;

}

Ngăn chặn DDOS

Bạn có thể bảo vệ Nginx khỏi một cuộc tấn công DDOS bằng các phương pháp sau:

Giới hạn người dùng yêu cầu 

Bạn có thể sử dụng các chỉ thị giới hạn numq_zone và giới hạn giới hạn để giới hạn tỷ lệ yêu cầu được gửi bởi người dùng trong vài phút.

Thêm mã sau vào phần vị trí được nhúng trong phần máy chủ.

giới hạn numq_zone $ binary_remote_addr area = one: 10m Rate = 30r / m;

người phục vụ {
vị trí /admin.html {
khu vực giới hạn = một;
}

}

Giới hạn số lượng kết nối 

Bạn có thể sử dụng các chỉ thị giới hạn_conn và giới hạn_conn_zone để giới hạn kết nối đến các vị trí hoặc khu vực nhất định. Chẳng hạn, mã dưới đây nhận được 15 kết nối từ khách hàng trong một khoảng thời gian cụ thể.

Đoạn mã sau sẽ đi đến phần vị trí.

giới hạn_conn_zone $ binary_remote_addr zone = addr: 10m;

người phục vụ {

vị trí / sản phẩm / {
giới hạn_conn addr 10;

}
}

Chấm dứt kết nối chậm   

Bạn có thể sử dụng các chỉ thị hết thời gian chờ như client_body_timeout và client_header_timeout để kiểm soát thời gian Nginx sẽ chờ để ghi từ thân máy khách và tiêu đề máy khách.

Thêm phần sau vào phần máy chủ.

người phục vụ {
client_body_timeout 5s;
client_header_timeout 5s;
}

Nó cũng là một ý tưởng tốt để ngăn chặn các cuộc tấn công DDoS ở rìa bằng cách tận dụng các giải pháp dựa trên đám mây như được đề cập ở đây.

Vô hiệu hóa danh sách thư mục

Bạn có thể sử dụng lệnh auto_index để ngăn danh sách thư mục như trong mã bên dưới. Bạn cần đặt nó thành giá trị tắt để tắt danh sách thư mục.

vị trí / {
tự động tắt;
}

Phần kết luận

Chúng tôi đã cấu hình máy chủ web Nginx để thực hiện hiệu quả và bảo mật nó khỏi sự lạm dụng quá mức trong môi trường sản xuất. Nếu bạn đang sử dụng Nginx cho các ứng dụng web truy cập Internet thì bạn cũng nên xem xét sử dụng CDN và bảo mật dựa trên đám mây để có hiệu suất và bảo mật tốt hơn.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map