18/09/2018, 16:44

Làm thế nào để sử dụng bản đồ của Nginx Module trên CentOS 7

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 phổ biến 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 ...

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 phổ biến 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 don ' t.

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ì nó có 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 toà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 tệp cấu hình Nginx có các giá trị 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ẽ xem xét cách sử dụng mô-đun bản đồ 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 URL mới và cách tạo danh sách trắng của các quốc gia để kiểm soát lưu lượng truy cập vào trang web của bạn.

Điều kiện tiên quyết

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

  • Một máy chủ CentOS 7 được thiết lập với hướng dẫn thiết lập máy chủ ban đầu này, bao gồm người dùng không phải root sudo.

  • Nginx được cài đặt trên máy chủ của bạn bằng cách làm theo Làm thế nào để cài đặt Nginx trên CentOS 7 hướng dẫn.

Bước 1 - Tạo và kiểm tra trang web ví dụ

Đầu tiên, chúng tôi 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 tôi sẽ sử dụng tệp này để kiểm tra cấu hình của chúng tôi.

Hãy tạo 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" > /usr/share/nginx/html/index.html'

Với tệp thử nghiệm này tại chỗ, tiếp theo, chúng tôi sẽ kiểm tra xem tệp có đang được phân phối chính xác không curl. Chúng tôi không cần phải chỉ định index.html cho lệnh này vì tệp đó được phân phối theo mặc định nếu không có tên tệp 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 Nhà 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 /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 không tìm thấy, nghĩa là trang không tồn tại.

Nginx response

<!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>

Chúng tôi chỉ 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 sự đã từng tồn tại và đã bị xóa, trả lại 404 có nghĩa là tất cả các liên kết đến trang đó đều bị hỏng. Điều này ít hơn lý tưởng, bởi vì các liên kết đó có thể đã được lập chỉ mục bởi Google, được in ra hoặc viết ra hoặc được chia sẻ bởi bất kỳ phương tiện nào khác.

Trong bước tiếp theo, chúng tôi 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 - Cấu hình chuyển hướng

Đối với các trang web nhỏ chỉ với một vài trang, đơn giản if các câu lệnh có điều kiện 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.

Mô-đun bản đồ là 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ị 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 tôi sẽ so sánh URL được yêu cầu với danh sách các trang cũ mà chúng tôi 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 tôi sẽ liên kết địa chỉ mới.

Mô-đun bản đồ 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 cấu hình bản đồ và chuyển hướng cần thiết, hãy mở tệp cấu hình Nginx của máy chủ mặc định trong vi (đây là một giới thiệu ngắn về vi) hoặc trình soạn thảo văn bản yêu thích của bạn.

sudo vi /etc/nginx/nginx.conf

Tìm server khối cấu hình, trông giống như sau:

/etc/nginx/nginx.conf

. . .

server {
    listen 80 default_server;
    listen [::]:80 default_server;

. . .

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

Phần trước server khối mới map khối, xác định ánh xạ giữa các URL cũ và URL mới sử dụng mô-đun bản đồ. Phần bên trong server khối là chính chuyển hướng.

Modified /etc/nginx/nginx.conf

. . .

# 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;
    }
. . .

Các map $uri $new_uri chỉ thị có nội dung của hệ thống $uri biến, 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 nhọn. 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 bên trong map khối nghĩa là nếu $urigiá trị của là /old.html, $new_uri sẽ được thay đổi thành /index.html. Nếu nó không khớp, nó không thay đổi. Ở đây, chúng tôi 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 như bạn muốn trong bản đồ.

