Date: Thu, 25 Oct 2007 11:19:46 +0300
From: Alex Vorona <voron@xxxxxxxxxx>
Reply-To: nginx-ru@xxxxxxxxx
To: nginx-ru@xxxxxxxxx
Subject: Re: замирает скачивание файлов
tswiah@xxxxxxxxxxxxxxxxxxxxxxxxxx пишет:
Господа, подскажите, куда копать.
Ситуация такова: имеется довольно нагруженный файловый сервис на линуксе.
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?