Trang chủ / Chuyên đề / Cài đặt Nginx Server Blocks (Virtual Hosts) trên Ubuntu 16.04
Thứ năm, 19/05/2016 | 00:00 GMT+7

Cài đặt Nginx Server Blocks (Virtual Hosts) trên Ubuntu 16.04

Khi sử dụng web server Nginx, các server block (tương tự như VirtualHost trong Apache) được dùng để đóng gói chi tiết cấu hình và lưu trữ nhiều hơn một domain trên một server duy nhất. Trong hướng dẫn này, ta sẽ thảo luận về cách cấu hình server block trong Nginx trên server Ubuntu 16.04.

Yêu cầu

Ta sẽ sử dụng một user không phải root với các quyền sudo trong suốt hướng dẫn này. Nếu bạn không có user như thế được cấu hình, bạn có thể tạo một user theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 .

Bạn cũng cần phải cài đặt Nginx trên server. Các hướng dẫn gợi ý:

Khi bạn đã đáp ứng các yêu cầu này, bạn có thể tiếp tục với hướng dẫn này.

Cấu hình mẫu

Với mục đích demo, ta sẽ cài đặt hai domain với server Nginx . Các domain ta sẽ sử dụng trong hướng dẫn này là example.comtest.com .

Bước một: Cài đặt folder root document mới

Theo mặc định, Nginx trên Ubuntu 16.04 có một server block được bật theo mặc định. Nó được cấu hình để cung web truy cập vào /var/www/html .

Mặc dù điều này hoạt động tốt cho một trang web, nhưng ta cần các folder bổ sung nếu ta sẽ chạy nhiều trang web. Ta có thể coi folder /var/www/html folder mặc định sẽ được chạy nếu yêu cầu của client không trùng với bất kỳ trang web nào.

Ta sẽ tạo cấu trúc folder bên trong /var/www cho mỗi trang web . Nội dung web sẽ được đặt trong một folder html trong các folder cụ thể của trang web này. Điều này cho ta một số linh hoạt bổ sung để tạo các folder khác được liên kết với các trang web.

Ta cần tạo các folder này cho mỗi trang web:

  • sudo mkdir -p /var/www/example.com/html
  • sudo mkdir -p /var/www/test.com/html

Bây giờ ta đã có các folder, ta sẽ chỉ định lại quyền sở hữu các folder web cho account user thường . Điều này sẽ cho phép ta ghi vào mà không cần sudo .

 

Ghi chú
Tùy thuộc vào nhu cầu của bạn, bạn có thể cần phải điều chỉnh lại quyền của các folder để cho phép user www-data truy cập. Ví dụ, các trang web động thường cần điều này. Các quyền cụ thể và yêu cầu quyền sở hữu hoàn toàn phụ thuộc vào cấu hình của bạn.

Ta có thể sử dụng biến môi trường $USER để chỉ định quyền sở hữu cho account mà ta hiện đang đăng nhập (đảm bảo bạn không đăng nhập bằng quyền root ). Điều này sẽ cho phép ta dễ dàng tạo hoặc chỉnh sửa nội dung trong folder này:

  • sudo chown -R $USER:$USER /var/www/example.com/html
  • sudo chown -R $USER:$USER /var/www/test.com/html

Các quyền của root web phải chính xác, ta có thể đảm bảo bằng lệnh:

  • sudo chmod -R 755 /var/www

Cấu trúc folder hiện đã được cấu hình và ta có thể tiếp tục.

Bước hai: Tạo các trang mẫu cho mỗi trang web

Bây giờ ta đã cài đặt cấu trúc folder, hãy tạo một trang mặc định cho mỗi trang web để ta có một cái gì đó để hiển thị.

Tạo index.html trong domain đầu tiên của bạn:

  • nano /var/www/example.com/html/index.html

Bên trong file, ta sẽ tạo một file cơ bản cho biết ta hiện đang truy cập trang web nào. Nó sẽ trông giống thế này:

/var/www/example.com/html/index.html
<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success!  The example.com server block is working!</h1>
    </body>
</html>

Lưu file khi bạn hoàn tất.

Vì file cho trang web thứ hai về cơ bản sẽ giống nhau, ta có thể sao chép nó vào root document thứ hai như sau:

  • cp /var/www/example.com/html/index.html /var/www/test.com/html/

Bây giờ, ta có thể mở file mới trong trình chỉnh sửa:

  • nano /var/www/test.com/html/index.html

Sửa đổi nó để nó tham chiếu đến domain thứ hai :

/var/www/test.com/html/index.html
<html>
    <head>
        <title>Welcome to Test.com!</title>
    </head>
    <body>
        <h1>Success!  The test.com server block is working!</h1>
    </body>
</html>

Lưu file này khi bạn hoàn tất. Bây giờ ta có một số trang để hiển thị cho khách truy cập của hai domain .

Bước 3: Tạo file server block cho mỗi domain

Bây giờ ta đã có nội dung muốn chạy, ta cần tạo các server block để cho Nginx biết cách thực hiện việc này.

Theo mặc định, Nginx chứa một server block được gọi là default mà ta có thể sử dụng làm mẫu cho các cấu hình của riêng mình. Ta sẽ bắt đầu bằng cách thiết kế server block của domain đầu tiên, sau đó ta sẽ sao chép lại cho domain thứ hai và thực hiện các sửa đổi cần thiết.

Tạo file server block đầu tiên

Như đã đề cập ở trên, ta sẽ tạo file cấu hình server block đầu tiên  bằng cách sao chép file mặc định:

  • sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Bây giờ, hãy mở file mới bạn đã tạo trong editor với các quyền sudo :

  • sudo nano /etc/nginx/sites-available/example.com

Bỏ qua các dòng comment, file sẽ trông giống như sau:

/etc/nginx/sites-available/example.com
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

Đầu tiên, ta cần xem xét các chỉ thị lắng nghe cổng (listent). Chỉ một trong các server block trên server có thể bật tùy chọn default_server . Điều này chỉ định khối nào sẽ phân phát một yêu cầu nếu server_name được yêu cầu không trùng với bất kỳ server block có sẵn nào (có thể là truy cập qua IP). Điều này không thường xuyên xảy ra thực tế vì khách sẽ truy cập web thông qua domain của bạn, chứ ko truy cập ip của server.

Ta sẽ xóa default_server các khối khác với khối mặc định ở trên.

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        . . .
}
Ghi chú

Bạn có thể kiểm tra xem tùy chọn default_server chỉ được bật trong một file hoạt động duy nhất hay không bằng lệnh:

  • grep -R default_server /etc/nginx/sites-enabled/

Nginx báo cáo nếu có cấu hình không hợp lệ.

Điều tiếp theo ta sẽ phải điều chỉnh là root document, được chỉ định bởi chỉ thị root . Trỏ nó vào root document của trang web mà bạn đã tạo:

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html;

}

Tiếp theo, ta cần sửa đổi server_name phù hợp với các yêu cầu cho domain đầu tiên . Ngoài ra, ta có thể thêm bất kỳ alias (bí-danh) nào mà ta muốn khớp. Ta sẽ thêm alias (bí-danh) www.example.com .

Khi bạn hoàn tất, file sẽ trông giống như sau:

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Đó là tất cả những gì ta cần cho một cấu hình cơ bản. Lưu file để thoát.

Tạo file server block thứ hai

Bây giờ ta đã có cấu hình server block ban đầu, ta có thể sử dụng cấu hình đó làm cơ sở cho file thứ hai của bạn. Sao chép nó để tạo một file mới:

  • sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

Mở file mới với các quyền sudo trong editor:

  • sudo nano /etc/nginx/sites-available/test.com

Hãy đảm bảo bạn không sử dụng tùy chọn default_server cho chỉ thị listen trong file này nếu bạn đã sử dụng nó ở nơi khác. Điều chỉnh chỉ thị root để trỏ đến root document của domain thứ hai của bạn và điều chỉnh server_name để trùng với domain của trang web thứ hai của bạn (đảm bảo bao gồm mọi alias (bí-danh)).

Khi bạn hoàn tất, file có thể sẽ trông giống như sau:

/etc/nginx/sites-available/test.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/test.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name test.com www.test.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

Khi bạn hoàn tất, hãy lưu file.

Bước 4: Bật server block của bạn và khởi động lại Nginx

Bây giờ ta đã có các file server block, ta cần kích hoạt chúng. Ta có thể làm điều này bằng cách tạo các liên kết mềm (softlink) từ các file này đến folder sites-enabled , mà Nginx đọc từ đó trong khi khởi động.

Ta có thể tạo các liên kết này bằng lệnh:

  • sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  • sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

