Nginx là một trong những web server phổ biến nhất trên Linux, bạn có thể cài Nginx trên Ubuntu 24.04 LTS bằng APT. Canonical hiện tài liệu hóa rõ cách cài Nginx bằng apt, cách kiểm tra service bằng systemctl status nginx, còn tài liệu chính thức của Nginx giải thích rất rõ cấu trúc directive, cơ chế reload config và cách worker process được quản lý.
Điểm quan trọng là bài này không chỉ dừng ở chỗ “cài xong để thấy trang Welcome to nginx”, mà tập trung vào thứ giúp bạn vận hành bền hơn về sau: hiểu nginx.conf, hiểu server block, hiểu vì sao Ubuntu dùng sites-available và sites-enabled, và hình thành thói quen test rồi mới reload thay vì sửa xong restart ngay. Nếu muốn đối chiếu tài liệu gốc trong lúc làm, bạn có thể mở thêm hướng dẫn How to install nginx của Ubuntu Server và Beginner’s Guide của Nginx ngay trong lúc thao tác.
1. Mục tiêu của bài viết
Sau khi đi hết bài này, bạn nên làm được ba việc.
Thứ nhất, bạn cài được Nginx sạch trên Ubuntu 24.04 LTS và xác nhận service hoạt động đúng.
Thứ hai, bạn hiểu cấu trúc config đúng chuẩn trên Ubuntu: file nào là file gốc, file nào dành cho từng website, file nào chỉ có vai trò kích hoạt site.
Thứ ba, bạn biết quy trình an toàn mỗi khi sửa config: đọc cấu trúc, chỉnh ở đúng nơi, chạy nginx -t, sau đó mới reload.
2. Hiểu đúng Nginx trên Ubuntu trước khi gõ lệnh
2.1. Nginx không chỉ là web server, mà còn là reverse proxy rất mạnh
Theo Ubuntu Server docs, Nginx là lựa chọn phổ biến để phục vụ web service trên Ubuntu. Theo tài liệu upstream của Nginx, nó vừa làm web server, vừa làm proxy server, vừa làm nền để kết nối FastCGI như PHP-FPM ở các bước sau của series. Điều đó có nghĩa là ngay từ bài B1, bạn nên làm quen với cấu trúc config sạch thay vì nhét mọi thứ vào một file duy nhất.
2.2. Cấu trúc config đúng chuẩn trên Ubuntu là gì
Tài liệu chính thức của Nginx nói rõ rằng cấu hình của Nginx được điều khiển bằng các directive. Directive đơn sẽ kết thúc bằng dấu chấm phẩy ;, còn directive khối sẽ dùng cặp ngoặc nhọn {}. Trên Ubuntu, file cấu hình chính thường đặt tại /etc/nginx/nginx.conf, còn Canonical dùng thêm mô hình sites-available và sites-enabled để quản lý nhiều website.
Cách hiểu ngắn gọn nhất là thế này.
/etc/nginx/nginx.conf là file gốc, nơi định nghĩa khung chung của Nginx như các block events và http, cùng các lệnh include để nạp thêm cấu hình con.
/etc/nginx/sites-available/ là nơi bạn đặt file config của từng website hoặc từng server block.
/etc/nginx/sites-enabled/ là nơi chứa symlink tới các site đang thực sự được kích hoạt.
/etc/nginx/modules-enabled/ là nơi Ubuntu đặt các file nạp module động khi cần mở rộng Nginx.
Nếu bạn nhớ đúng một nguyên tắc duy nhất, hãy nhớ nguyên tắc này: đừng biến nginx.conf thành nơi chứa toàn bộ website config. Với Ubuntu, cách gọn nhất vẫn là để nginx.conf làm file khung, còn mỗi site nằm riêng trong sites-available, sau đó enable bằng symlink sang sites-enabled.
3. Cài Nginx trên Ubuntu 24.04 LTS
3.1. Cập nhật package index và cài Nginx
Ubuntu Server docs hiện khuyến nghị cập nhật package index trước bằng sudo apt update, sau đó cài package bằng sudo apt install. Với Nginx, lệnh cài cơ bản là như sau.
sudo apt update
sudo apt install nginx
Sau khi cài xong, Ubuntu sẽ cài thêm dependency cần thiết và khởi động Nginx luôn. Đây là điểm rất tiện cho người mới vì bạn có thể kiểm tra service ngay sau đó mà không phải tự dựng unit file hay bật service bằng tay từ đầu.
3.2. Kiểm tra service và trang mặc định
Chạy các lệnh sau để xác minh Nginx đã chạy.
sudo systemctl status nginx --no-pager
curl -I http://127.0.0.1
Theo tài liệu Ubuntu, systemctl status nginx là cách chuẩn để xác nhận service đang active. Sau khi cài, Ubuntu cũng dựng sẵn một trang mặc định để bạn có thể truy cập bằng IP của server và thấy thông báo kiểu “Welcome to nginx!”. Đó là tín hiệu cho biết lớp web server đã hoạt động, dù cấu hình production của bạn còn chưa bắt đầu.
3.3. Mở firewall đúng cách nếu bạn đang dùng UFW
Nếu VPS của bạn đã bật UFW từ trước, đừng quên mở dịch vụ web. Ubuntu docs mô tả rõ rằng UFW hỗ trợ application profile, tức là mỗi ứng dụng có thể cung cấp profile sẵn trong /etc/ufw/applications.d. Bạn nên xem danh sách profile rồi mới allow.
sudo ufw app list
sudo ufw allow 'Nginx Full'
sudo ufw status verbose
Dùng profile kiểu Nginx Full thường sạch hơn việc nhớ tay từng port, nhất là khi sau này bạn bật cả HTTP lẫn HTTPS. Nếu hệ thống chưa dùng UFW thì bạn có thể bỏ qua bước này ở hiện tại, nhưng nên nhớ lại khi sang bài về SSL và firewall.
4. Đọc cấu trúc config mặc định để không sửa nhầm chỗ
4.1. Cây config tối thiểu bạn nên nhớ
Khi vừa cài xong, bạn có thể hình dung cây cấu hình theo kiểu sau:
/etc/nginx/
├── nginx.conf
├── modules-enabled/
├── sites-available/
└── sites-enabled/
└── default
Điểm cần nhớ là Ubuntu mặc định đã có một site cấu hình sẵn ở sites-enabled/default, và site này phục vụ nội dung từ /var/www/html. Canonical cũng hướng dẫn rõ rằng với multi-site hosting, bạn nên tạo file mới trong sites-available rồi symlink sang sites-enabled.
4.2. nginx.conf giữ vai trò file khung
Tài liệu Beginner’s Guide của Nginx giải thích rằng cấu hình Nginx được tổ chức theo các context và block. Nói dễ hiểu hơn, nginx.conf không phải chỗ để bạn nhét toàn bộ logic của từng website, mà là file khung định nghĩa cách toàn bộ Nginx hoạt động. Vì thế, khi bạn chỉ cần thêm một website mới, chỗ nên sửa trước hết thường không phải là nginx.conf, mà là file site riêng trong sites-available.
4.3. server block là nơi từng website thật sự sống
Ubuntu docs gọi phần config của mỗi website là server block. File mặc định của Ubuntu lắng nghe cổng 80, dùng root /var/www/html, đặt server_name _; và trong location / dùng try_files $uri $uri/ =404;. Đây là một mẫu rất tốt để bạn hiểu cấu trúc tối thiểu của một site tĩnh.
Bạn không cần học thuộc toàn bộ ngay lập tức. Chỉ cần nhớ ý nghĩa của bốn dòng này.
listen quyết định cổng lắng nghe.
server_name quyết định tên miền hoặc hostname mà block này phục vụ.
root quyết định thư mục gốc của website.
location quyết định cách Nginx xử lý request.
5. Tạo site đầu tiên theo layout sạch, dễ bàn giao
5.1. Tạo webroot riêng cho site
Ubuntu docs dùng ví dụ /srv/my-site/html để host nội dung tĩnh thay vì ép mọi site chui vào /var/www/html. Đây là thói quen tốt hơn khi bạn muốn host nhiều domain hoặc sau này thêm PHP-FPM và log theo site.
sudo mkdir -p /srv/example-site/html
sudo chmod -R 755 /srv/example-site
echo "<h1>Hello from Nginx on Ubuntu</h1>" | sudo tee /srv/example-site/html/index.html
Cách làm này giúp mỗi site có thư mục riêng, đỡ lẫn với default site, và khi backup hoặc bàn giao cho đội khác cũng dễ hơn nhiều.
5.2. Tạo file server block trong sites-available
Bây giờ bạn tạo file cấu hình site riêng.
sudo nano /etc/nginx/sites-available/example-site
Nội dung tối thiểu có thể bắt đầu như sau:
server {
listen 80;
listen [::]:80; server_name example.com www.example.com;
root /srv/example-site/html;
index index.html; location / {
try_files $uri $uri/ =404;
}
}
Khối config này bám rất sát cách Ubuntu trình bày server block cho site tĩnh: có listen, có server_name, có root, có index, và trong location / dùng try_files để tránh những route mơ hồ không tồn tại. Nếu bạn chưa trỏ DNS thật, có thể tạm thay server_name bằng IP public hoặc hostname test nội bộ.
5.3. Enable site bằng symlink, sau đó test rồi mới reload
Theo tài liệu Ubuntu, multi-site hosting trên Nginx được kích hoạt bằng symlink từ sites-available sang sites-enabled. Sau khi enable, bạn test cấu hình rồi mới reload.
sudo ln -s /etc/nginx/sites-available/example-site /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Nếu site mới đã hoạt động ổn, bạn có thể bỏ site mặc định để tránh nhầm lẫn về sau.
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
Đây là thói quen rất nên giữ từ đầu: enable xong là test, test xong mới reload. Nginx upstream giải thích rõ rằng khi reload, master process sẽ kiểm tra tính hợp lệ của config mới; nếu không áp dụng được, Nginx sẽ rollback và tiếp tục chạy với config cũ. Dù vậy, trên thực tế bạn vẫn nên chủ động chạy nginx -t trước để thấy lỗi sớm hơn và dễ đọc hơn.
6. Quy trình sửa config an toàn mà bạn nên giữ suốt cả series
6.1. Công thức bốn bước
Khi sửa bất kỳ file nào liên quan tới Nginx, hãy đi theo đúng thứ tự này.
Bước một, mở file đúng nơi và sửa ít một.
Bước hai, chạy:
sudo nginx -t
Bước ba, nếu không có lỗi cú pháp thì mới chạy:
sudo systemctl reload nginx
Bước bốn, kiểm tra lại từ chính server hoặc từ máy ngoài:
curl -I http://127.0.0.1
curl -I http://your_server_ip
Ubuntu docs dùng systemctl reload nginx khi thay đổi cấu hình site, còn tài liệu Nginx giải thích rằng reload sẽ nạp config mới mà không cắt ngang service theo kiểu thô bạo như restart. Đây là khác biệt rất quan trọng cho production.
6.2. Khi nào dùng restart, khi nào dùng reload
reload nên là mặc định của bạn khi chỉ thay đổi cấu hình.
restart chỉ nên dùng khi service đang lỗi, module vừa thay đổi theo cách cần khởi động lại hoàn toàn, hoặc bạn đang xử lý sự cố và biết rõ lý do phải restart. Ubuntu docs có tách riêng lệnh restart cho việc khởi động lại service, nhưng ở nhánh cấu hình site họ vẫn minh họa bằng reload. Cách đó hợp với production hơn.
6.3. Dùng nginx -T để đọc config hiệu lực
Khi bắt đầu có nhiều site, nhiều include và nhiều module, bạn sẽ rất dễ quên file nào đang được nạp thực sự. Lúc đó, lệnh sau cực kỳ hữu ích.
sudo nginx -T | less
Lệnh này giúp bạn xem toàn bộ cấu hình hiệu lực. Nó đặc biệt hữu ích khi bạn nghi ngờ site đã tạo trong sites-available nhưng chưa enable, hoặc có file mặc định nào đó vẫn còn nằm trong sites-enabled làm request rơi nhầm block.
7. Lỗi thường gặp khi mới cài Nginx trên Ubuntu
7.1. Chỉnh tất cả vào nginx.conf
Đây là lỗi rất phổ biến. Người mới thường mở nginx.conf và viết luôn cả website ở đó. Kết quả là file gốc ngày càng dài, khó tìm lỗi, khó bàn giao và khó mở rộng. Trên Ubuntu, bạn nên để nginx.conf làm file khung và tách mỗi site sang sites-available.
7.2. Sửa xong rồi reload ngay mà không test
Thói quen này có thể không phá site ngay trong mọi trường hợp, nhưng nó làm bạn mất khả năng phát hiện lỗi sớm và đọc lỗi theo trình tự sạch. nginx -t là bước không nên bỏ qua. Ubuntu còn cho thấy ngay trong unit status rằng ExecStartPre dùng nginx -t -q, tức là việc test config là một phần cốt lõi của vòng đời service này.
7.3. Quên site mặc định
Bạn đã tạo site mới đúng, DNS cũng đúng, nhưng trình duyệt vẫn ra trang Welcome to nginx. Nguyên nhân thường không phải Nginx “không hiểu bạn”, mà là site mặc định vẫn còn đó và request đang rơi vào block default. Sau khi site mới ổn định, hãy bỏ symlink của default site nếu bạn không còn dùng nó nữa.
7.4. Mở port bằng tay dù UFW có application profile
Khi đã dùng UFW, bạn nên kiểm tra profile sẵn có bằng ufw app list trước. Cách này gọn hơn, nhất quán hơn và ít sai hơn khi sau này triển khai HTTPS hoặc đổi cách host nhiều site.
8. Checklist sau khi cài xong
8.1. Kiểm tra package và service
sudo systemctl status nginx --no-pager
Bạn cần thấy service ở trạng thái active.
8.2. Kiểm tra trang phản hồi nội bộ
curl -I http://127.0.0.1
Bạn cần thấy phản hồi HTTP hợp lệ, thường là 200 OK hoặc phản hồi tương ứng với block hiện tại.
8.3. Kiểm tra config hiệu lực
sudo nginx -t
sudo nginx -T | less
Bạn cần chắc chắn rằng file site của bạn thực sự đã được Nginx nạp.
8.4. Kiểm tra firewall nếu dùng UFW
sudo ufw status verbose
Bạn cần thấy rule cho web server đã được mở đúng.
9. FAQ
9.1. Có nên cài Nginx bằng package của Ubuntu hay lấy bản mới nhất từ nơi khác
Với đa số VPS mới, bạn nên bắt đầu bằng package của Ubuntu. Nó đơn giản, đồng bộ với hệ điều hành và bám theo luồng update bảo mật của Ubuntu. Trên Ubuntu 24.04 LTS, nhánh Nginx chính thức đi theo major 1.24 và tiếp tục nhận cập nhật bảo mật trong vòng đời hỗ trợ của bản phát hành.
9.2. Vì sao Ubuntu dùng sites-available và sites-enabled
Vì cách này giúp quản lý nhiều website rõ ràng hơn. Bạn có thể viết file site trước, review trước, chỉ khi sẵn sàng mới enable bằng symlink. Đây là layout rất tiện cho vận hành, backup và rollback.
9.3. Có cần học hết mọi directive của Nginx ngay ở bài đầu không
Không cần. Ở B1, bạn chỉ cần hiểu chắc listen, server_name, root, index, location, try_files, cùng quy trình nginx -t rồi reload. Khi sang B2 và B3, bạn sẽ mở rộng dần sang multi-site và PHP-FPM.
9.4. Có nên dùng restart mỗi lần sửa config cho chắc không
Không. Với thay đổi config thông thường, reload hợp lý hơn. Restart chỉ dùng khi bạn có lý do rõ ràng hoặc đang xử lý sự cố. Càng sớm hình thành thói quen test rồi reload, bạn càng đỡ tự tạo downtime cho chính mình.
10. Kết luận
Cài Nginx trên Ubuntu không khó. Cái khó nằm ở việc bạn có dựng được một cấu trúc config đủ sạch để vài tuần sau còn đọc lại được hay không. Nếu bạn làm đúng ngay từ B1, các bài tiếp theo như server blocks, PHP-FPM, SSL Let’s Encrypt và tối ưu log sẽ nhẹ hơn rất nhiều.
11. Gợi ý
Server blocks Nginx: host nhiều domain, routing và static tối ưu

