Điểm:0

Thêm khối vị trí vào các tệp bộ đệm làm cho các tệp đó trả về 404

lá cờ in

Tôi muốn lưu trữ một số tệp tĩnh bằng Nginx. Nhưng tôi bằng cách nào đó không thể làm cho nó hoạt động.

Đây là của tôi nginx.conf:

dữ liệu www của người dùng;
worker_processes tự động;
pid /run/nginx.pid;
bao gồm /etc/nginx/modules-enabled/*.conf;

sự kiện {
    công_nhân kết_nối 768 ;
    #multi_accept on;
}


http {

    #GZIP
    bật gzip;
    bật gzip_vary;
    gzip_proxied bất kỳ;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    ứng dụng gzip_types/ứng dụng javascript/ứng dụng json/ứng dụng ld+json/phông chữ xml/phông chữ eot/phông chữ otf/văn bản ttf/văn bản css/văn bản javascript/văn bản thuần túy/xml;

    # MAY CHỦ
    người phục vụ {
            nghe 80;

        server_name example.com;
        nếu ($http_host ~* ^www\.(.*)$ )
        {
            trả lại 301 https://$1$request_uri;
        }

        trả lại 301 https://$http_host$request_uri;
    }
    người phục vụ {
        nghe 443 ssl;

        nếu ($http_host ~* ^www\.(.*)$ )
        {
            trả về 301 $scheme://$1$request_uri;
        }


        #SSL
        ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

        server_name example.com;

        # Chuyển tất cả lưu lượng truy cập vào ứng dụng web của tôi
        địa điểm / {
            proxy_set_header Máy chủ lưu trữ $host;
            proxy_pass http://localhost:8080;
        }

        #Bộ nhớ đệm của trình duyệt
        vị trí ~* \.(js|css)$ {
            hết 180đ;
            add_header Pragma "công khai";
            add_header Kiểm soát bộ đệm "công khai";
        }
        vị trí ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            hết hạn 365d;
            add_header Pragma "công khai";
            add_header Kiểm soát bộ đệm "công khai";
        }

    }
}

Vấn đề nằm ở phần "Bộ nhớ đệm của trình duyệt". Khi kích hoạt khối mã này, trang web của tôi sẽ tải, nhưng tất cả các tệp css, tệp javascript và hình ảnh đều trả về lỗi 404. Có vẻ như các tệp đó đang bỏ qua trang web của tôi địa điểm /.

Tôi đã có thể giải quyết vấn đề này bằng cách sao chép/dán

proxy_set_header Máy chủ lưu trữ $host;
proxy_pass http://localhost:8080;

trong tất cả của tôi địa điểm-blocks, nhưng điều đó không thực sự tao nhã và thực sự khiến trang web của tôi chậm hơn rất nhiều...

Tôi cũng đã cố gắng di chuyển hai địa điểm-blocks cho bộ nhớ đệm của trình duyệt trong khối địa điểm \ vì vậy cái sau sẽ đóng vai trò là 'cha mẹ'. Nhưng điều đó không có khả năng xảy ra hành vi của hình ảnh, v.v. trả về 404.

Làm cách nào để định cấu hình bộ nhớ đệm của các tệp tĩnh trong Nginx?

Chỉnh sửa: Tôi đã thêm những điều sau đây vào http-chặn:

  bản đồ $uri $cache_control {
                ~/Trang web/nội dung/phương tiện/hình ảnh "công khai, không chuyển đổi";
        }
        bản đồ $uri $hết hạn {
            ~/Trang web/tài sản/phương tiện/hình ảnh 365d;
        }

Đã thêm phần sau vào của tôi người phục vụ-chặn:

 hết hạn $ hết hạn;
                add_header Kiểm soát bộ đệm $cache_control;

Không có gì được lưu trữ.

Ivan Shatsky avatar
lá cờ gr
Ứng dụng web phụ trợ của bạn là gì? Điều gì khiến bạn không thể phân phối các tệp tĩnh bằng nginx mà không gọi phần phụ trợ như Tero Kilkanen đề xuất?
O'Niel avatar
lá cờ in
Ứng dụng web back-end của tôi là ứng dụng Rust. Và URL mà tài nguyên/tệp được tìm thấy không giống với vị trí thực tế trên máy chủ. Tôi viết lại đường dẫn truy cập và tài nguyên của mình trong tệp web-routes.
Ivan Shatsky avatar
lá cờ gr
Được rồi, nếu bạn không thể phân phối nội dung tĩnh của mình chỉ bằng nginx và nên ủy quyền tất cả các yêu cầu cho chương trình phụ trợ, hãy kiểm tra [điều này](https://stackoverflow.com/a/64287782/7121513) câu trả lời. Tôi nghĩ rằng đây chính xác là những gì bạn đang yêu cầu (cần điều chỉnh tối thiểu).
O'Niel avatar
lá cờ in
@IvanShatsky Xem chỉnh sửa. Các tập tin không được lưu trữ.
Ivan Shatsky avatar
lá cờ gr
Thêm dòng `default off;` vào khối `map $uri $expire { ... }`.Tiền tố `/Website` đó là gì? Nó thực sự là một phần của URI chứ không phải tên miền? Kiểm tra xem các tiêu đề phản hồi bắt buộc có xuất hiện với DevTools hoặc curl của trình duyệt hay không. Bạn có chắc là ứng dụng phụ trợ không thêm bất kỳ ứng dụng nào trong số đó không?
O'Niel avatar
lá cờ in
Tôi nghĩ đường dẫn là đường dẫn thực của tệp trên VPS. Tôi đã xóa phần `Trang web` và giờ nó đang hoạt động! Cảm ơn!
Ivan Shatsky avatar
lá cờ gr
Vì bạn đã bắt đầu nhận tiền thưởng, bạn có phiền không nếu tôi viết nó như một câu trả lời? :) Tôi sẽ sử dụng các khối `map` hơi khác để trả lời câu hỏi ban đầu của bạn trong đó các tệp JS/CSS và hình ảnh sẽ nhận các giá trị tiêu đề `Hết hạn` khác nhau.
O'Niel avatar
lá cờ in
@IvanShatsky Tất nhiên rồi bạn ơi. Sự giúp đỡ của bạn được đánh giá cao.
Điểm:1
lá cờ gr

Nếu bạn không thể phân phối nội dung tĩnh của mình trực tiếp từ hệ thống tệp qua nginx như @TeroKilkanen gợi ý, bạn có thể sử dụng một kỹ thuật tương tự như được hiển thị trong cái này câu trả lời:

bản đồ $uri $hết hạn {
    ~\.(?:j|cs)s$ 180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$ 365d;
    mặc định tắt;
}
bản đồ $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$ công khai;
}
người phục vụ {
    ...
    hết hạn $ hết hạn;
    add_header Pragma $cache_control;
    add_header Kiểm soát bộ đệm $cache_control;
    ...
}

Nếu URI yêu cầu của bạn không khớp với biểu thức chính quy, $cache_control biến sẽ có một giá trị trống và nginx sẽ không thêm Thực dụngKiểm soát bộ đệm tiêu đề cho phản hồi của nó cả.

Điểm:1
lá cờ us

Điều này không thực sự trả lời câu hỏi của bạn, nhưng hiển thị một cách ưa thích để cung cấp nội dung tĩnh với nginx.

Vì dường như bạn đang chạy ứng dụng web trên cùng một máy chủ, tôi khuyên bạn nên cung cấp các tệp tĩnh trực tiếp bằng nginx.

gốc/đường dẫn/đến/webroot;

vị trí ~* \.(js|jss)$ {
    hết 180đ;
    add_header Pragma "công khai";
    add_header Kiểm soát bộ đệm "công khai;

    try_files $uri =404;
}

vị trí ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    hết hạn 365d;
    add_header Pragma "công khai";
    add_header Kiểm soát bộ đệm "công khai";

    try_files $uri =404;
}

Cái này vẫn có các định nghĩa trùng lặp cho bộ nhớ đệm. Bạn có thể loại bỏ một số trùng lặp bằng cách chỉ định các lệnh trong tệp riêng biệt và sử dụng bao gồm để bao gồm tệp trong cấu hình của bạn.

Bạn sẽ nhập thông tin sau để proxy_header.conf tập tin:

add_header Pragma "công khai";
add_header Kiểm soát bộ đệm "công khai";

Và trong cấu hình của bạn:

vị trí ~* ... {
    bao gồm /path/to/webroot;
    hết hạn 365d;
}

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.