我正在配置从 NGINX 到 GCP 云存储存储桶的反向代理,其中包含静态 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;
}
}
}
问题是这样的:
- 没有现在
proxy_cache
,第一个请求/嵌套/路径返回 200 OK 和 index.html - 浏览器的软重新加载会将标头
if-modified-since
和/或if-none-match
标头发送到代理,但会得到200 OK 响应,内容为空白。(其实应该是304吧?) - 硬重新加载返回 200 并显示正确的 index.html 内容。
- 和现在
proxy_cache
,304 已正确返回。 - 请求根路径/ 在没有 的情况下也能正确运行
proxy_cache
。
我怎样才能确保在没有的情况下软重新加载的正确行为proxy_cache
?
答案1
我无法以任何方式完成这项工作,尽管这里有一个据称可以工作的例子:https://github.com/presslabs/gs-proxy
我最终安装了存储桶并简单地通过文件系统使用 nginx。
答案2
您可以尝试这样的方法:
location = / {
proxy_pass http://www.mybucket.com/index.html;
}
location ~* /(.*)$ {
rewrite /(.*) / ;
}
应该存在指向 storage.googleapis.com 的 www.mybucket.com 的 CNAME 记录,并且单页应用程序路由器应该管理 404 情况。