Il y a un problème avec nginx
. Il ferme la connexion avant que le client ne termine le téléchargement. On dirait:
$ wget -O /dev/null http://www.site.com/images/theme/front/clean.jpg
--2012-07-11 21:37:03-- http://www.site.com/images/theme/front/clean.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 90707 (89K) [image/jpeg]
Saving to: `/dev/null'
26% [===============> ] 24,291 --.-K/s in 8.7s
2012-07-11 21:37:12 (2.74 KB/s) - Connection closed at byte 24291. Retrying.
--2012-07-11 21:37:13-- (try: 2) http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 66416 (65K) remaining [image/jpeg]
Saving to: `/dev/null'
53% [+++++++++++++++============> ] 48,555 --.-K/s in 8.7s
2012-07-11 21:37:23 (2.74 KB/s) - Connection closed at byte 48555. Retrying.
--2012-07-11 21:37:25-- (try: 3) http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 42152 (41K) remaining [image/jpeg]
Saving to: `/dev/null'
100%[+++++++++++++++++++++++++++========>] 90,707 --.-K/s in 0.1s
2012-07-11 21:37:25 (311 KB/s) - `/dev/null' saved [90707/90707]
en même temps avec des images plus petites tout va bien:
$ wget -O /dev/null http://www.site.com/images/theme/front/grease.jpg
--2012-07-11 21:41:28-- http://www.site.com/images/theme/front/grease.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21404 (21K) [image/jpeg]
Saving to: `/dev/null'
100%[====================================>] 21,404 --.-K/s in 0.07s
2012-07-11 21:41:29 (316 KB/s) - `/dev/null' saved [21404/21404]
C'est la raison pour laquelle cette image ne peut pas être dessinée en taille réelle dans le navigateur. Je ne peux en voir que la tête.
Nginx est configuré comme front-end et apache comme back-end. Le lien direct vers apache fonctionne bien, il y a donc un problème dans nginx. Ai-je raison?
configuration nginx:
user satellite;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
keepalive_timeout 0;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
client_max_body_size 100m;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server {
listen 123.234.123.234:80;
server_name site.com www.site.com;
location ~* ^/(admin/|dump/|webmail/|myadmin/|webim/) {
proxy_pass http://123.234.123.234:8080;
proxy_redirect http://site.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://123.234.123.234:8080;
proxy_redirect http://site.com:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache ino;
proxy_cache_valid 12h;
proxy_hide_header "Set-Cookie";
proxy_ignore_headers "Cache-Control" "Expires";
}
location ~* ^.+\.(jpg|swf|flv|ico|txt|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
access_log /home/satellite/logs/site.com.nginx.access.log;
error_page 404 = @fallback;
if ( $host ~* ^((.*).site.com)$ ) {
set $proot /home/satellite/www/$1;
break;
}
if ( $host = "www.site.com" ) {
break;
}
if ( $host = "site.com" ) {
break;
}
root /home/satellite/www/site.com;
}
location @fallback {
proxy_pass http://123.234.123.234:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
où dois-je creuser pour résoudre ce problème?
nginx
web-server
se ruer
la source
la source
sendfile
?Réponses:
La principale chose que j'ai oubliée est de vérifier
/var/log/nginx/error.log
.J'ai donc corrigé les
/var/lib/nginx/proxy/*
permissions des répertoires (sudo chown -R www-data:www-data /var/lib/nginx/proxy/*
) et maintenant tout fonctionne très bien. Merci à tous pour votre aide.la source
Une raison possible de la fermeture de la connexion est une connexion lente et courte
keepalive_timeout
. La valeur par défaut pour lekeepalive_timeout
est 75s. S'il est trop court et que la connexion est lente, alors il pourrait être fermé trop tôt.L'une des raisons pour lesquelles le téléchargement de votre image peut être lent est votre application. Si vous utilisez une application Ruby-on-Rails avec un pipeline d'actifs en combinaison avec Nginx, le téléchargement de l'image peut être lent car vous utilisez les mauvaises URL d'image (sans empreinte digitale générée par le pipeline d'actifs). Les aides Rails asset_path et image_tag génèrent les bons fichiers de formulaire urls avec empreinte digitale qui peuvent être téléchargés rapidement.
la source
Une autre chose très importante à vérifier est la suivante: assurez-vous qu'il vous reste de l'espace disque!
Pour moi, c'était comme suit:
Pour moi, nginx n'a pas pu écrire sur le disque, ce qui a finalement causé le même problème! J'espère que cela aide quelqu'un!
la source
Votre taux de téléchargement est incroyablement bas. (2,74 Ko / s!). Obtenez-vous le même résultat lorsque vous exécutez wget sur la même machine où se trouve Nginx? Il se pourrait que Nginx réagisse raisonnablement à une demande sur une liaison très lente.
Sinon, je recommande d'explorer les différentes directives de temps dans les documents Nginx . Recherchez chaque mention de «timeout» sur la page et voyez si vous trouvez que c'est une bonne correspondance. Par exemple, vous pouvez voir que vous expirez dans ce qui semble être des intervalles de 10 secondes, donc tout délai d'environ 10 secondes devrait faire l'objet d'un examen supplémentaire.
Par exemple, les lingering_timeout directive est forcée à 10 secondes, de sorte que vous pouvez vérifier cela.
Vous devriez également chercher à savoir pourquoi la connexion avec votre client est apparemment si lente.
Une autre idée: essayez un autre client, comme
curl
, et voyez que vous obtenez le même résultat qu'avecwget
. Si celacurl
fonctionne bien, vous devriez soupçonner qu'il y a quelque chose d'étrange àwget
faire la demande.la source
Vérifiez la lingering_time valeur nginx.conf. Ce sera par défaut réglé sur 30sec. Donc, ce que cela fera, c'est que nginx attendra au maximum 30 secondes pour que le client envoie des données.
Si vous effectuez un téléchargement ou un POST d'un fichier qui peut prendre plus de 30 secondes, le serveur nginx réinitialisera la connexion au client en envoyant un paquet RST au client si le temps de téléchargement dépasse 30 secondes.
Pour que le nginx attende plus de temps pour écouter les données client, définissez cette valeur sur une valeur supérieure.
Pour des informations détaillées sur lingering_time, consultez-les ici lingering_time
la source