提问人:Eygonb 提问时间:6/30/2023 更新时间:7/1/2023 访问量:78
Nginx 并不总是处理proxy_pass请求
Nginx doesn't always handle proxy_pass requests
问:
我在docker-compose中有一个应用程序,在Nginx中有一个Vue.js前端和一个后端。在 Nginx 配置中,我有两个代理:一个用于后端请求,另一个用于文件服务器(我使用 yandex cloud s3 存储)。代理到后端的目的是绕过对 HTTP 主机请求的限制,而代理到文件服务器是为了绕过下载属性的同源限制。
在前端,有一个按钮可以打开几个带有 download 属性的链接,以通过代理链接(localhost/download/filename.mp4而不是 example.com/filename.mp4)从文件服务器下载文件。但是,当按下按钮时,不是下载,例如 10 个文件,而是只下载了几个文件,其余的显示“网络错误”。在 Nginx 日志中,很明显,在 10 个请求中,只有 1-2 个被处理。
我的 nginx 配置
events {
}
http {
include /etc/nginx/mime.types;
server {
listen 443 ssl;
ssl on;
server_name https://localhost;
access_log /var/log/nginx/access.log;
ssl_certificate /etc/nginx/ssl/fullchain-demo.crt;
ssl_certificate_key /etc/nginx/ssl/pk-demo.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
location /api/ {
proxy_pass http://backend:8080/;
}
location /download/ {
proxy_pass https://example.com/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
listen [::]:80;
server_name localhost;
return 301 https://$server_name$request_uri;
}
}
我在下载 nginx 和 docker-compose 之外的文件时测试了前端,并下载了本地文件,一切正常。
是什么原因导致了这个问题,如何解决?
答:
您的问题可能源于多种因素,包括浏览器限制、Nginx 配置错误或后端/文件服务器问题。让我们考虑几个选项:
浏览器的局限性:浏览器经常对一次可以与单个域建立的连接数设置限制。在 Chrome 中,每个网域允许 6 个连接。由于此限制,如果您尝试从同一域同时下载六个以上的文件,则可能无法下载某些文件。
同时连接或请求的数量可能会受到 Nginx 设置的限制。在 Nginx 配置文件中搜索 worker_connections、worker_processes 和 keepalive_timeout 等指令。
文件服务器后端的限制或并发连接或请求的数量可能是某些下载请求失败的原因。如果可行,请在文件服务器日志或后端日志中查找有关请求失败原因的更多详细信息。
您可以尝试以下操作来缓解该问题:
如果问题与浏览器相关,请错开下载请求以防止超出限制。这可以通过对下载按钮进行编程来完成,使其比之前的下载晚一点开始每个连续的下载。
如果问题出在 Nginx 上,请尝试提高worker_connections和worker_processes限制以处理更多并发请求。同时增加keepalive_timeout以防止连接过早闭合。
更改后端/文件服务器设置:如果后端或文件服务器是问题的根源,则可能需要更改后端或文件服务器的设置,以允许更多同时连接或请求。根据您使用的软件或服务,具体过程会有所不同。
调查网络问题:该问题可能是由网络故障引起的。要检查是否存在任何明显的网络问题,请使用 traceroute、ping 和 mtr 等程序。
在排除故障和调整时,请密切关注系统如何使用其资源(CPU、内存、网络等)。通过这样做,您将帮助避免在尝试解决问题时使系统负担过重。
希望这会有所帮助。
评论