问题:
当我试图在NGINX的server.conf文件中添加缓存逻辑时,所有静态资源都会收到404
错误。
目标:
我希望通过NGINX为/static/*文件目录中的特定文件类型提供缓存头信息。我希望这些头信息告诉客户端(浏览器)将静态文件缓存在本地。
背景:
在此示例中,我将使用www.example.com
代替我的域名。
我有两个相互感知的Docker容器。一个是接收Web连接的NGINX服务器,另一个是使用JINJA创建动态HTML模板的Flask容器,用于后端处理。
NGINX容器有一个名为/static的文件夹,其中包含.css、.js、.png、.jpg等文件。/static文件夹结构如下:
/static文件结构
/static
├── /assets
│ └── sitemap.xml
│ └── otherfiles...
└── /img
│ └── images...
└── /js
│ └── jsFiles...
└── /css
│ └── cssFiles...
NGINX配置 - 可用
server{
listen 80;
server_name <www.example.com>;
return 301 <https://www.example.com>$request_uri;
}
server {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
listen 443 http2 ssl;
server_name <www.mydomain.com>;
ssl_certificate <certpath>
ssl_certificate_key <privatekeypath>
large_client_header_buffers 4 16k;
location / {
proxy_pass http://flask-app-docker:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /robots.txt {
add_header Content-Type text/plain;
return 200 "User-agent: *\nAllow: /\nSitemap: https://<www.example.com>/sitemap.xml";
}
location /sitemap.xml {
add_header Content-Type application/xml;
try_files $uri /static/assets/sitemap.xml;
}
location /static {
rewrite ^/static(.*) /$1 break;
root /static;
}
}
NGINX配置 - 故障
server{
listen 80;
server_name <www.example.com>;
return 301 <https://www.example.com>$request_uri;
}
server {
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
listen 443 http2 ssl;
server_name <www.mydomain.com>;
ssl_certificate <certpath>
ssl_certificate_key <privatekeypath>
large_client_header_buffers 4 16k;
# ------ Start of caching section which breaks things ------
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Vary Accept-Encoding;
access_log off;
}
# ----------------------------------------------------------
location / {
proxy_pass http://flask-app-docker:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /robots.txt {
add_header Content-Type text/plain;
return 200 "User-agent: *\nAllow: /\nSitemap: https://<www.example.com>/sitemap.xml";
}
location /sitemap.xml {
add_header Content-Type application/xml;
try_files $uri /static/assets/sitemap.xml;
}
location /static {
rewrite ^/static(.*) /$1 break;
root /static;
}
}
NGINX配置文件 - DIFF
以下是添加到文件中会破坏配置的行:
# ------ Start of caching section which breaks things ------
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Vary Accept-Encoding;
access_log off;
}
# ----------------------------------------------------------
编辑 2020年11月9日 仍然无法根据文件扩展名实现缓存。但是,我成功地通过将静态文件放入自己的文件夹中,并在所有文件上设置缓存头来实现了绕过。
我更新了上面示例中的/static
位置块,看起来像这样。
尽管它不是完美解决方案或我正在寻找的答案,但这个方法可以工作,我可能最终会更新为答案。
location /static {
root /static;
expires 30d;
add_header Vary Accept-Encoding;
}