Sau đó, sử dụng điều kiện if tuyên bố bên trong server chặn, chúng tôi kiểm tra xem $new_uri giá trị của biến được đặt. Nếu có, điều đó có nghĩa là điều kiện trên bản đồ đã được thỏa mãn và chúng tôi nên chuyển hướng đến trang web mới bằng cách sử dụng rewrite chỉ huy. Các permanent từ khóa đảm bảo rằng chuyển hướng sẽ là 301 đã chuyển vĩnh viễn Chuyển hướng HTTP, có 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 và đóng tệp để 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, hãy 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ó 404 không tìm thấy lỗi trong đầu ra. Thay vào đó, bạn sẽ thấy trang chủ đơn giản mà chúng tôi đã tạo ở 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 bản đồ.

Chuyển hướng URL là một ứng dụng hữu ích của mô-đun bản đồ. Một thứ khác mà chúng tôi 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 vào một số quốc gia nhất định

Đôi khi, máy chủ 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 đe dọa mật khẩu cho các bảng quản trị trang web hoặc cố gắng 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 máy chủ phân tán khác nhau ở nhiều quốc gia khác nhau, khiến việc chặn khó khăn. Một giải pháp để giảm thiểu ảnh hưởng của 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.

Đây không phải là giải pháp hoàn hảo, nhưng trong những trường hợp 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 hơn.

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 tính năng lọc địa lý, trước tiên hãy tạo một tệp cấu hình mới.

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

Dán các nội dung sau vào tệp. Điều này cho Nginx biết nơi tìm cơ sở dữ liệu GeoIP chứa á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ủa họ. 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 bản đồ và cấu hình hạn chế cần thiết. Mở cấu hình Nginx chặn máy chủ mặc định.

sudo vi /etc/nginx/nginx.conf

Tìm server khối cấu hình, sau khi sửa đổi ở bước 1 và 2, trông giống như sau:

/etc/nginx/sites-available/default

. . .

# 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úng tôi sẽ thêm hai phần mới: một phần trước server khối và một bên trong nó.

Phần trước server khối mới map khố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 phép truy cập trang web. Phần bên trong server khối từ chối truy cập vào trang web nếu map kết quả nói như vậy.

Modified /etc/nginx/sites-available/default

. . .

# 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 và đóng tệp để thoát.

Ở đây, chúng tôi đã sử dụng country_code_1 và country_code_2 như trình giữ chỗ. Thay thế các biến này bằng mã quốc gia gồm hai ký tự cho quốc gia hoặc quốc gia bạn muốn đưa vào danh sách cho phép. Bạn có thể dùng danh sách đầy đủ, có thể tìm kiếm của tất cả các mã quốc gia của ISO để tìm. Ví dụ: mã hai ký tự cho Hoa Kỳ là US.

Không giống như ví dụ đầu tiên, trong này map khối, $allowed_country biến sẽ luôn được đặt thành thứ gì đó. Theo mặc định, nó được đặt thành no; nếu $geoip_country_code biến phù hợp với một trong các mã quốc gia trong khối, nó được đặt thành yes. Nếu $allowed_country biến là no, chúng tôi trở lại Kết nối 444 không có phản hồi 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 mình vào danh sách cho phép, khi bạn cố 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 là Trang không gửi bất kỳ dữ liệu nào. Nếu bạn thêm quốc gia của mình vào danh sách cho phép, bạn sẽ thấy Nhà như trước.

Phần kết luận

Mặc dù nó có thể là một ví dụ rất đơn giản về cách sử dụng mô-đun bản đồ, nó cho thấy cơ chế có thể được sử dụng theo nhiều cách khác nhau. Mô-đun bản đồ không chỉ cho 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 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 rất phổ biến khác cho mô-đun bản đồ là chuyển hướng có điều kiện cho các phần bảo mật của trang web trong môi trường không phải SSL. Thiết lập kết nối SSL bắt buộc chỉ cho các biểu mẫu yêu cầu, ví dụ: nhập mật khẩu là một ví dụ hay về cách áp dụng mô-đun bản đồ trong kịch bản thế giới thực và tôi khuyến khích thử nghiệm với thiết lập đó.

Thông tin chi tiết hơn có thể được tìm thấy trong tài liệu mô-đun bản đồ chính thức của Nginx.

0