замирает скачивание файлов

Alex Vorona voron at amhost.net
Thu Oct 25 12:19:46 MSD 2007


tswiah at innovativemarketing.com.ua пишет:
>
> Господа, подскажите, куда копать.
>
> Ситуация такова: имеется довольно нагруженный файловый сервис на 
> линуксе. nginx работает как фронтэнд: проксирует на апач практически 
> все, кроме мелкой статики, и работает с fastcgi для скриптов, которые 
> используются для собственно скачивания файлов. Файлы отдаются с 
> помощью X-Accel-Redirect.
> Трафика сейчас в районе 100 мегабит (бывает и до 115), однако 
> периодически возникает проблема:
> скачивание файла просто застывает в какой-то момент.
>
> Железо:
> - intel core 2 quad
> - 4 gb ram
> - "типа железный raid" интеловый, на 3 винта, уровень 0, работающий с 
> помощью dmraid
> uptime в районе 2, в пиковой нагрузке - около 4
>
> sysctl:
> net.ipv4.tcp_syncookies=1
> net.ipv4.tcp_fin_timeout = 1
> net.ipv4.tcp_tw_recycle = 1
> net.ipv4.tcp_keepalive_time = 1800
>
> Конфиг nginx:
>
> === nginx.conf ===
>
> worker_processes 4;
>
> worker_rlimit_nofile 10240;
> worker_rlimit_sigpending 32768;
> worker_priority 5;
>
> events {
>     worker_connections  20480; }
>
worker_connections  должны быть меньше  worker_rlimit_nofile с расчётом 
чтобы воркер мог открывать файлы и делать запросы на бэкенд.
Также попробуйте явно задать метод epoll если у вас 2.6.x ядро, или 
сравните poll и rtsig, если 2.4.x
> error_log  /var/log/nginx/error.log;
>
> http {
>     include       /etc/nginx/mime.types;
>     default_type  application/octet-stream;
>
> '"$upstream_response_time"';
>
>     access_log  /var/log/nginx/access.log;
>
>     gzip on;
>     gzip_proxied any;
>     gzip_min_length  10240;
>     gzip_buffers     32 64k;
>     gzip_types       text/html application/x-javascript text/css 
> text/xml text/plain;
>
>     client_header_timeout  60;
>     client_body_timeout    60;
>     send_timeout           120;
>
>     client_max_body_size       1800m;
у вас реально заливают 1800Мб через http POST?  Обычно хватает 10Мб
>     client_body_buffer_size    128k;
>     client_header_buffer_size    4k;
>     large_client_header_buffers  16 8k;
>
>     sendfile       on;
>     sendfile_max_chunk 1024k;
пробовали менять размер чанка?
>     tcp_nopush     on;
>     tcp_nodelay    on;
>     output_buffers   32 256k;
>     postpone_output  1460;
>
>     lingering_time     30;
>     lingering_timeout  6;
>     reset_timedout_connection  on;
>
>     keepalive_timeout  0;
>     optimize_server_names on;
>
>     proxy_read_timeout          180;
>     proxy_connect_timeout       60;
>     proxy_send_timeout          180;
>
>     msie_padding                on;
>
>     proxy_buffer_size           32K;
>     proxy_buffers               64 512K;
>     proxy_busy_buffers_size     1024K;
>     proxy_temp_file_write_size  1024K;
>
возможно будет дешевле проксировать ответ бэкенда налету, чем 
буферизировать его на диск, начать можно с
proxy_max_temp_file_size  0;
>     server {
>         listen       <ip_address>:80 default backlog=1024 
> rcvbuf=131072 sndbuf=1048576 deferred;
великоваты буферы - вы видео раздаёте ?
>         server_name  <server_name>;
>
>        location / {
>                 proxy_pass      http://<ip_of_backend>;
>                 proxy_redirect     off;
>                 proxy_set_header  Host       $host;
>                 proxy_set_header  X-Real-IP  $remote_addr;
>                 proxy_set_header  REMOTE_ADDR  $remote_addr;
>                 proxy_set_header  REMOTE_USER  $remote_user;
>                 proxy_set_header  HTTP_COOKIE  $http_cookie;
>                 proxy_set_header  REQUEST_METHOD  $request_method;
>
>                 proxy_set_header   X-Forwarded-For 
> $proxy_add_x_forwarded_for;
зачем используете X-Forwarded-For - обычно хватает X-Real-IP и 
mod_realip&аналоги на бэкенде
>         }
>
>         location /img {
>                 root /var/www/<site>/htdocs/www;
>         }
>
>         location /js {
>                 root /var/www/<site>/htdocs/www;
>         }
>
>         location /css {
>                 root /var/www/<site>/htdocs/www;
>         }
>
>         location /favicon.ico {
>                 root /var/www/<site>/htdocs/www;
>         }
>
>         location /download/ {
>                 root /var/www/<site>/fcgi;
>                 if ($uri ~ '^/download/(.*)$') {
>                         set $file $1;
>                 }
>                 rewrite ^/download/(.*) 
> /download/index_dload.php?url=$file last;
>         }
>
>         location ~ ^/download/.+\.php$ {
>             fastcgi_pass   unix:/tmp/spawn-fcgi.socket;
>             fastcgi_index  index_test.php;
>
>             fastcgi_param  SCRIPT_FILENAME 
> /var/www/<site>/fcgi$fastcgi_script_name;
>             fastcgi_param  QUERY_STRING     $query_string;
>             fastcgi_param  REQUEST_METHOD   $request_method;
>             fastcgi_param  REQUEST_URI      $request_uri;
>             fastcgi_param  CONTENT_TYPE     $content_type;
>             fastcgi_param  CONTENT_LENGTH   $content_length;
>         }
>     }
>
> === nginx.conf ===
>
> Буду очень признателен за любые подсказки.
>
что говорит iostat на дисках, какой статус имеют воркеры nginx?





More information about the nginx-ru mailing list