Cách cấu hình Server NGINX
Location Context
- Được đặt trong server context.
- Sau khi đã chọn được server context nào sẽ tiếp nhận request này thì nginx sẽ tiếp tục phân tích URI của request để tìm ra hướng xử lí của request dựa vào các location context có syntax như sau:
location optional_modifier location_match {
. . .
}
optional_modifier
: bạn có thể tạm hiểu nó là kiểu so sánh để tìm ra để đối chiếu với location_match
. Có mấy loại option như sau:
(none)
: Nếu không khai báo gì thì NGINX sẽ hiểu là tất cả các request có URI bắt đầu bằng phần location_match sẽ được chuyển cho location block này xử lí.=
: Khai báo này chỉ ra rằng URI phải có chính xác giống như location_match (giống như so sánh string bình thường).~
: Sử dụng regular expression cho các URI.~*
: Sử dụng regular expression cho các URI cho phép pass cả chữ hoa và chữ thường
Một số ví dụ:
location /site {
. . .
}
Các request có URI có dạng như sau: /site, /site/page/1, site/index.html sẽ được xử lí thông qua location này.
location = /site {
. . .
}
Với khai báo như bên trên thì chỉ có /site sẽ có thể được xử lí, còn /site/page/1 hay /site/index.html thì không.
location ~ \.(jpe?g|png|gif|ico)$ {
. . .
}
Các request có đuôi .jpg,.jpeg, .png, .gif, .ico có thể pass qua location này nhưng .PNG thì không.
location ~* \.(jpe?g|png|gif|ico)$ {
. . .
}
Giống như trên nhưng đuôi .PNG
cũng có thể pass.
Khi nào thì location block sẽ nhảy vào khối block khác?
Thông thường khi mà location block được dùng để phục vụ một request nào đó thì action sẽ hoàn toàn nằm trong context của nó ( bên trong dấu {}). Và nó sẽ chỉ nhảy sang các block khác hay chuyển hướng xử lí request khi có yêu cầu từ chính bên trong context của nó. Một vài directive có thể redirective request. Ví dụ:
- index
- try_files
- rewrite
- error_page
index directive
index direct nằm bên trong location luôn được nginx trỏ tới đầu tiên khi xử lí điều hướng request. Định nghĩa trang mặc định mà Nginx sẽ phục vụ nếu không có tên tập tin được chỉ rõ trong yêu cầu (nói cách khác, trang chỉ mục). Chúng ta có thể chỉ rõ nhiều tên tập tin và tập tin đầu tiên được tìm thấy sẽ được sử dụng. Nếu không có tập tin cụ thể nào được tìm thấy, Nginx sẽ hoặc là cố gắng phát sinh 1 chỉ mục tự động của các tập tin
location = / { index index.html; }
try_files directive
Cố gắng phục vụ các tập tin được chỉ rõ (các tham số từ 1 đến N-1 trong chỉ thị), nếu không có tập tin nào tồn tại, nhảy đến khối location được khai báo (tham số cuối cùng trong chỉ thị) hoặc phục vụ 1 URI được chỉ định.
location / { try_files $uri $uri.html $uri/ /fallback/index.html; }
rewrite directive
Khác với Apache, Nginx không sử dụng file .htaccess nên khi bạn cần rewrite url sẽ phải convert qua rule của Nginx. Trong bài viết này, mình sẽ đưa ra một số ví dụ các rule của Nginx sử dụng để rewrite url, redirect và một số cấu hình cần thiết khác.
location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; }
error_page directive
Chỉ thị khi không tìm thấy file tham chiếu.
location / { error_page 404 = @fallback; } location @fallback { proxy_pass http://backend; }
Xử lý trong location context
- Nginx sẽ đọc
root
directive để xác định thư mục chứa trang client yêu cầu. Thứ tự các trang được ưu tiên sẽ được khai báo trongindex
directive. - Nếu không tìm được nội dung mà client yêu cầu, nginx sẽ điều hướng sang location context khác và thông báo lỗi cho người dùng.
Ví dụ minh họa:
Ví dụ 1:location / {
root html;
index index.html index.htm;
}
Trong ví dụ này, document root là thư mụchmtl/
. Trong cài đặt mặc định của Nginx, đường dẫn đầy đủ đến thư mục này là/etc/nginx/html/
Request: http://example.com/blog/includes/style.css
Returns: NGINX sẽ tìm yêu cầu của client theo đường dẫn/etc/nginx/html/blog/includes/style.css
Ví dụ 2:
location / {
root /srv/www/example.com/public_html;
index index.html index.htm;
}
location ~ \.pl$ {
gzip off;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}
- Trong ví dụ này, tất cả các yêu cầu tài nguyên kết thúc bằng phần mở rộng
.pl
được xử lý bởi location context thứ hai, chỉ định trình xử lý fastcgi cho các yêu cầu này. Mặt khác, NGINX sử dụng chỉ thị vị trí đầu tiên. Tài nguyên được đặt trên hệ thống tệp tại thư mục/srv/www/example.com/public_html/
. Nếu không có tên tệp nào được chỉ định trong yêu cầu, NGINX sẽ tìm và cung cấp tệp index.html hoặc index.htm. Nếu không tìm thấy tệp chỉ mục, máy chủ sẽ trả về lỗi 404. Cụ thể:Request: http://example.com/
Returns:/srv/www/example.com/public_html/index.html
nếu nó tồn tại. Nếu file.hmtl
không tồn tại, file/srv/www/example.com/public_html/index.htm
sẽ được sử dụng. Nếu cả 2 file không tồn tại ==> 404 error.Request: http://example.com/blog/
Returns:/srv/www/example.com/public_html/blog/index.html
nếu nó tồn tại. Nếu file.html
không tồn tại, nó sẽ sử dụng/srv/www/example.com/public_html/blog/index.htm
. Nếu cả 2 file không tồn tại ==> 404 error.Request: http://example.com/tasks.pl
Returns: NGINX sẽ dử dụng FastCGI handler để thực thi file có tại/srv/www/example.com/public_html/tasks.pl
và trả về kết quả.Request: http://example.com/username/roster.pl
Returns: NGINX sẽ sử dụng FastCGI handler để thực thi file có tại/srv/www/example.com/public_html/username/roster.pl
và trả về kết quả.