Cách sử dụng module bản đồ của Nginx trên CentOS 7
Khi cấu hình server cho một trang web, có một số hành động có điều kiện phổ biến mà bạn có thể cần phải thực hiện. Ví dụ: có thể một số file nên được trình duyệt của user lưu vào bộ nhớ cache lâu hơn những file 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 password của user ), trong khi các phần khác của trang web thì không ' tMột ví dụ đơn giản, phổ biến khác là đảm bảo khi một trang web mới được xuất bản thay cho trang cũ, tất cả các địa chỉ cũ sẽ chuyển hướng đến đúng vị trí. Điều này rất hữu ích vì nó nghĩa là các liên kết và dấu trang cũ sẽ không ngừng hoạt động và nó cũng bảo tồn bộ nhớ đệm của Google.
Mô-đun bản đồ của Nginx cho phép bạn tạo các biến trong file cấu hình của Nginx có giá trị có điều kiện - nghĩa là chúng phụ thuộc vào giá trị của các biến khác. Trong hướng dẫn này, ta sẽ xem xét cách sử dụng module bản đồ của Nginx để triển khai hai ví dụ: cách cài đặt danh sách chuyển hướng từ URL trang web cũ sang URL mới và cách tạo danh sách trắng gồm các quốc gia để kiểm soát lưu lượng truy cập vào trang web .
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
Một server CentOS 7 được cài đặt với hướng dẫn cài đặt server ban đầu này , bao gồm một user không phải root có quyền sudo .
Nginx được cài đặt trên server của bạn theo hướng dẫn Cách cài đặt Nginx trên CentOS 7 .
Bước 1 - Tạo và kiểm tra một trang web mẫu
Đầu tiên, ta sẽ tạo một file thử nghiệm đại diện cho một trang web mới được xuất bản. Ta sẽ sử dụng file này để kiểm tra cấu hình của bạn .
Hãy tạo một trang đơn giản, index.html
, trong folder trang web Nginx mặc định. Tệp này sẽ chỉ có văn bản đơn giản mô tả những gì bên trong: Trang chủ.
- sudo sh -c 'echo "Home" > /usr/share/nginx/html/index.html'
Với file thử nghiệm này, tiếp theo, ta sẽ kiểm tra xem nó có được phân phát chính xác với curl
. Ta không cần chỉ định index.html
cho lệnh này vì file đó được cung cấp theo mặc định nếu không có tên file chính xác nào được cung cấp.
- curl http://localhost/
Đáp lại, bạn sẽ thấy một từ duy nhất nói rằng Home giống như bên dưới:
Home
Bây giờ ta hãy thử truy cập một file không tồn tại trong /usr/share/nginx/html
, như old.html
.
- curl -L http://localhost/old.html
Phản hồi sẽ là thông báo lỗi hệ thống, 404 Not Found , nghĩa là trang không tồn tại.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>The page is not found</title> . . . </html>
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 trang web thực đã từng tồn tại và đã bị xóa, việc trả về 404 nghĩa là tất cả các liên kết đến trang đó đều bị hỏng. Điều này kém lý tưởng hơn, vì những liên kết đó có thể đã được Google lập index , được in ra hoặc viết ra hoặc được chia sẻ bằng bất kỳ phương tiện nào khác.
Trong bước tiếp theo, ta sẽ sử dụng module bản đồ đảm bảo rằng địa chỉ cũ này sẽ hoạt động trở lại bằng cách tự động chuyển hướng người xem đến các địa chỉ thay thế mới.
Bước 2 - Cấu hình chuyển hướng
Đối với các trang web nhỏ chỉ có vài trang, câu lệnh điều kiện if
đơn giản được dùng để chuyển hướng và những thứ tương tự. Tuy nhiên, cấu hình như vậy không dễ duy trì hoặc mở rộng về lâu dài khi danh sách các điều kiện ngày càng dài ra.
Mô-đun bản đồ là một giải pháp ngắn gọn, thanh lịch hơn. Nó cho phép bạn so sánh các giá trị của biến Nginx với một danh sách các điều kiện, sau đó liên kết một giá trị mới với biến tùy thuộc vào kết quả khớp. Trong ví dụ này, ta sẽ so sánh URL được yêu cầu với danh sách các trang cũ mà ta muốn chuyển hướng đến các trang mới của chúng. Đối với mỗi địa chỉ cũ, ta sẽ liên kết địa chỉ mới.
Mô-đun bản đồ là một module Nginx cốt lõi, nghĩa là nó không cần phải được cài đặt riêng để được sử dụng. Để tạo bản đồ và cấu hình chuyển hướng cần thiết, hãy mở file cấu hình Nginx khối server mặc định trong vi
(đây là phần giới thiệu ngắn về vi
) hoặc editor yêu thích của bạn.
- sudo vi /etc/nginx/nginx.conf
Tìm đoạn cấu hình server
, trông giống như sau:
. . . server { listen 80 default_server; listen [::]:80 default_server; . . .
Ta sẽ thêm hai phần mới: một phần trước khối server
và một phần bên trong nó.
Phần trước khối server
là khối map
mới, xác định ánh xạ giữa các URL cũ và URL mới bằng cách sử dụng module bản đồ. Phần bên trong khối server
là chính chuyển hướng.
. . . # Old website redirect map # map $uri $new_uri { /old.html /index.html; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Old website redirect if ($new_uri) { rewrite ^ $new_uri permanent; } . . .
Chỉ thị map $uri $new_uri
lấy nội dung của biến hệ thống $uri
, chứa địa chỉ URL của trang được yêu cầu, sau đó so sánh nó với danh sách các điều kiện trong dấu ngoặc nhọn. Mỗi mục trong danh sách điều kiện có hai phần: giá trị để so khớp và giá trị mới để gán cho biến nếu nó khớp.
Dòng /old.html /index.html
bên trong khối map
nghĩa là nếu $uri
là /old.html
, thì $new_uri
sẽ được đổi thành /index.html
. Nếu nó không khớp, nó không được thay đổi. Ở đây, ta chỉ xác định một điều kiện, nhưng bạn có thể xác định bao nhiêu điều kiện tùy thích trong bản đồ.
Sau đó, sử dụng câu lệnh if
điều kiện bên trong khối server
, ta kiểm tra xem giá trị của biến $new_uri
có được đặt hay không. Nếu đúng như vậy, điều đó nghĩa là điều kiện trong bản đồ đã được thỏa mãn và ta nên chuyển hướng đến trang web mới bằng lệnh rewrite
. Từ khóa permanent
đảm bảo chuyển hướng sẽ là chuyển hướng HTTP 301 Moved Permanently , nghĩa là địa chỉ cũ không còn hợp lệ và sẽ không trực tuyến trở lại.
Lưu file để thoát.
Để kích hoạt cấu hình mới, hãy khởi động lại Nginx.
- sudo systemctl restart nginx
Để kiểm tra cấu hình mới, hãy thực hiện yêu cầu tương tự như trước:
- curl -L http://localhost/old.html
Lần này sẽ không có lỗi 404 Not Found trong kết quả . Thay vào đó, bạn sẽ thấy trang chủ đơn giản mà ta đã tạo ở Bước 1.
Home
Điều này nghĩa là bản đồ đã được cấu hình đúng cách và bạn có thể sử dụng nó để chuyển hướng các URL bằng cách thêm nhiều mục vào bản đồ.
Chuyển hướng URL là một ứng dụng hữu ích của module bản đồ. Một phương pháp khác, mà 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 trang web ở một số quốc gia nhất định
Đôi khi, server có thể nhận được quá nhiều 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 để ép password vào bảng quản trị trang web hoặc nỗ lực khai thác các lỗ hổng đã biết trong phần mềm để tấn công 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ừ nhiều server phân tán khác nhau ở nhiều quốc gia khác nhau nên rất khó chặn. Một giải pháp để giảm thiểu tác động của một cuộc tấn công như thế này là tạo 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 tình huống hạn chế 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 bị lỗi.
Lọc ở cấp server nhanh hơn lọc ở cấp trang web và cũng bao gồm tất cả các yêu cầu (bao gồm các file tĩnh, như hình ảnh). Loại lọc này cũng ngăn không cho các yêu cầu tiếp cận phần mềm trang web, điều này làm cho các lỗ hổng bảo mật khó bị khai thác hơn.
Để sử dụng tính năng lọc địa lý, trước tiên hãy tạo một file cấu hình mới.
- sudo vi /etc/nginx/conf.d/geoip.conf
Dán nội dung sau vào file . Điều này cho Nginx biết nơi tìm database GeoIP chứa ánh xạ giữa địa chỉ IP của khách truy cập và quốc gia tương ứng của họ. Database này được cài đặt sẵn với Ubuntu 16.04.
# GeoIP database path # geoip_country /usr/share/GeoIP/GeoIP.dat;
Bước tiếp theo là tạo bản đồ và cấu hình giới hạn cần thiết. Mở cấu hình Nginx khối server mặc định.
- sudo vi /etc/nginx/nginx.conf
Tìm đoạn cấu hình server
, sau khi sửa đổi ở bước 1 và 2, trông giống như sau:
. . . # Old website redirect map # map $uri $new_uri { /old.html /index.html; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Old website redirect if ($new_uri) { rewrite ^ $new_uri permanent; } . . .
Ta sẽ thêm hai phần mới: một phần trước khối server
và một phần bên trong nó.
Phần trước khối server
là khối map
mới, xác định hành động mặc định (không được phép truy cập) cũng như danh sách các mã quốc gia được phép truy cập trang web. Phần bên trong khối server
từ chối quyền truy cập vào trang web nếu kết quả map
cho biết như vậy.
. . . # 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 GeoIP if ($allowed_country = no) { return 444; } # Old website redirect if ($new_uri) { rewrite ^ $new_uri permanent; } . . .
Lưu file để thoát.
Ở đây, ta đã sử dụng country_code_1
và country_code_2
làm trình giữ chỗ. Thay thế các biến này bằng mã quốc gia hai ký tự cho quốc gia hoặc các quốc gia bạn muốn đưa vào danh sách trắng. Bạn có thể sử dụng danh sách đầy đủ, có thể tìm kiếm của ISO gồm tất cả các mã quốc gia để tìm. Ví dụ, hai mã ký tự cho USA là US
.
Không giống như ví dụ đầu tiên, trong khối map
này, biến $allowed_country
sẽ luôn được đặt thành một cái gì đó. Theo mặc định, nó được đặt thành no
; nếu biến $geoip_country_code
trùng với một trong các mã quốc gia trong khối, thì biến này được đặt thành yes
. Nếu biến $allowed_country
là no
, ta trả về kết nối 444 đã đóng mà không có phản hồi thay vì phân phát trang web thực.
Để kích hoạt cấu hình mới, hãy 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 sách trắng, khi bạn cố gắng truy cập http:// your_server_ip
, bạn sẽ thấy thông báo lỗi như Trang không hoạt động hoặc Trang không gửi bất kỳ dữ liệu nào . Nếu bạn thêm quốc gia của bạn vào danh sách trắng, bạn sẽ thấy Trang chủ 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 module bản đồ, nhưng nó cho thấy cơ chế được dùng theo nhiều cách khác nhau. Mô-đun bản đồ không chỉ cho phép các phép so sánh đơn giản mà còn hỗ trợ các cụm từ thông dụng cho phép các phép so sánh phức tạp hơn. Đó là một cách tốt để làm cho file cấu hình sạch hơn nếu phải đánh giá nhiều điều kiện.
Một trường hợp sử dụng rất phổ biến khác cho module bản đồ là chuyển hướng có điều kiện cho các phần an toàn của trang web trong môi trường không phải SSL. Cài đặt 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ập password là một ví dụ hay về cách áp dụng module bản đồ trong kịch bản thế giới thực và tôi khuyến khích thử nghiệm với cài đặt như vậy.
Thông tin chi tiết hơn có thể được tìm thấy trong tài liệu module bản đồ chính thức của Nginx .
Các tin liên quan
Cách cài đặt và cấu hình ownCloud trên CentOS 72016-10-31
Cách triển khai bộ đệm trình duyệt với module tiêu đề của Nginx trên CentOS 7
2016-10-31
Cách cài đặt Go 1.7 trên CentOS 7
2016-10-31
Cách cài đặt và cấu hình Sphinx trên CentOS 7
2016-09-20
Cách cài đặt MEAN Stack với MEAN.JS trên CentOS 7
2016-09-09
Cách tạo người dùng Sudo trên CentOS [Quickstart]
2016-03-29
Cách cài đặt Graylog 1.x trên CentOS 7
2016-03-21
Cách cài đặt Puppet 4 trong Thiết lập Master-Agent trên CentOS 7
2016-03-08
Cách thiết lập Jenkins để tích hợp phát triển liên tục trên CentOS 7
2016-03-03
Cách thiết lập hệ thống bàn trợ giúp với OTRS trên CentOS 7
2016-03-02