Chịu đựng với tôi, đây là một cái dài.
Ban đầu, tôi đã tạo một máy chủ Nginx để lưu trữ các tệp tĩnh cho công ty của mình và nó hoạt động rất tốt với đoạn mã cấu hình sau để phục vụ các tệp:
người phục vụ {
# bó thứ ssl
gốc/đường dẫn/đến/tệp;
địa điểm / {
bao gồm cors_support;
gửi tệp trên;
sendfile_max_chunk 1m;
try_files $uri =404;
}
Đơn giản, sạch sẽ và chức năng. Cho đến khi tôi nghĩ rằng tôi sẽ thêm một chức năng khác vào máy chủ này: lưu trữ các bản dựng ứng dụng của chúng tôi và cung cấp chúng cho nhóm QA của chúng tôi. Vì các tệp ứng dụng có thể khá lớn nên tôi đã thêm một dung lượng lưu trữ khác chỉ dành cho các bản dựng và nghĩ rằng tôi có thể giải quyết vấn đề này bằng một thay đổi đơn giản đối với cấu hình Nginx như sau (chỉ hiển thị các phần có liên quan):
người phục vụ {
# gần như giống nhau
gốc/mới/đường dẫn/đến/xây dựng;
địa điểm / {
#giống như trước
try_files $uri @cdn_files;
}
vị trí @cdn_files {
#some cors và cài đặt send_file
gốc/đường dẫn/đến/tệp;
try_files $uri =404;
}
}
Những gì tôi mong đợi sẽ xảy ra theo tài liệu:
- yêu cầu đến cho một tập tin
- kiểm tra khối đầu tiên cho tập tin
- tập tin được tìm thấy? yes=gửi tập tin no=chuyển hướng đến vị trí được đặt tên
- vị trí được đặt tên -> tệp được tìm thấy? yes=gửi tập tin no=trang 404
Điều gì thực sự xảy ra:
- yêu cầu đến cho một tập tin
- kiểm tra khối đầu tiên cho tập tin
- tập tin được tìm thấy? yes=gửi tập tin no=trang 404
Tôi đã thử một số nỗ lực khác nhau để sửa lỗi này, bao gồm cả một số nỗ lực "kính mừng mary" điên rồ.
Điều này tạo ra kết quả tương tự (trang 404):
# ... mã không liên quan
nguồn gốc /;
địa điểm / {
# ... thêm mã không liên quan
try_files /new/path/to/builds/$uri /path/to/files/$uri =404;
}
Điều này tạo ra kết quả tương tự (trang 404):
#...
gốc/mới/đường dẫn/đến/xây dựng;
địa điểm / {
#...
try_files $uri @cdn_files;
}
vị trí @cdn_files {
#...
gốc/đường dẫn/đến/tệp;
try_files $uri =403; #lưu ý rằng trang được phân phối là 404 chứ KHÔNG phải 403
}
Điều này cũng tạo ra 404:
# Tôi đã xóa lệnh "root" khỏi khối máy chủ cho thử nghiệm này
địa điểm / {
#...
gốc/mới/đường dẫn/đến/xây dựng;
try_files $uri ../realitve/path/to/files/$uri =404;
}
Một vài điều khác cần lưu ý:
- Nhật ký lỗi chỉ hiển thị 1 lần thử định vị tệp ở tham số đầu tiên của
try_files
chỉ thị.
- Nếu tệp tồn tại trong tham số đầu tiên của
try_files
chỉ thị tập tin được gửi
- Tôi không nghĩ nó tương đối nhưng đề phòng: HĐH là Ubuntu 16.04
Chỉnh sửa: