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 ý:
- Cách cài đặt Nginx trên Ubuntu 16.04 : Sử dụng hướng dẫn này để tự cài đặt Nginx.
- Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP) trong Ubuntu 16.04 : Sử dụng hướng dẫn này nếu bạn sẽ sử dụng Nginx kết hợp với MySQL và PHP.
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.com và test.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
.
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:
<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 :
<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:
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.
server { listen 80; listen [::]:80; . . . }
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:
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:
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:
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 choexample.com
vàwww.example.com
test.com
: Sẽ phản hồi các yêu cầu chotest.com
vàwww.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ú :
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.
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:
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.com
và test.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:
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
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 Bảo mật cơ bản cho CentOS 7 2014-07-21