gpt4 book ai didi

NGINX 缩略图生成在 Ubuntu 22 中不适用于空格或 %20,但在 Ubuntu 16 中有效 - Nginx 1.23.0 特定

转载 作者:行者123 更新时间:2023-12-05 02:27:41 24 4
gpt4 key购买 nike

有关 Nginx 版本 1.23.0 的原因,请参阅底部的更新


我多年来一直使用 NGINX 生成图像缩略图,但是刚刚从 Ubuntu 16 切换到 Ubuntu 22,从 Nginx 1.16 切换到 nginx 1.23,它不再适用于包含空格的路径。

这很可能是配置差异而不是与不同版本有关,但据我所知,NGINX 配置是相同的,因此可能与不同的 Ubuntu/Nginx 版本有关。

访问路径中有空格的 URL 时给出的错误只是“400 Bad Request”。

在返回 400 Bad Request 后,访问日志或错误日志中都没有对请求的引用。

nginx 站点配置如下所示,最初基于 this guide

server {
server_name localhost;
listen 8888;

access_log /home/mysite/logs/nginx-thumbnails-localhost-access.log;
error_log /home/mysite/logs/nginx-thumbnails-localhost-error.log error;

location ~ "^/width/(?<width>\d+)/(?<image>.+)$" {
alias /home/mysite/$image;
image_filter resize $width -;
image_filter_jpeg_quality 95;
image_filter_buffer 8M;
}

location ~ "^/height/(?<height>\d+)/(?<image>.+)$" {
alias /home/mysite/$image;
image_filter resize - $height;
image_filter_jpeg_quality 95;
image_filter_buffer 8M;
}

location ~ "^/resize/(?<width>\d+)/(?<height>\d+)/(?<image>.*)$" {
alias /home/mysite/$image;
image_filter resize $width $height;
image_filter_jpeg_quality 95;
image_filter_buffer 8M;
}

location ~ "^/crop/(?<width>\d+)/(?<height>\d+)/(?<image>.*)$" {
alias /home/mysite/$image;
image_filter crop $width $height;
image_filter_jpeg_quality 95;
image_filter_buffer 8M;
}
}

proxy_cache_path /tmp/nginx-thumbnails-cache/ levels=1:2 keys_zone=thumbnails:10m inactive=24h max_size=1000m;

server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name thumbnails.mysite.net;

ssl_certificate /etc/letsencrypt/live/thumbnails.mysite.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/thumbnails.mysite.net/privkey.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

access_log /home/mysite/logs/nginx-thumbnails-access.log;
error_log /home/mysite/logs/nginx-thumbnails-error.log error;

location ~ "^/width/(?<width>\d+)/(?<image>.+)$" {
# Proxy to internal image resizing server.
proxy_pass http://localhost:8888/width/$width/$image;
proxy_cache thumbnails;
proxy_cache_valid 200 24h;
}

location ~ "^/height/(?<height>\d+)/(?<image>.+)$" {
# Proxy to internal image resizing server.
proxy_pass http://localhost:8888/height/$height/$image;
proxy_cache thumbnails;
proxy_cache_valid 200 24h;
}

location ~ "^/resize/(?<width>\d+)/(?<height>\d+)/(?<image>.+)$" {
# Proxy to internal image resizing server.
proxy_pass http://localhost:8888/resize/$width/$height/$image;
proxy_cache thumbnails;
proxy_cache_valid 200 24h;
}

location ~ "^/crop/(?<width>\d+)/(?<height>\d+)/(?<image>.+)$" {
# Proxy to internal image resizing server.
proxy_pass http://localhost:8888/crop/$width/$height/$image;
proxy_cache thumbnails;
proxy_cache_valid 200 24h;
}

location /media {
# Nginx needs you to manually define DNS resolution when using
# variables in proxy_pass. Creating this dummy location avoids that.
# The error is: "no resolver defined to resolve localhost".
proxy_pass http://localhost:8888/;
}
}

我不知道它是否相关,但 nginx-thumbnails-error.log 也经常有以下行,尽管在浏览器中测试响应似乎有效:

2022/07/19 12:02:28 [error] 1058111#1058111: *397008 connect() failed(111: Connection refused) while connecting to upstream, client:????, server: thumbnails.mysite.net, request:"GET/resize/100/100/path/to/my/file.pngHTTP/2.0", upstream:"http://[::1]:8888/resize/100/100/path/to/my/file.png",host: "thumbnails.mysite.net"

访问包含空格的文件时不会出现此错误。

nginx-thumbnails-access.lognginx-thumbnails-error.log 中没有对路径中带空格的文件请求的引用。

但是本地主机的访问日志中有一个条目 nginx-thumbnails-localhost-access.log

./nginx-thumbnails-localhost-access.log:127.0.0.1 - -[29/Jul/2022:10:37:13 +0000] "GET /resize/200/200/testdir/KPjjCTl0lnpJcUdQIWaPflzAEzgN25gRMfAH5qiI.png HTTP/1.0" 400 150 "-""-"

当路径没有空格时,nginx-thumbnails-localhost-access.lognginx-thumbnails-access.log 中都有一个条目

./nginx-thumbnails-localhost-access.log:127.0.0.1 - -[29/Jul/2022:10:43:48 +0000] "GET/resize/200/202/testdir/KPjjCTl0lnpJcUdQIWaPflzAEzgN25gRMfAH5qiI.pngHTTP/1.0" 200 11654 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0Safari/537.36"

./nginx-thumbnails-access.log:185.236.155.232 - -[29/Jul/2022:10:43:48 +0000] "GET/resize/200/202/testdir/KPjjCTl0lnpJcUdQIWaPflzAEzgN25gRMfAH5qiI.pngHTTP/2.0" 200 11654 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0Safari/537.36"

我不知道它是否相关,但名称中带有空格的图像的访问日志条目不包括浏览器用户代理。

./nginx-thumbnails-localhost-access.log:127.0.0.1 - -[29/Jul/2022:10:52:16 +0000] "GET /resize/200/202/testdir/thumbimage.png HTTP/1.0" 400 150 "-" "-"./nginx-thumbnails-localhost-access.log:127.0.0.1 - -[29/Jul/2022:10:52:33 +0000] "GET/resize/200/202/testdir/thumbimage.png HTTP/1.0" 200 11654 "-""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36(KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"


此处请求的是 curl -i

的结果
HTTP/2 400 
server: nginx
date: Thu, 28 Jul 2022 15:44:13 GMT
content-type: text/html
content-length: 150

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

我现在可以确认这是 Nginx 1.23.0 特有的,它还不稳定。

我创建了一个新的 Digital Ocean Droplet,安装了 Nginx 并设置了缩略图服务器,它运行良好。 Ubuntu 22 的默认 nginx 安装是 1.18.0。

然后我升级到 1.23.0,就像我在我的实时服务器上所做的那样:

apt-add-repository ppa:ondrej/nginx-mainline -yapt 安装 nginx

然后缩略图服务器停止处理与我的原始问题相同的问题。

我现在正在研究降级 nginx。


使用以下步骤将 Nginx 降级到 1.18.0 有效:

apt-add-repository --remove ppa:ondrej/nginx-mainlineapt autoremove nginxapt 更新apt 安装 nginx

出于某种原因,我还必须在一台服务器上运行 apt autoremove nginx-core 但不能在另一台服务器上运行。

但是我有点担心 1.18.0 被标记为不再接受安全支持。但是我找不到安装 1.22.0 和测试的简单方法,只有 1.18.0:https://endoflife.date/nginx

最佳答案

您可以尝试的第一件事是 rewrite regex replacement [flag]; 指令在下面的代码中将查找 spaces%20 并将文件名拆分为两个,space%20 将被删除,文件名将在没有它们的情况下被重写,并将被重定向到新的 URL。

rewrite ^(.*)(\s|%20)(.*)$ $1$3 permanent;

另一种可能的解决方案是您可能必须对字符串进行编码以处理文件名中的空格。要在您的代码上尝试:

location ~ "^/crop/(?<width>\d+)/(?<height>\d+)/(?<image>.+)$" {
if ( (?<image>.+)$ ~ (.*)%20(.*) ) {
set (?<image>.+)$ $1$3;
} if ( (?<image>.+)$ ~ (.*)\s(.*) ) {
set (?<image>.+)$ $1$3;
}
(?<image>.+);
}

不过我自己还没有尝试过第二种。

上面的错误似乎无关,但有人发布了 fix to a similar error .

关于NGINX 缩略图生成在 Ubuntu 22 中不适用于空格或 %20,但在 Ubuntu 16 中有效 - Nginx 1.23.0 特定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73036677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com