Các file này hiện nằm trong folder được kích hoạt. Bây giờ ta có ba server block kích hoạt, mà được cấu hình để đáp ứng dựa trên thông tin listen  và server_name (bạn có thể đọc thêm về cách xử lý Nginx các chỉ thị ở đây ):

  • example.com : Sẽ phản hồi các yêu cầu cho example.comwww.example.com
  • test.com : Sẽ phản hồi các yêu cầu cho test.comwww.test.com
  • default : Sẽ phản hồi bất kỳ yêu cầu nào trên cổng 80 không trùng với hai khối còn lại.

Để tránh sự cố thường gặp khi thêm tên server bổ sung, ta sẽ điều chỉnh một giá trị trong file /etc/nginx/nginx.conf :

  • sudo nano /etc/nginx/nginx.conf

Trong file, hãy tìm chỉ thị server_names_hash_bucket_size . Xóa ký hiệu # để bỏ ghi chú :

/etc/nginx/nginx.conf
http {
    . . .

    server_names_hash_bucket_size 64;

    . . .
}

Lưu file khi bạn hoàn tất.

Tiếp theo, hãy kiểm tra đảm bảo không có lỗi cú pháp nào trong  file Nginx nào của bạn:

  • sudo nginx -t

Nếu không tìm thấy sự cố nào, hãy khởi động lại Nginx để kích hoạt các thay đổi:

  • sudo systemctl restart nginx

Nginx bây giờ sẽ đáp ứng truy cập vào cả hai domain của bạn.

Bước năm: Sửa đổi file host server local của bạn để kiểm tra (Tùy chọn)

Nếu bạn không sở hữu domain thật (như test.com, example.com ở trên) mà vẫn muốn kiểm tra hoạt động cấu hình trên, thì bạn có thể sửa đổi cấu hình máy tính local của bạn để trỏ domain đó về server nginx của bạn.

Ghi chú
Đảm bảo bạn đang hoạt động trên máy tính local của bạn trong các bước này chứ không phải server VPS. Bạn cần có quyền truy cập root để có thể chỉnh sửa file hệ thống để thực hiện việc này.

Nếu bạn đang sử dụng máy tính Mac hoặc Linux ở nhà, bạn có thể chỉnh sửa file bằng lệnh:

  • sudo nano /etc/hosts

Nếu bạn đang sử dụng Windows, bạn có thể tìm thấy hướng dẫn để thay đổi file server tại đây.

Bạn cần biết địa chỉ IP công khai của server và các domain bạn muốn định tuyến đến server. Giả sử rằng địa chỉ IP công cộng của server của tôi là 203.0.113.5 , các dòng tôi sẽ thêm vào file sẽ trông giống như sau:

/ etc / hosts
127.0.0.1   localhost
. . .

203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com

Điều này sẽ chuyển mọi yêu cầu đối với example.comtest.com  đến server IP của ta, như ta mong muốn.

Lưu file khi bạn hoàn tất.

Bước 6: Kiểm tra kết quả của bạn

Đến đây bạn đã cài đặt xong, bạn nên kiểm tra xem các server block của bạn có đang hoạt động chính xác hay không. Bạn có thể thực hiện bằng cách truy cập các domain trong trình duyệt web:

http://example.com

Bạn sẽ thấy một trang trông như thế này:

Server block đầu tiên của Nginx

Nếu bạn truy cập domain thứ hai của bạn, bạn sẽ thấy một trang web hơi khác:

http://test.com

Server block thứ hai của Nginx

Nếu cả hai trang web này đều hoạt động, bạn đã cấu hình thành công hai server block độc lập với Nginx.

Kết luận

Chúc mừng bạn, vậy bạn đã có thể tạo server block cho từng domain mà bạn muốn lưu trữ trên một web server nginx. Không có giới hạn nào về số lượng server block có thể tạo, miễn là phần cứng của bạn có thể đáp ứng được lưu lượng truy cập.



Các tin trước

Cài đặt OpenVPN Server trên Ubuntu 16.04 2016-05-04

Cài đặt JAVA với Apt-Get trên Ubuntu 16.04 2016-04-23

Cài đặt Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 16.04 2016-04-21

Cài đặt đăng nhập với ssh và key authentication trên Ubuntu 16.4 2016-04-21

Sử dụng UFW căn bản, các luật firewall phổ biến 2015-08-20

Nâng cấp lên Mysql 5.7 2015-04-20

Cấu hình xác thực bằng ssh-key trên server Linux 2014-10-20

Toàn tập làm việc với Openssl và chứng chỉ số 2014-09-12

Cài đặt Nginx trên CentOS 7 2014-07-22

Cài đặt Linux Apache MySQL PHP (LAMP) On CentOS 7 2014-07-21