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

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

Конфигурация:

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
задан 28 January 2019 в 04:01
2 ответа

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

В итоге я смонтировал бакет и просто использовал nginx в файловой системе.

См. https: // github.com / maciekrb / gcs-fuse-sample

0
ответ дан 5 December 2019 в 04:19

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

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

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

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

1
ответ дан 30 January 2020 в 16:38

Теги

Похожие вопросы