Cách sử dụng map Module của Nginx trên Ubuntu 16.04

5 năm trước

 

Giới Thiệu 

Khi định cấu hình máy chủ cho trang web, có một số hành động có điều kiện thông thường mà bạn có thể cần phải triển khai. Ví dụ: có thể một số tệp nên được lưu trong trình duyệt của người dùng lâu hơn các trình duyệt khác hoặc một số phần của trang web chỉ được phép thông qua kết nối an toàn (như bất kỳ thứ gì yêu cầu mật khẩu của người dùng),trong khi các phần khác của trang web thì không.

Một ví dụ đơn giản, phổ biến khác là đảm bảo rằng khi một trang web mới được xuất bản thay cho một trang web cũ, tất cả các địa chỉ cũ sẽ chuyển hướng đến các địa điểm chính xác. Điều này rất hữu ích vì các liên kết và dấu trang cũ sẽ không ngừng hoạt động và cũng bảo toàn bộ nhớ đệm của Google.

Map Module của Nginx cho phép bạn tạo các biến trong tập tin cấu hình của Nginx các giá trị của chúng có điều kiện - nghĩa là chúng phụ thuộc vào các giá trị của các biến khác. Trong hướng dẫn này, chúng tôi sẽ giới thiệu cách sử dụng Map Module của Nginx để thực hiện hai ví dụ: cách thiết lập danh sách chuyển hướng từ URL trang web cũ sang trang web mới và cách tạo danh sách trắng các quốc gia để kiểm soát lưu lượng truy cập đến trang web của bạn.

 

Yêu Cầu 

Để làm theo hướng dẫn này , bạn cần :

 

Bước 1 - Tạo và thử nghiệm một trang web ví dụ

Đầu tiên, chúng ta sẽ tạo một tệp thử nghiệm đại diện cho một trang web mới được xuất bản. Chúng ta sẽ sử dụng tệp này để kiểm tra cấu hình của chúng ta.

Hãy tạo ra một trang đơn giản, index.html,trong thư mục trang web Nginx mặc định. Tệp này sẽ chỉ có văn bản thuần túy mô tả nội dung bên trong: Trang chủ.

sudo sh -c 'echo "Home" > /var/www/html/index.html'

Với tập tin thử nghiệm này , tiếp theo chúng ta sẽ kiểm tra xem nó đang được phục vụ đúng vớicurl. Chúng ta không cần phải chỉ định index.html cho lệnh này vì tập tin đó được phục vụ theo mặc định nếu không có tên tập tin chính xác được cung cấp.

curl http://localhost/

Đáp lại, bạn sẽ thấy một từ duy nhất nói về Home giống như dưới đây:

Nginx response
Home

Bây giờ, hãy thử truy cập một tệp không tồn tại trong /var/www/html/, như old.html.

curl -L http://localhost/old.html
  •  

Phản hồi sẽ là một thông báo lỗi hệ thống, 404 Not Found, nghĩa là trang không tồn tại.

Nginx response
 

404 Not Found


nginx/1.10.0 (Ubuntu)

Chúng ta chỉ đang sử dụng một trang web giả trong hướng dẫn này, nhưng nếu old.html là một trang trên một website thực sự từng tồn tại và đã bị xóa, quay lại 404 có nghĩa là tất cả liên kết đến trang đó bị hỏng. Điều này không lí tưởng lắm, bởi vì các liên kết này có thể đã được lập chỉ mục bởi Google, được in ra hoặc viết xuống hoặc chia sẻ bằng bất kỳ phương tiện nào khác.

Trong bước tiếp theo, chúng ta sẽ sử dụng mô-đun bản đồ để đảm bảo rằng địa chỉ cũ này sẽ hoạt động trở lại bằng cách chuyển hướng người xem đến các thay thế mới một cách tự động.

Bước 2 - Định cấu hình chuyển hướng

Đối với các website nhỏ chỉ với một vài trang, đơn giản  các câu lệnh có điều kiện if có thể được sử dụng cho các chuyển hướng và những thứ tương tự. Tuy nhiên, cấu hình như vậy không phải là dễ dàng để duy trì hoặc mở rộng trong thời gian dài vì danh sách các điều kiện phát triển lâu hơn.

Các map Module là một giải pháp đẹp mắt, súc tích. Nó cho phép bạn so sánh các giá trị biến Nginx với một danh sách các điều kiện, và sau đó kết hợp một giá trị mới với biến tùy thuộc vào kết quả phù hợp. Trong ví dụ này, chúng ta sẽ so sánh URL được yêu cầu với danh sách các trang cũ mà chúng ta muốn chuyển hướng đến các đối tác mới của chúng. Đối với mỗi địa chỉ cũ, chúng ta sẽ kết hợp một địa chỉ mới.

Map Module là một mô-đun Nginx cốt lõi, có nghĩa là nó không cần phải được cài đặt riêng để sử dụng. Để tạo map và cấu hình chuyển hướng cần thiết, hãy mở máy chủ mặc định để chặn tệp cấu hình Nginx trong nano hoặc trình chỉnh sửa văn bản yêu thích của bạn.

sudo nano /etc/nginx/sites-available/default

Tìm khối cấu hình  server  mà nhìn như sau:

/etc/nginx/sites-available/default
. . .
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
. . .

Chúng ta sẽ thêm hai phần mới: một phần trước khốiserver và một phần trong nó.

Phần trước khối server là một khối map mới, mà định nghĩa việc lập bản đồ giữa các URL cũ và URL mới sử dụng mô-đun bản đồ. Phần bên trong khối server là sự tự chuyển hướng.

 

Modified /etc/nginx/sites-available/default
. . .
# Default server configuration
## Old website redirect map#map $uri $new_uri {/old.html /index.html;}server {
listen 80 default_server;
listen [::]:80 default_server;
# Old website redirectif ($new_uri) {rewrite ^ $new_uri permanent;}. . .

Chỉ thị map $uri $new_uri  lấy nội dung của hệ thống biến $uri , chứa địa chỉ URL của trang được yêu cầu và sau đó so sánh nó với danh sách các điều kiện trong dấu ngoặc . Mỗi mục trong danh sách điều kiện có hai phần: giá trị khớp với và giá trị mới để gán cho biến nếu nó phù hợp.

Dòng /old.html /index.html trong khối map nghĩa là nếu  giá trị của $urilà /old.html$new_uri sẽ được thay đổi thành /index.html. Nếu không phù hợp, nó không thay đổi. Ở đây, chúng ta chỉ xác định một điều kiện, nhưng bạn có thể định rõ  nhiều điều kiện như bạn muốn trong bản đồ.

Sau đó , sử dụng lệnh có điều kiện if trong khối server , kiểm tra xem giá trị của biến $new_uri được cài đặt chưa . Nếu có, nó có nghĩa là điều kiện trên map đã được thỏa mãn, và chúng ta nên chuyển hướng đến trang web mới bằng cách sử dụng lệnh rewrite . Từ khóa permanent  đảm bảo rằng chuyển hướng sẽ là 301 Moved Permanently HTTP, có nghĩa là địa chỉ cũ không còn giá trị và sẽ không trở lại trực tuyến.

Lưu và đóng file để thoát .

Kích hoạt cấu hình mới , khởi động lại  Nginx..

sudo systemctl restart nginx

Để kiểm tra cấu hình mới , thực hiện cùng một yêu cầu như trước:

curl -L http://localhost/old.html

Lần này sẽ không có lỗi  404 Not Found nào trong đầu ra .Thay vào đó , bạn sẽ thấy trang chủ đơn giản mà chúng ta đã tạo ra ở Bước 1.

Nginx response
Home

Điều này có nghĩa là bản đồ đã được định cấu hình đúng cách và bạn có thể sử dụng nó để chuyển hướng URL bằng cách thêm các mục nhập khác vào map..

Chuyển hướng URL là một ứng dụng hữu ích của map Module. Một điều khác, chúng ta sẽ khám phá trong bước tiếp theo, là lọc lưu lượng truy cập dựa trên vị trí địa lý của khách truy cập.

Bước 3 - Hạn chế quyền truy cập vào một số nước nhất định

Đôi khi, một máy chủ có thể nhận được một số lượng quá lớn các yêu cầu tự động, độc hại. Đây có thể là một cuộc tấn công DDoS, một nỗ lực để lấy mật mã brute-force cho các bảng quản trị trang web hoặc một nỗ lực để khai thác các lỗ hổng được biết đến trong phần mềm tấn công vào trang web và sử dụng nó để gửi spam hoặc sửa đổi nội dung trang web.

Các cuộc tấn công tự động như vậy có thể đến từ rất nhiều máy chủ phân tán khác nhau ở nhiều quốc gia khác nhau, vì vậy khó để chặn. Một giải pháp để giảm nhẹ tác động của cuộc tấn công như thế này là tạo ra một danh sách trắng các quốc gia có thể truy cập trang web.

Nó không phải là một giải pháp hoàn hảo, nhưng trong những trường hợp giới hạn truy cập vào trang web dựa trên vị trí địa lý của khách truy cập là một lựa chọn hợp lý và không giới hạn đối tượng cho trang web, giải pháp này có lợi ích là nhanh và ít lỗi dễ bị.

Lọc ở cấp máy chủ nhanh hơn lọc ở cấp trang web và cũng bao gồm tất cả yêu cầu (bao gồm tệp tĩnh, như hình ảnh). Loại lọc này cũng ngăn các yêu cầu truy cập vào phần mềm trang web, điều này làm cho lỗ hổng khó khai thác hơn.

Để sử dụng bộ lọc địa lý, hãy tạo một tệp cấu hình mới.

sudo nano /etc/nginx/conf.d/geoip.conf

Dán các nội dung sau vào tệp . Điều này nói với Nginx nơi tìm cơ sở dữ liệu GeoIP chứa các ánh xạ giữa các địa chỉ IP của khách truy cập và các quốc gia tương ứng. Cơ sở dữ liệu này được cài đặt sẵn với Ubuntu 16.04.

/etc/nginx/conf.d/geoip.conf
. . .
# GeoIP database path
#
geoip_country /usr/share/GeoIP/GeoIP.dat;

Bước tiếp theo là tạo cấu hình bản đồ và hạn chế cần thiết. Mở máy chủ mặc định cấu hình Ngnix.

sudo nano /etc/nginx/sites-available/default

Tìm khối cấu hình server , sau khi sửa đổi Bước 1 và 2,trông như thế này:

/etc/nginx/sites-available/default
. . .
# Default server configuration
#
# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}server {
listen 80 default_server;
listen [::]:80 default_server;
# Old website redirect
if ($new_uri){rewrite ^ $new_uri permanent;
}. . .

Chúng ta sẽ thêm hai phần mới: một phần trước khối server và một phần trong nó.

Phần trước khối server là một khối map mới, xác định hành động mặc định (quyền truy cập không được phép) cũng như danh sách mã quốc gia được cho phép truy cập vào trang web. Phần bên trong khối server sẽ từ chối truy cập trang web nếu kết quả map cho biết.

Modified /etc/nginx/sites-available/default
. . .
# Default server configuration
## Allowed countries#map $geoip_country_code $allowed_country {default no;country_code_1 yes;country_code_2 yes;}# Old website redirect map
#
map $uri $new_uri {
/old.html /index.html;
}server {
listen 80 default_server;
listen [::]:80 default_server;
# Disallow access based on GeoIPif ($allowed_country = no) {return 444;} # Old website redirect
if ($new_uri){rewrite ^ $new_uri permanent;
}. . .

Lưu và đóng file để thoát.

Đây, hãy sử dụng  country_code_1 và country_code_2 như là các phần giữ chỗ. Thay thế các biến này bằng mã quốc gia gồm hai ký tự cho đất nước hoặc quốc gia bạn muốn để liệt vào danh sách trắng. Ví dụ: mã hai ký tự cho Hoa Kỳ là US.

Không giống như ví dụ đầu tiên, trong khối map , biến $allowed_country  sẽ  luôn được thiết lập một cái gì đó. Theo mặc định, nó được thiết lập  no; nếu biến $geoip_country_code  phù hợp với một trong số mã quốc gia trong khối, nó được đặt thành yes. Nếu biến $allowed_country là no, chúng ta quay lại  444 Connection Closed Without Response thay vì phục vụ trang web thực tế.

Kích hoạt cấu hình mới , khởi động lại Nginx.

sudo systemctl restart nginx

Nếu bạn không thêm quốc gia của bạn vào danh saschtrawsng , khi bạn cố gawsg truy cập http://your_server_ip, bạn sẽ thấy thông báo lỗi The page isn’t working hoặc The page didn’t send any data. Nếu bạn thêm quốc gia của mình vào danh sách trắng , bạn sẽ thấy Home như trước đây.

 

Kết luận

Mặc dù đây có thể là một ví dụ rất đơn giản về cách sử dụng map Modul nhưng nó cho thấy cơ chế có thể được sử dụng theo nhiều cách khác nhau. Map Module không chỉ cho phép so sánh đơn giản mà còn hỗ trợ biểu thức thông thường cho phép các kết hợp phức tạp hơn. Đó là một cách tuyệt vời để làm cho các tập tin cấu hình sạch hơn nếu nhiều điều kiện phải được đánh giá.

Một trường hợp sử dụng phổ biến khác cho map Module là các chuyển hướng có điều kiện cho các phần an toàn của trang web trong một môi trường khác không phải SSL. Thiết lập kết nối SSL bắt buộc chỉ dành cho các biểu mẫu yêu cầu, ví dụ như nhập mật khẩu là một ví dụ điển hình về cách áp dụng mô-đun bản đồ trong kịch bản thực và tôi khuyến khích thử nghiệm với thiết lập như vậy.

Tìm hiểu thêm những điều thú vị  tại ViCloud Community