Re: Медленная отдача статики
29.10.2013 12:02, Дмитрий Андреев пишет: 29.10.2013, 09:47, Михаил Монашёв postmas...@softsearch.ru: Здравствуйте, admin. Много-ли оперы на серваке Как это понять? Видимо он про оперативную память. Хотя может и про мыльную оперу. Кто этот новояз разберет... ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru Да, про нее самую я и спрашивал с целью узнать какими объемами оперативной памяти располагает проблемный сервер, дабы как вариант порекомендовать решение применяемое мной для отдачи большого количества статического контента. Теперь, как я вижу, явились великие гуру умеющие включать debug-лог силой своей мысли, стало быть сервер топикстартера в надежных руках. Не смею больше мешать вам ловить лулзы. -- http://sysadmins.ws ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Медленная отдача статики
Много-ли оперы на серваке и часто-ли меняется что-то в директории со статикой? 28.10.2013 22:34, buddha пишет: Привет всем. Знаю что вопрос уже обсуждался - почитал, попробовал - не выходит. Есть проблема с медленной отдачей статики. Что это значит: Отдача файла(js) ~40kb за 300-400ms на drive.ru или ya 40kb за 70-90ms Т.е. разница в разы. и она ощутима. ping до сервера ~70ms до drive и ya ~ 20-30ms отдает Nginx, config: location / { sendfile on; access_log off; expires 4M; root /var/www/static } сервер находится у хетцнера. Подскажите как можно приблизить скорость отдачи к drive или ya. Если сервер, диск(хотя iowait 0.01-0.05), то подскажите на что его можно заменить Posted at Nginx Forum: http://forum.nginx.org/read.php?21,244201,244201#msg-244201 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- http://sysadmins.ws ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Оптимизация для отдачи статики
Имеются тормоза с отдачей графики - в один поток файлы отдаются влегкую, при скачивании больших файлов складывается канал у клиента :) А вот с отдачей мелких файлов (99% файлов являются картинками с развернутой иерархией директорий) пачкой наблюдаются жесткие тормоза. Раздел с файлами - ramfs, синхронизируется скриптами с SSD-накопителем по мере появления изменений на последнем. Конфиг: user nobody; worker_processes 8; worker_rlimit_nofile 8192; worker_priority -5; timer_resolution 100ms; error_log /var/log/nginx/error.log warn; events { worker_connections 8192; use epoll; } http { includemime.types; default_type application/octet-stream; server_tokens off; ignore_invalid_headers on; if_modified_since before; reset_timedout_connection on; underscores_in_headers on; sendfile on; sendfile_max_chunk 128k; keepalive_requests 1000; keepalive_timeout 30; keepalive_disable msie6; tcp_nopush on; tcp_nodelay on; send_timeout 30; connection_pool_size 256; client_header_buffer_size 256k; large_client_header_buffers 4 256k; client_max_body_size 200M; client_body_buffer_size 256k; client_header_timeout 30; client_body_timeout 30; request_pool_size 32k; postpone_output 1460; access_log off; output_buffers 128 512k; open_file_cache max=20 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 1; open_file_cache_errors off; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_session_cache builtin:1000 shared:SSL:10m; server { listen 0.0.0.0:80 rcvbuf=16834 sndbuf=16384 backlog=32000 default; server_name cdn.image.kg; access_log off; location / { root /var/www/ramdrive; expires max; add_header Cache-Control public; try_files $uri $uri/ /notfound.png; } } # SSL server { listen 0.0.0.0:443 ssl default_server rcvbuf=16384 sndbuf=16384 backlog=32000 ; server_name cdn.image.kg; access_log off; ssl on; ssl_certificate /etc/nginx/ssl/cdn.image.kg.crt; ssl_certificate_key /etc/nginx/ssl/cdn.image.kg.key; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH; location / { root /var/www/ramdrive; expires max; add_header Cache-Control public; try_files $uri $uri/ /notfound.png; } } } И еще в логах очень много такого: 2013/10/10 06:10:51 [alert] 26609#0: *13726 pread() read only 24709 of 24711 from /var/www/ramdrive/6/2/45/125/WD63s4ds84de254.jpg while sending response to client, client: IP, server: cdn.image.kg, request: GET /6/2/45/125/WD63s4ds84de254.jpg?code=4532ew3 HTTP/1.1, host: cdn.image.kg, referrer: https://cdn.image.kg/view.php; ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Оптимизация для отдачи статики
Тормоза проявляются в том, что при пакетнойзагрузке файлов они не отдаются разом, во много потоков, а встают в очередь. При одновременном старте 850 запросов, последний из них обрабатывался в течении 28 секунд. Это при среднем размере картинок в 30-50кбайт! Сеть при этом (по мнению atop) нагружается не более чем на 1%, CPU максимум на 15%. Природа возникновения рамдрайва такова - физически накопитель проживает в соседнем стойле, в SAN. К машине с nginx (KVM-guest) цепляется посредством iscsi. Помимо нас к тому же SAN, возможно по тому же каналу, цепляются и остальные жители хостовой машины. Использование рамдрайва позволяет при сохранении высокой скорости чтения избежать зависимости от возможных лагов в сети, кратковременного извлечения винта из стораджа (например в случае замены). 10.10.2013 10:37, Daniel Podolsky пишет: А вот с отдачей мелких файлов (99% файлов являются картинками с развернутой иерархией директорий) пачкой наблюдаются жесткие тормоза. Жесткие тормоза - это как именно выражается? Мало rps? Мала утилизация канала? Высока нагрузка на CPU? Раздел с файлами - ramfs, синхронизируется скриптами с SSD-накопителем по мере появления изменений на последнем. А что именно заставило вас создать конфигурацию с рамдрайвом? С чем не справился кеш ФС? ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Адаптация правил работающих в mod_rewrite для nginx
Доброго времени суток. Нужно перенести один виртуалхост с сервера с apache на сервер с nginx. Все бы ничего, да вот правила rewrite там жуткие, даже не представляю как это все запустить под nginx. в httpd.conf: RewriteMap decode prg:/usr/local/etc/apache22/decode.pl decode.pl - перловый скрипт, выправляющий закодированые части url, такие как слеши, пробелы и пр спецсимволы в читабельный и понимаемый mod_proxy вид: #!/usr/bin/perl use URI::Escape; $| = 1; while (STDIN) { print uri_unescape($_); } в .htaccess: RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^url=(.*)$ [NC] RewriteRule .* ${decode:%1} [P,L,NE] Можно-ли такую вот конструкцию реализовать в nginx и если да, то как? ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
31.07.2013 14:06, Antohat пишет: Добрый день, На сервере отключен IPv6. На nginx настроено проксирование на upstream c поддержкой IPv4 и IPv6. Nginx периодически (раз в 5 секунд) пытается отправлять запросы на IPv6 и соответственно обламывается с ошибками: 2013/07/30 00:25:06 [error] 1930#0: *1482670 connect() to [::C:DDD:E:F:GGG:HHH]:443 failed (101: Network is unreachable) while connecting to upstream, client: AA.BB.CC.DD, server: example.com, request: GET /download/file HTTP/1.0, upstream: https://[::C:DDD:E:F:GGG:HHH]:443/download/file;, host: example.com Как можно отключить IPv6 для proxy_pass? # nginx.conf: upstream download { server download.example.com:443; keepalive 8; } location /download { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ; proxy_ignore_headers X-Accel-Redirect; proxy_http_version1.1; resolver 8.8.8.8; resolver_timeout 5s; proxy_passhttps://download; } nginx -V: nginx version: nginx/1.4.2 built by gcc 4.7.2 (Debian 4.7.2-5) TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_spdy_module --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --with-ld-opt=-Wl,-z,relro --with-ipv6 uname -a: Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241403,241403#msg-241403 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru Вы используете ipv6? Если нет - попробуйте отключить его в системе. Выполните: sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1 sysctl -w net.ipv6.conf.lo.disable_ipv6=1 и перезапустив nginx попробуйте воспроизвести ошибку. Если ошибка не воспроизведется - добавьте в /etc/sysctl.conf это: net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx использует IPv6 в proxy pass, даже если он отключен
31.07.2013 16:10, Antohat пишет: Ruslan Ermilov Wrote: --- Как-то заставить системный resolver(3) не возвращать IPv6-адреса (ответы типа ) для хоста, на котором отключен IPv6. Попробуйте добиться желаемого эффекта с командой telnet download.example.com Не уверен, что так можно сделать... Может быть было бы правильнее, чтобы nginx определял, что IPv6 не настроен и не пытался использовать записи ? По крайней мере такой параметр в конфиге точно не был бы лишним. Или же использовать IPv4-адреса в конфигурации nginx. Кстати, в приведенной конфигурации директива resolver не нужна. К сожалению не можем, т.к. IP апстрима могут меняться без предварительного уведомления. Posted at Nginx Forum: http://forum.nginx.org/read.php?21,241405,241407#msg-241407 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru Заюзайте резольвер не поддерживающий . ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Nginx and logrotate
01.08.2013 03:07, Sergey Kobzar пишет: Linux 3.8.13-gentoo x86_64 nginx-1.4.1-r2 logrotate-3.8.4 cat /etc/logrotate.d/nginx: /var/log/nginx/*.log { daily rotate 5 missingok nocompress sharedscripts postrotate test -r /run/nginx.pid kill -USR1 `cat /run/nginx.pid` endscript } /etc/logrotate.conf: weekly rotate 4 create dateext compress notifempty nomail noolddir include /etc/logrotate.d /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # ls -alh /var/log/nginx/ | grep access.log -rw-r--r-- 1 nginx root0 Jul 30 03:10 access.log -rw-r--r-- 1 nginx root 4.7G Jul 18 10:09 access.log-20130712 -rw-r--r-- 1 nginx root 7.6G Jul 29 09:46 access.log-20130719 -rw-r--r-- 1 nginx root 1.4G Jul 31 22:04 access.log-20130730 Т.е. запись в access.log не идет, а растет access.log-20130730. kill -USR1 `cat /run/nginx.pid` ситуацию не меняет. Что я не так? Спасибо. ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru У меня (RHEL 6) в качестве postrotate-команды используется эта: /etc/init.d/nginx reload /dev/null 2/dev/null || true в скрипте /etc/init.d/nginx в функции отвечающей за reload используется killproc $nginx -HUP Попробуйте сменить -USR1 в вашей команде на -HUP? Вот так это выглядит целиком: /var/log/nginx/*log { missingok compress notifempty sharedscripts postrotate /sbin/service nginx reload /dev/null 2/dev/null || true endscript } ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Проксирование рерайтом httpd = nginx, возможно-ли?
Возможно-ли конвертировать такой конфиг для апача под nginx? Location / Require all granted RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^url.*)$ [NC] RewriteRule .* %1 [P,L] /Location Виртуалхост с этим локейшеном обрабатывает url типа https://proxy.tld/?url=""> и проксирует на соответствующий бэкенд в локалке. Насколько я понимаю, nginx не имеет опции рерайта наподобие апачевской [P], а как иначе нарисовать - ума не приложу. ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Регулярки для map
Благодарю за помощь с первой регуляркой - это как раз то, что доктор прописал. А вот во втором случае встроенными переменными не обойтись, поскольку указанный мной url http(s)://test.local/(site([1-9])) не является переданным от клиента (иначе проблемы №2 не было бы вообще). Данная строка изымается nginx'ом из бд посредством модуля ngx_postgres исходя из того, что вернет как раз-таки та самая первая регулярка. Далее ее нужно раздробить на 3 части и если $протокол = http://, то спроксировать на $домен, если конечный сайт в подпапке - добавить $путь к $request_uri, если же $протокол = https:// - тогда просто сделать редирект. Вот как-то так у меня задача поставлена. 25.06.2013 17:53, Kron пишет: 1. map $request_uri $num { ~*/pages/Test/(?n\d+) $n; } 2. http://nginx.org/ru/docs/http/ngx_http_core_module.html читать про встроенные переменные 25.06.2013, 11:31, ad...@sysadmins.el.kg ad...@sysadmins.el.kg: Доброго всем! Помогите плз с регулярками для map'ов. Имеется строка типа: https://www.facebook.com/pages/Test/123456789123456?sk=app_987654321987654 которая приходит как реферал. Нужно получить из нее первый блок цифр - 123456789123456. Также имеется строка http(s)://test.local/(site([1-9])) которую мне нужно разбить на 3 части - протокол, домен, uri. То есть получить отдельно http(s)://, test.local и /(site([1-9])). Только что-то я не совсем понимаю как их составлять... :-[ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Проксирование по referrer
Да, согласен, задача весьма нетривиальная. Оттого и прошу помощи. Предложеный вариант с использованием map не подходит потому, что map работает в блоке http, мне же критично запускать его из server. Вкратце о приложении - веб-страница, хрянящаяся на site[1-9].tld и загружаемая на сторонние сайты посредством iframe.../iframe. На каждом бэкенде она разная, количество бэкендов растет в геометрической прогресии, а некоторые сайты, внедряющие к себе это приложение (напр. facebook) требуют ssl-шифрование. Чтобы избежать каши с ssl-сертификацией всех бэкендов было сочтено целесообразным использование прокси, шифрующего соединения, и проксирующего на http-бэкенды. как-то так можно попробовать вытащить map $http_referer $backend { default -; ~*(?b[^\;]+)(?:\;|$) $b; } это решит грабли No.1, но задача в целом выглядит весьма запутанной. 21 июня 2013 г., 16:45 пользователь ad...@sysadmins.el.kg ad...@sysadmins.el.kg написал: Доброго всем дня. Пытаюсь поднять сервер для проксирования некоего узкоспециализированого приложения. Аппликуха у себя формирует ссылки на него, с указанием в качестве реферала ссылку на один из серверов за ним. Т.е. в теории это должно выглядеть сл. образом - посетитель жмет на сайте ссылку ведущую на site.tld, прокси на этом самом site.tld разобрав $http_referrer извлекает из него ссылку к site[1-9].tld дописывает ему в куку адрес нужного из этих самых site[1-9].tld и отправляет на соответствующий сервер. Ну а дальнейшие обращения уже на основе кук. Грабли No.1: - предполагал указать адрес прокси в виде переменной: if ($http_referer ~* *\.*) { set $backend извлеченный из реферала домен; } location / { proxy_pass http://$backend; ... Только как? Грабли No.2: то же что и Грабли1 только с куками. ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru