[Nginx,Си] выплнить действия после отдачи файла

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

[Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение ProFTP » 2010-11-19 16:10:53

идет раздача файлов через Nginx

стоит задача выполнить какие-то действия (perl скрипт запустить или в базу записать и нужно знать какой это файл и путь к нему) после того как файл отдался клиенту
я знаю что можно при начале скачивания выполнить скрипт

а как быть если надо в конце отдачи?
1) может ли есть такая реализаци я в Nginx встроннеая такая?
2) если исходники Си посмотреть реально ли это сделать? (точнее реально ли найти участок в котором можно запустить скрипт лили выполнить действия?)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение Dambo » 2010-11-19 18:23:15

1) отпадает точно, по сенду там(в исходниках ни чего не проверяется и не ставятся флаги)
2)исходники написаны одним проектом под кучу ос )))) (в принципе после просмотра кода через 20-30 минут это не вызывает проблем), самый простой способ обратиться к автору на сайте(http://sysoev.ru/) всё есть, даже можно денишки кинуть, самим разобраться можно если конечно вам оно очень надо :shock: , без консультации разраба не обойдётесь в любом случае, а он соберёт вам версию за минимальную плату я думаю.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение ProFTP » 2010-11-21 3:57:07

я нашел для этого в нгинкс есть post_action

Код: Выделить всё

location ~* ^/media/.+\.(mp3|wma|ogg|ape|flac)$ {
post_action /counter.php?bs=$body_bytes_sent;
}

не могу найти ни где, где этот хэш (хэш число, временный ключ который был послан в nginx для скачиванию файла) который идет в url во внутреннем редиректе?

т.е. мне нужно передать число байт и хэш в скрипт...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение Dambo » 2010-11-22 11:32:28

Интересная и сложная штука на уровне кода, http://abarmotik.livejournal.com/7496.html
тут передают урл на файл и ип в параметрах думаю вам этого вполне хватит для учёта файла.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение ProFTP » 2010-11-22 22:51:32

мне нужно отправить (после того как клиент скачет) что-то одно из:
1) хеш который был прислан для разрешения скачивания файла (чтобы идентифицировать скачивание и файл пользователя)
2) или имя отдаваемого файла, но лучше п.1

я не вижу, где тут это есть?
я там вижу только число байт...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение Dambo » 2010-11-23 10:26:19

Код: Выделить всё

limit_zone lim  $binary_remote_addr 10m;

server {
    listen 80;
    server_name www.example.com;
    

    # Здесь обрабатывается запрос на скачивание файла.
    # урл имеет вид http://example.com/download/-encrypted-file-id-
    location /download {
        set $limit_rate 10k;
        limit_conn lim  1;

	# передаем запрос бэк-енду на расшифровку. В ответе ожидаем хедер X-Accel-Redirect 
        proxy_pass http://127.0.0.1:8888/nginxds/linkDecoder?domain=$host&path=$request_uri;
        proxy_set_header  X-Real-IP  $remote_addr;
        
        add_header Content-Length $content_length;
        add_header Content-Disposition attachment;
    }

    # В этот локейшн переходим по хедеру X-Accel-Redirect от бэк-енда (см. предыдущий локейшн)
    # Предполагается, что все раздаваемые файлы лежат в папке /storage
    location /storage {
        set $postURI $uri;
        set $postIP $remote_addr;
        set $postHOST $host;
        
        post_action @postDownload;

        root /;
        internal;
    }

    # по завершению скачивания файла передаем на бэк-енд переменные установленные
    # в предыдущем локейшыне и отданный объем (в байтах)
    location @postDownload {
        proxy_pass http://127.0.0.1:8888/nginxds/postDownload?domain=$postHOST&uri=$postURI;
        proxy_set_header  X-Real-IP  $postIP;
        proxy_set_header  BytesSent  $body_bytes_sent;
    }
}
5 строчка с низу

Код: Выделить всё

proxy_pass http://127.0.0.1:8888/nginxds/postDownload?domain=$postHOST&uri=$postURI;
Идёт передача в параметрах на скрипт ссылка и хост.

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение Dambo » 2010-11-23 10:41:43

По поводу хеш я не в теме, но прочтите статью по подробнее в ней описывается не по мелочам конечно, но довольно подробно то что вы хотите, то что вы имеете ввиду под хеш там описывается как шифрованная ссылка на файл, которую передают на рас шифратор и получают путь на файл,

Схема работы:
* сервер генерит ссылку, шифруя в ней ИД файла и IP юзера
* по ссылке запрос пользователя попадает в лапы nginx'у
* nginx перенаправляет запрос на бэк-енд сервер
* бэк-енд расшифровывает ссылку и возвращает нгинксу путь к файлу
* нгинкс раздает файл и по завершению отправляет отчет на бэк-енд.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение ProFTP » 2010-11-23 15:18:21

не вижу, где в этом примере название файла или хеш ключ?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение Dambo » 2010-11-23 16:09:09

Хорошо объясни мне тогда, что по твоему хранит переменная $postURI ?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение ProFTP » 2010-11-25 6:47:21

я добавил строку

Код: Выделить всё

  post_action http://www.site.com/to_nginx?bs=$body_bytes_sent;
в полностью рабочий конфиг

Код: Выделить всё

 # Free                                                                  
        location /download_f/ {                                                 
            alias /home/file/cgi-bin/uploads/;                    
            internal;                                                           
            set $limit_rate  40k;     

     limit_conn one 1;                       

  post_action http://www.site.com/to_nginx?bs=$body_bytes_sent;
                            
        }                                                                       
                                                                                
        # Registered                                                            
        location /download_r/ {                                                 
            alias /home/files/cgi-bin/uploads/;                    
            internal;                                                           
            set $limit_rate  40k;                                               
            limit_conn one 1;     
  post_action http://www.site.com/to_nginx?bs=$body_bytes_sent;
                                              
        }                                                                       
                                                                                
        # Premium                                                               
        location /download_p/ {                                                 
            alias /home/file/cgi-bin/uploads/;                    
            internal;                                                           
            #set $limit_rate  500k;                                             
            limit_conn one 50;       
  post_action http://www.site.com/to_nginx?bs=$body_bytes_sent;                                           
        }                                                                       
                                              
но запрос не отправился после того как я скачал файл, в логах apache на http://www.site.com/ в error и access нету запроса
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Dambo
ефрейтор
Сообщения: 61
Зарегистрирован: 2009-11-27 22:29:58

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение Dambo » 2010-11-25 14:54:54

Не являюсь специалистом в скриптовых языках, даже не знаю какой он тут толи perl толи php может ещё какой...
Но различия между передачами данных в другие скрипты:
post_action http://www.site.com/to_nginx?bs=$body_bytes_sent;
и
proxy_pass http://127.0.0.1:8888/nginxds/postDownl ... i=$postURI;
явно вижу, тем более что если разбирать скрипты те которые в интернете и то что выше я приводил, по команде post_action мы переходим в часть кода этого скрипта:

Код: Выделить всё

    location @postDownload {
        proxy_pass http://127.0.0.1:8888/nginxds/postDownload?domain=$postHOST&uri=$postURI;
        proxy_set_header  X-Real-IP  $postIP;
        proxy_set_header  BytesSent  $body_bytes_sent;
    }
которая выполняется после завершения не кого действия, а вот везде передают в другие скрипты(странички или модули) передаются при помощи proxy_pass.
Этот раздел форума посвящён C/C++ переведите тему, рас выяснилось что исходники править не надо) дорога вам в разделы скриптов тут есть такой...
Кстати на форуме http://forum.nginx.org/, post_action многие пользуются и вроде бы всё работает.
ПЕРЕВЕДИТЕ ЭТУ ТЕМУ.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [Nginx,Си] выплнить действия после отдачи файла

Непрочитанное сообщение ProFTP » 2010-12-14 21:44:51

да, забыл написать решение

...вот так:

Код: Выделить всё

# Premium
        location /download_p/ {
            alias /home/files/cgi-bin/uploads/;
            internal;
            #set $limit_rate  500k;
            limit_conn one 50;

 set $postURI $uri;
        set $postIP $remote_addr;
        set $postHOST $host;


            post_action @postDownload; 
       	}


 location @postDownload {
        proxy_pass http://193.201.81.40/to_nginx?bs=$body_bytes_sent&domain=$postHOST&uri=$postURI;
        proxy_set_header  X-Real-IP  $postIP;
        proxy_set_header  BytesSent  $body_bytes_sent;
    }
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение