2010-11-29 5 views
2

Je veux modifier le code source de Nginx (http://nginx.org/download/nginx-0.7.67.tar.gz) donc quand il sert un fichier (lit le fichier à partir du disque) pour compter les octets servis et les stocker quelque part (une base de données peut-être) Puisque je ne comprends pas bien cela (je suis un développeur php) j'ai du mal à trouver cette partie dans la source coude (doit être un regard un moment ou quelque chose) Quelqu'un peut-il m'aider avec ça? Mercimodifier le code source du serveur web nginx

+0

J'ai un indice qui est le ngx_read_file de ngx_open_file mais je ne trouve pas la déclaration des fonctions – PartySoft

+0

Désolé , mais si vous n'êtes pas un développeur C, vous êtes probablement dans une période extrêmement difficile ici. – bmargulies

+0

Eh bien j'ai trouvé la déclaration et c'est juste un renommage à l'original ouvert, lire des fonctions de C, et il est utilisé un peu partout non seulement lors de la lecture d'un fichier pour la sortie au client .. – PartySoft

Répondre

5

Voici une autre approche pour accéder aux informations que vous voulez que nginx fournisse beaucoup plus sûres.

Incluez bytes_sent en tant que colonne dans votre journal d'accès.

Si vous faites référence au HttpLogModule, vous verrez que vous pouvez spécifier bytes_sent en tant que colonne dans le journal d'accès. Combinez cela avec un script php qui analyse le fichier journal (peut-être après la rotation) et vous serez en mesure d'éviter c.

log_format sampleformatname '$remote_addr - $remote_user [$time_local] ' 
      '"$request" $status ' 
      '"$http_referer" "$http_user_agent" "$bytes_sent"'; 

access_log /path/to/logs/access.log sampleformatname; 

Quelques avantages à cette approche:

  • Possibilité de mise à niveau vers les nouvelles versions de nginx sans fusionner vos modifications.
  • bâton avec les outils que vous connaissez (php)
  • de traitement hors ligne
  • simple et plus sûr
+0

Je le fais déjà en passant la demande de manière transparente à php puis avec quelque chose appelé x-forward je contrôle les en-têtes, mais si l'utilisateur veut télécharger un fichier de 4Go et s'arrête à 200mb, je pense qu'il a téléchargé l'ensemble 4Gb c'est mon problème. – PartySoft

+1

J'ai besoin d'escompte tous les 100mB ou plus comme le serveur sert le fichier je pense, et étonnamment il n'y a pas de module pour cela, au moins pour nginx. – PartySoft

+1

Nginx indiquera combien d'octets il a vidés au client, si quelqu'un arrête un téléchargement, le nombre enregistré par nginx sera très proche de ce que le client a effectivement enregistré. –

Questions connexes