Прокси-сервер NGINX в корзину GCS с перенаправлением всех URL-адресов в index.html, получая 200 пустых ответов на вложенные маршруты

Я настраиваю обратный прокси-сервер из NGINX в корзину GCP Cloud Storage, содержащую статические HTML, JS, файлы изображений, с перезаписью для всех несоответствующих URL-адресов в index.html, поскольку это приложение на одной странице.

Config:

user nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include           /etc/nginx/mime.types;
    default_type      application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" upstream: "$upstream_addr"';
    access_log        /var/log/nginx/access.log  main;

    server_tokens     off;

    sendfile        on;

    keepalive_timeout  65;

    gzip              on;
    gzip_disable      "msie6";
    gzip_comp_level   6;
    gzip_min_length   1100;
    gzip_buffers      16 8k;
    gzip_proxied      any;
    gzip_types
        text/plain
        text/css
        text/js
        text/xml
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xml+rss;

    resolver          8.8.8.8 valid=300s ipv6=off;
    resolver_timeout  10s;

    upstream gcs {
       server          storage.googleapis.com:443;
       keepalive       128;
    }


    proxy_cache_path      /var/cache/nginx keys_zone=google-cloud-storage:10m inactive=1h;
    proxy_cache           google-cloud-storage;
    proxy_cache_key       "$host/$proxy_host$uri";
    proxy_cache_valid     200 1m;


    server {
        listen          8080;

        recursive_error_pages on;

        if ( $request_method !~ "GET|HEAD" ) {
            return 405;
        }

        location = / {
            rewrite ^.*$ /index.html last;
        }

        location = /healthz/ {
            access_log off;
            return 200;
        }

        location / {
            proxy_set_header        Host storage.googleapis.com;
            proxy_set_header        Cookie "";
            proxy_set_header        Authorization "";
            proxy_set_header        Connection "";
            proxy_hide_header       x-goog-hash;
            proxy_hide_header       x-goog-generation;
            proxy_hide_header       x-goog-metageneration;
            proxy_hide_header       x-goog-stored-content-encoding;
            proxy_hide_header       x-goog-stored-content-length;
            proxy_hide_header       x-goog-storage-class;
            proxy_hide_header       x-guploader-uploadid;
            proxy_hide_header       x-xss-protection;
            proxy_hide_header       x-goog-meta-goog-reserved-file-mtime;
            proxy_hide_header       accept-ranges;
            proxy_hide_header       alternate-protocol;
            proxy_hide_header       Set-Cookie;
            proxy_hide_header       Expires;
            proxy_hide_header       Cache-Control;
            proxy_ignore_headers    Set-Cookie;
            proxy_http_version      1.1;
            proxy_intercept_errors  on;
            proxy_method            GET;
            proxy_pass_request_body off;

            proxy_ignore_headers    "Expires" "Cache-Control";


            add_header              X-Cache $upstream_cache_status;



            error_page              404 =200 /index.html;



            expires 1h;
            add_header Cache-Control "private";


            proxy_pass              https://gcs/my-bucket-name$uri;
        }
    }
}

Итак, вот проблема:

  1. Без proxy_cache присутствует, первый запрос к /nested/path возвращает 200 OK с index.html
  2. Мягкая перезагрузка из браузера отправляет заголовки if-modified-since и / или if-none-match Заголовки прокси, но получает ответ 200 OK с пустым содержимым. (Это действительно должно быть 304?)
  3. При полной перезагрузке возвращается 200 с правильным содержимым index.html.
  4. С proxy_cache настоящее время 304 возвращается правильно.
  5. Запросить корневой путь / ведет себя корректно без proxy_cache,

Как я могу обеспечить правильное поведение при мягкой перезагрузке без proxy_cache?

0 ответов

Я никак не мог заставить эту работу работать, хотя вот предположительно работающий пример: https://github.com/presslabs/gs-proxy

Я закончил монтировать ведро и просто использовать nginx в файловой системе.

Смотрите https://github.com/maciekrb/gcs-fuse-sample

Вы можете попробовать что-то вроде этого:

    location = / {
        proxy_pass http://www.mybucket.com/index.html;
    }

    location ~* /(.*)$ {
        rewrite /(.*) / ;
    }

Для www.mybucket.com должна существовать запись CNAME, указывающая на storage.googleapis.com, а маршрутизатор одностраничного приложения должен управлять обращениями 404.

Другие вопросы по тегам