Thiết lập cấu hình nginx chi tiết

Có 2 cách cài nginx, cách cài 1 (mặc định) sẽ không có được bản nginx mới nhất. Cách cài 2 hơi phức tạp, bạn phải cài trực tiếp từ nginx. Hai cách cài sẽ ra kết quả file cấu hình hơi khác nhau một chút.

Trang chủ của Nginx chỉ rõ có 2 cách cài đặt:

Để cài nginx theo cách mặc định (hay Prebuilt Ubuntu Package from an Ubuntu Repository), bạn chỉ cần nhập vài dòng lệnh sau:

sudo apt update
sudo apt install nginx

Nếu cần, bạn mở tường lửa:

sudo ufw app list
sudo ufw allow 'Nginx HTTP'

Kiểm tra trạng thái:

systemctl status nginx

Với cách cài đặt thông qua repository mặc định của hệ điều hành, bạn sẽ KHÔNG cài được bản stable/mainline mới nhất của nginx. Ví dụ trên Ubuntu 22.04, mình cài qua repository của Ubuntu sẽ ra bản nginx 1.18.0 (tháng 01/2024). Để kiểm tra phiên bản của nginx, bạn gõ nginx -v

(Mình test thử thì trên bản Debian 12, cài nginx sẽ ra bản 1.22.1 nếu dùng repository mặc định).

Bạn phải cài trực tiếp từ nginx để có được bản nginx mới nhất. Xem hướng dẫn tại chính trang chủ của nginx tại đây. Cơ bản gồm các lệnh sau:

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg


echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx


sudo apt update && apt -y install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Để cài nhanh thì bạn có thể dùng lệnh sau, mình đã gộp thành một file bash nhỏ:

curl -sLO https://install.kiwipanel.org/nginx && chmod +x nginx && sudo bash nginx

Mình sẽ dùng cách 2 để cài nginx 1.24 (stable mới nhất), so với bản 1.18 mặc định.

Trên Ubuntu, tất cả các files cấu hình của nginx nằm ở thư mục: /etc/nginx. Đây là các file sẽ có khi cài bản 1.18.

Đây là bản 1.22.1 khi cài nginx mặc định:

Bản 1.24 sẽ không còn dùng sites-available và sites-enabled nữa nên số thư mục rút gọn hẳn như sau:

Tập tin cấu hình chính của nginx là /etc/nginx/nginx.conf. Tuy nhiên ta thường sẽ không chỉnh sửa file này.

Nếu bạn cài nginx theo cách khác nhau, file cấu hình chính nginx.conf sẽ có nội dung khác nhau. Từ đó, bạn sẽ phải tùy chỉnh theo để đảm bảo việc cấu hình không gặp sai sót. Lưu ý gõ nginx -t để kiểm tra cú pháp của nginx mỗi khi cấu hình.

File cấu hình nginx.conf nếu cài theo cách 1 (mặc định).

Ta sẽ phân tích một số thông tin như sau:

Tệp cấu hình của Nginx được quản lý theo “khối”.

Khối đầu tiên mà chúng ta thấy là khối sự kiện (events block). Khối tiếp theo là khối http và bắt đầu của cấu trúc chính trong tệp cấu hình.

Các chi tiết cấu hình bên trong khối http được xếp lớp, với các khối đóng kín thừa kế thuộc tính từ khối chúng được đặt trong. Hầu hết cấu hình chung của Nginx diễn ra trong khối http, nơi chứa các khối máy chủ (server blocks), trong đó lại chứa các khối vị trí (location blocks). (Nếu bạn quen với khái niệm scope trên JavaScript như global scope hay local hoặc function scope, thì cái này áp dụng tương tự).

Phần quan trọng là bạn luôn nên đặt chi tiết cấu hình vào bên trong bao nhiêu nhất mà nó áp dụng. Điều này có nghĩa là nếu bạn muốn tham số X áp dụng cho mọi khối máy chủ, thì đặt nó trong khối http sẽ khiến nó lan truyền đến mọi cấu hình máy chủ.

Nếu bạn nhìn vào tệp của chúng ta, bạn sẽ nhận thấy rằng nó có nhiều tùy chọn quy định cách phần mềm nên hoạt động như là một tổng thể. Đây là nơi phù hợp cho những loại chỉ thị như vậy.

Số lượng worker_connections là 768 (nếu cài trực tiếp từ nginx bản 1.24 sẽ là 1024), đây là số lượng kết nối một nhân CPU có thể xử lý. Khi để worker_processes tự động, hệ thống sẽ theo đó nâng lên. Ví dụ nếu 2 nhân, khả năng xử lý sẽ là 768 * 2 (hoặc 1024 *2).

File cấu hình này cho phép bạn tạo vhost (nhiều domain), khi đã gộp sẵn cấu hình bạn sẽ triển khai (xem ở phần sau), chính là dòng này:

#Cả hai cách cài, file cấu hình nginx.conf đều có dòng này:

/etc/nginx/conf.d/*.conf;
#Nếu cài trực tiếp từ nginx, file cấu hình nginx.conf sẽ không có dòng dưới:
include /etc/nginx/sites-enabled/*;

Nếu cài trực tiếp từ nginx, file cấu hình nginx.conf sẽ như sau, nghĩa là cách chúng ta triển khai vhost (cấu hình nhiều domain) sẽ phải thêm thắt một chút.

File cấu hình chính này chỉ include các file cấu hình đặt trong thư mục: /etc/nginx/conf.d/*.conf;

Ta sẽ thêm file cấu hình cho vhost (nhiều domain) bằng cách thêm vào dòng sau, trong trường hợp Ubuntu (hay hệ điều hành bạn cài) không có:

 include /etc/nginx/sites-enabled/*;

Đây là một lưu ý quan trọng:

Chú ý rằng lúc này, ta có 3 nơi có thể đặt file cấu hình cho từng domain:

etc/nginx/sites-available
etc/nginx/sites-enabled
etc/nginx/conf.d

Câu hỏi đặt ra là liệu tôi có cần tất cả chúng không? Đây là câu trả lời từ stackoverflow:

Như vậy, bạn có thể chỉ cần dùng thư mục etc/nginx/conf.d để chứa các cấu hình cho từng domain, tuy nhiên, chúng ta sẽ gặp khó khăn để quản trị khi số domain tăng lên nếu đã quen với cách cũ. Bạn sẽ phải học cách mới để “tắt” hoặc “mở” domain bằng cách thay tên của file .conf thay vì gỡ symbol link như cũ.

Cũng trên stackoverflowseverfault có một vài thảo luận làm mình chú ý, đó là liệu cách dùng symbolink để cấu hình vhost có phải đã cũ không? Đây là câu trả lời:

Từ đây, mình có nhận xét như sau:

  • Bản cài nginx mặc định trên Ubuntu 22.4 là 1.18 vẫn còn dòng include /etc/nginx/sites-enabled/*; trong file nginx.conf, như vậy, cách thiết kế vhost vẫn hỗ trợ cả 2 cách: đặt trong thư mục /etc/nginx/conf.d hoặc đặt trong thư mục site-available (Rồi thiết lập symbolic link) với site-enabled.
  • Bản cài nginx stable trực tiếp từ nginx hiện tại (1.24) (bản mainline là 1.25) đều bỏ dòng include /etc/nginx/sites-enabled/*; và các thư mục /etc/nginx/sites-available và /etc/nginx/sites-enabled. Điều này có khả năng nginx khuyến khích cách thiết lập vhost mới (chỉ để trong thư mục /etc/nginx/conf.d

Xét về mức độ ưu tiên thì cấu hình con sẽ ghi đè cấu hình cha, theo một bài viết sau:

Đây là một comment khá hay bạn có thể tham khảo:

Tóm lại, chỉ dùng /etc/nginx/conf.d để chứa file cấu hình, hoặc dùng sites-available và link với sites-enabled là ở convention. Có vẻ như cách dùng với sites-available và link với sites-enabled quen thuộc hơn vì bạn có thể tắt việc hỗ trợ bằng cách xóa symbolic link. Nếu bỏ vào /etc/nginx/conf.d, bạn phải đổi tên của file cấu hình.

Mình sẽ lựa chọn cách 2 vì đây là cách thiết lập được khuyến nghị trên bản 1.24 (thời điểm 01/2024). Các phiên bản từ 1.18 tới 1.23 như nào mình tạm thời bỏ qua.

Trong thư mục /etc/nginx/conf.d mặc định sẽ có file default.conf. Đây là nội dung của file này, chú ý location và root. Nội dung trong file thư mục /usr/share/nginx/html có 50x.html và index.html. index.html này sẽ hiển thị nội dung của nginx khi cài đặt, có thể truy cập từ ip chính của vps. Chú ý, nếu bạn cài nginx qua aapanel thì cấu hình nginx sẽ khác.

Thiết lập Vhost nhiều domain trên nginx

Đọc tới đoạn này, chắc bạn sẽ biết: Có 2 cách cấu hình vhost trên nginx tương ứng với bản 1.18 hoặc bản upstream 1.24.

Thiết lập Vhost với bản nginx 1.18: dùng cách cũ

Để cấu hình cho các domain khác nhau, ta tạo các file configuration cho từng domain. Các file cấu hình này sẽ đặt trong thư mục /etc/nginx/sites-available. Ta cần tạo symlink tới thư mục /etc/nginx/sites-enabled để các file cấu hình này hoạt động.

Đây là một ví dụ:

#Bước 1:  Tạo thư mục chứa code
mkdir /var/www/test.kiwipanel.org

#Bước 2: Tạo một file code HTML đơn giản:Mở editor mặc định nano quen thuộc với lệnh: 
nano /var/www/test.kiwipanel.org/index.html

#Thiết lập nội dung file HTML này và lưu lại trên nano

<html>
<title>kiwipanel.org</title>
<h1>Welcome to the test.kiwipanel.org with Nginx webserver.</h1>
</html>

#Bước 3: Thiết lập quyền thực thi
chown -R www-data:www-data /var/www/test.kiwipanel.org

#Bước 4: Thiết lập file cấu hình nginx
nano /etc/nginx/sites-available/test.kiwipanel.org.conf

Cập nhật nội dung file này:

server {
        listen 80;
        listen [::]:80;
        root /var/www/test.kiwipanel.org;
        index index.html index.htm;
        server_name test.kiwipanel.org;

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

#Bước 5: Liên kết symbollink 
ln -s /etc/nginx/sites-available/test.kiwipanel.org.conf /etc/nginx/sites-enabled/

#Bước 6: Reload lại nginx (nếu cần có thể restart)
#Kiểm tra cấu 
hình nginx -t
#Reload
systemctl reload nginx

Thiết lập Vhost với bản nginx 1.24

Bản upstream này không còn thư mục sites-available và sites-enabled, cũng không còn dòng include cấu hình từ 2 thư mục này. Vậy ta sẽ dùng cách mới. Chú ý khi cài nginx 1.24 thì mình không còn thấy thư mục /var/www/html được tạo ra mặc định. Vậy bạn có thể phải tạo riêng hoặc chọn nơi mình muốn lưu code của mình và thay đổi cấu hình trên file .conf đặt trong thư mục /etc/nginx/conf.d

Các bước thiết lập khác một chút. Bước 1, 2, 3 y chang ở trên.

#Bước 1:  Tạo thư mục chứa code (tương tự ở trên)
#Bước 2: Tạo một file code HTML đơn giản (tương tự ở trên)
#Bước 3: Thiết lập quyền thực thi (tương tự ở trên)
#Bước 4: Thiết lập file cấu hình nginx ngay trong thư mục conf.d
#Vào thư mục conf.d

cd: /etc/nginx/conf.d

nano /etc/nginx/conf.d/test.kiwipanel.org.conf

#Bạn cũng dán nội dung của file test.kiwipanel.org.conf như trên.

#Bước 5: Không cần
#Bước 6: Reload lại nginx (nếu cần có thể restart)
#Kiểm tra cấu 
hình nginx -t
#Reload
systemctl reload nginx

Log

Các tệp log của Nginx (access.log và error.log) được đặt trong thư mục /var/log/nginx. Bạn nên có các tệp log ghi lỗi và theo dõi truy cập khác nhau cho mỗi khối máy chủ.

Root

Bạn có thể đặt thư mục gốc domain của mình tới bất kỳ vị trí nào bạn muốn. Các vị trí phổ biến nhất cho webroot bao gồm:

/home/<user_name>/<site_name>

/var/www/<site_name>

/var/www/html/<site_name>

/opt/<site_name>

Quản lý

nginx sử dụng systemd để quản lý, một số lệnh cơ bản như sau:

sudo systemctl start nginx

sudo systemctl status nginx

sudo systemctl stop nginx

sudo systemctl reload nginx

sudo systemctl restart nginx

sudo systemctl disable nginx

Tham khảo:

https://strangebutohwell.gitbook.io/knowledge/linux/applications/nginx/configuration-files

https://www.jajaldoang.com/post/how-to-use-single-nginx-for-multiple-domains/

https://wiki.debian.org/Nginx/DirectoryStructure

Leave a Comment