Showing posts with label nginx. Show all posts
Showing posts with label nginx. Show all posts

Tuesday, July 31, 2012

nginx: Too many open files

if you have error:
socket() failed (24: Too many open files)

you need change  worker_rlimit_nofile in nginx.conf . (Default: 1024)


#cat  /etc/nginx/nginx.conf
user www-data;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;


worker_rlimit_nofile 4096; ### default is 1024


events {
worker_connections 1024;
# multi_accept on;
}





than restart (reload) nginx  /etc/init.d/nginx restart



and check :


#ps waux|grep nginx
   root 2604 0.0 0.0 9252 908 pts/0 S+ 09:53 0:00 grep --color=auto nginx
   root 3330 0.0 0.2 113516 40324 ? Ss Jul26 0:00 nginx: master process /usr/sbin/nginx
   www-data 18098 0.7 0.2 113516 40168 ? S Jul30 10:35 nginx: worker process


#cat /proc/18098/limits |grep files
  Max open files 4096 4096 files  



Friday, April 29, 2011

how to hide nginx version

To hide nginx version simply  add to nginx.conf next line in http section:

server_tokens off;

Monday, March 28, 2011

413 Request Entity Too Large


413 ( Request Entity Too Large) - returned when the server refuses to process the request because of too large a request body. The server may close the connection to stop further transmission of the request.

One of the most probable causes - including default settings nginx, but rather setting client_max_body_size, which defaults to 1m, making it impossible to download files larger than 1 megabyte.

The documentation describes nginx that client_max_body_size directive sets the maximum size of the body the client's request, indicated by the line "Content-Length" header in the request. If size is greater than a given, the client returns error "Request Entity Too Large" (413).

To solve the problem with downloading files, you need to nginx configuration file directive to increase the value client_max_body_size to the required size of you.

To do this in the file 
/etc/nginx/nginx.conf (for linux ) (or / usr/local/etc/nginx/nginx.conf for freebsd), a section of http, add (or change it if it's already there) parameter to "client_max_body_size 16m; " and then restart nginx using the "service nginx restart " (or "/etc/init.d/nginx restart" or "/usr/local/etc/rc.d/nginx restart").



nginx.conf:

....
http {
    .....
    .....
    client_max_body_size 16m;
    ....
}


Monday, October 18, 2010

nginx + robots

якщо треба записати якусь умови для роботів в nginx
if ($http_user_agent ~* (Yahoo|Nutch|Twiceler|ia_archiver|DotBot|Ask Jeeves|Speedy Spider|Exabot)) {
.......
}

Tuesday, October 12, 2010

nginx на centos

треба на centos-5.5 встановити nginx
centos в своїх стандартних репозиторіях не має nginx-у.. тому треба підключити сторонній репозиторій, наприклад підійде
http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm (для i386)
або
rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm (для x86_64 )

далі треба обновити кеш

yum makecache
і тепер можна встановити nginx
yum install nginx.i386
встановиться nginx 0.8-ої версії..
якщо вам треба 0.7 версія то порібно встановлювати nginx.stable

далі налаштовуємо nginx під свої потреби...
в конфігураційному фалй по замовчуванню варто змінити значееня  worker_processes , бо замовчуванню там 10... оптимально виставити значееня, яке рівне кількості ядер на сервері.

дальше можна було б відключити репозиторій centos.alt.ru, щоб не встановлювати з нього інших програмного забезпечення.. як не як це ж не офіційний репозиторій
в /etc/yum.repos.d/centalt.rep змінити значееня enable на "0"..

якщо треба буде обновити nginx, то

yum --enablerepo=CentALT update nginx

Monday, October 11, 2010

відключити error.log в nginx

відключити error.log в nginx взагалі то не можливо ..
але якщо дуже хочеться то можна  напрпвити всі помилки в /dev/null
ось так:

error_log /dev/null crit; 

Thursday, May 6, 2010

nginx: 414 Request-URI Too Large

414 Request-URI Too Large


треба збільшити буфери
 
large_client_header_buffers  4  8k;
 
можна і так  
client_header_buffer_size    8k;
    large_client_header_buffers  4  8k;

Thursday, February 25, 2010

mod_status для nginx

Есть модуль stub_status

При сборке в configure нужно указать --with-http_stub_status_module

Пример конфигурации:

location /stub_status {
stub_status on;
allow 192.168.1.0/24;
deny all;
}

Выдаёт примерно такое:

Active connections: 36
server accepts handled requests
5690748 5690748 13977519
Reading: 0 Writing: 1 Waiting: 35

Active connections - сколько обслуживается клиентов.

server
accepts - сколько соединений было accept()нуто;
handled - сколько из них было обработано, а не закрыто сразу;
соединение сразу же закрывается, если таблица соединений
переполняется.
requests - сколько облужено запросов. При keep-alive в одном соединении
может быть несколько запросов

Reading - сколько соединений находится в состоянии чтения.
Writing - сколько соединений находится в состоянии записи.
Waiting - keep-alive соединения или же в состоянии обработки запроса

Tuesday, December 29, 2009

how to generate ssl sertificate for apache or nginx

How do I create a self-signed SSL Certificate for testing purposes?

1. Make sure OpenSSL is installed and in your PATH.

2. Run the following command, to create server.key and server.crt files:
$ openssl req -new -x509 -nodes -out server.crt -keyout server.key
These can be used as follows in your httpd.conf file:

SSLCertificateFile /path/to/this/server.crt
SSLCertificateKeyFile /path/to/this/server.key



3. It is important that you are aware that this server.key does not have any passphrase. To add a passphrase to the key, you should run the following command, and enter & verify the passphrase as requested.

$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key


Please backup the server.key file, and the passphrase you entered, in a secure location.


2-nd method:

Generate a private key:

openssl genrsa -des3 -out www.domain.com.ssl.key 1024

Create a CSR:

openssl req -new -key www.domain.com.ssl.key -out www.domain.com.ssl.csr
*note: enter full domain (www.domain.com) for CN (common name)*

Remove password from private key (optional):

openssl rsa -in www.domain.com.ssl.key -out www.domain.com.ssl.key.nopass

Generate self-signed cert:

openssl x509 -req -days 365 -in www.domain.com.ssl.csr -signkey
www.domain.com.ssl.key -out www.domain.com.ssl.crt
*note: use .nopass if you removed the password from the private key*

Hope that helps. I'm not sure about generating a wildcard cert.


Thursday, August 27, 2009

[warn]: duplicate MIME type "text/html" in /usr/local/etc/nginx/nginx.conf

Після обновлення nginx-у з 0.6.37 до версії 0.7.61_1 викило  таке попередження

[warn]: duplicate MIME type "text/html" in /usr/local/etc/nginx/nginx.conf

це повязано з тим що gzip_types завжди дозволяє стискання медотом gzip для даного (text/html) MIME-типу..

тобто в даному випадку test/html завджи є спику mime-типів що потрібно стискати ..

і починаючи з версії  0.7.x  nginx попереджує про це..


тому потрібно або видалити test/html зі списку gzip_typesабо ігнорувати дане попередження .

Friday, August 14, 2009

nginx ssl сертифікати

openssl req -new -x509 -days 999 -nodes -out server.crt -keyout server.key

борьба с DDOS и DOS на уровне nginx

FreeBSD, сетевая Intel fxp, порт 100Мбит, polling, http accept-filter
в sysctl
sysctl kern.maxfiles=90000
sysctl kern.maxfilesperproc=80000
sysctl net.inet.tcp.blackhole=2
sysctl net.inet.udp.blackhole=1
sysctl kern.polling.burst_max=1000
sysctl kern.polling.each_burst=50
sysctl kern.ipc.somaxconn=32768
sysctl net.inet.tcp.msl=3000
sysctl net.inet.tcp.maxtcptw=40960
sysctl net.inet.tcp.nolocaltimewait=1
sysctl net.inet.ip.portrange.first=1024
sysctl net.inet.ip.portrange.last=65535
sysctl net.inet.ip.portrange.randomized=0

в nginx моменты

worker_processes 1;
worker_rlimit_nofile 80000;
events {
worker_connections 50000;
}

server_tokens off;
log_format IP ‘$remote_addr’;
reset_timedout_connection on;

listen xx.xx.xx.xx:80 default rcvbuf=8192 sndbuf=16384 backlog=32000 accept_filter=httpready;

фильтрацию url например по критерию POST index.php?action=login с пустым реферером можно реализовать так
set $add 1;
location /index.php {
limit_except GET POST {
deny all;
}
set $ban “”;
if ($http_referer = “” ) {set $ban $ban$add;}
if ($request_method = POST ) {set $ban $ban$add;}
if ($query_string = “action=login” ){set $ban $ban$add;}
if ($ban = 111 ) {
access_log /var/log/nginx/ban IP;
return 404;
}
proxy_pass http://127.0.0.1:8000; #тут живёт апач
}

Дальше резали на уровне pf - загружали в таблицу IP с которых приходило слишком
много хитов. PF с таблицами работает очень быстро. Исходники парсера логов есть на
http://www.comsys.com.ua/files.

ну и по крону уже раз в минуту добавлять в ip table новые ip из лога

25Мбитный DDoS, преимущесвенно режущийся ip, остатки проходят на nginx, который по критерию обучает ip и остатки проксирует на апач - LA 0, сайт работает.


http://wiz.su/2007/10/28/borba-s-ddos-i-dos-na-urovne-nginx/

Tuesday, July 28, 2009

коды в HTTP-ответе веб-сервера

Что означают коды в HTTP-ответе веб-сервера

Коды ответа четко сгруппированы по нескольким основным разделам:

* Информационныe 100 — Продолжить
* 101 — Переключение протоколов

* Запрос клиента успешен 200 — OK
* 201 — Создан
* 202 — Принято
* 203 — Не авторская информация
* 204 — Нет содержимого
* 205 — Сбросить содержимое
* 206 — Частичное содержимое

* Запрос клиента переадресован, необходимы дальнейшие действия 300 — Множественный выбор
* 301 — Перемещен навсегда
* 302 — Найден
* 303 — Смотреть другой
* 304 — Не модифицирован
* 305 — Использовать прокси-сервер
* 307 — Временно переадресован

* Запрос клиента является неполным 400 — Неправильный запрос
* 401 — Несанкционированно
* 402 — Требуется оплата
* 403 — Запрещено
* 404 — Не найдено
* 405 — Метод запрещен
* 406 — Не приемлем
* 407 — Требуется аутентификация через прокси-сервер
* 408 — Истекло время ожидания запроса
* 409 — Конфликт
* 410 — Недоступен
* 411 — Требуется длина
* 412 — Предусловие неверно
* 413 — Объект запроса слишком большой
* 414 — URI запроса слишком длинный
* 415 — Неподдерживаемый тип медиа
* 416 — Диапазон запроса неудовлетворителен
* 417 — Ожидание неуспешно

* Ошибки сервера 500 - Внутреннняя ошибка веб-сервера
* 501 - Not Implemented
* 502 - Bad Gateway
* 503 - Сервис недоступен
* 504 - Таймаут, Gateway Timeout
* 505 - Версия протокола HTTP не поддерживается

Wednesday, June 3, 2009

nginx - error: ... upstream timed out (60: Operation timed out)

треба збільшити таймаут при читанні від upstraem серверу ( або оптимізувати сторінки щоб вони виконувались за 60 сек.., які є по замовчуванні )

proxy_read_timeout 120;

Monday, April 6, 2009

Nginx → Тюнинг nginx

Nginx → Тюнинг nginx


Для многих из нас настает тот долгожданный день, когда аудитория сайта начинает стремительно расти. Каждое утро мы, затая дыхание, смотрим на графики google analitycs и расплываемся в улибке, когда взят рубеж в очередную тысячу посетителей в день. Как правило, рост посещаемости не совпадает с ростом технической базы и сайт начинает тормозить. Тут в игру вступает сисадмин...

У любого проекта всегда есть что оптимизировать: можно почитать советы по оптимизации на webo.in, установить eaccelerator, memcache, проиндексировать поисковые поля в базе данных. Я предполагаю, что все это уже проделано, а сайт по прежнему тормозит.

Пришло время оптимизировать nginx...


Компиляция nginx

При сборке я обычно руководствуюсь правилом: «отключаю все что не использую». Итак, редко-используемые модули, которые, возможно, вам не пригодятся: mail, mail_ssl_module, http_perl_module, http_flv_module, http_dav_module. Если в будущем некоторое мз модулей будут востребованы, то на перекомпиляцию уйдет несколько минут.

Модули, которые желательно включить при компиляции: http_gzip_static_module, http_stub_status_module.

Вот как выглядит часть моего spec-файла для компиляции nginx (%nginx_datadir,… переменные spec-файла):

./configure \
--prefix=%nginx_datadir \
--conf-path=%nginx_etc/nginx.conf \
--sbin-path=%{_sbindir}/%{name} \
--error-log-path=%nginx_log/nginx.error.log \
--http-log-path=%nginx_log/nginx.log \
--http-client-body-temp-path=%nginx_spool/tmp/client \
--http-proxy-temp-path=%nginx_spool/tmp/proxy \
--http-fastcgi-temp-path=%nginx_spool/tmp/fastcgi \
--pid-path=%_var/run/nginx.pid \
--user=%nginx_user \
--group=%nginx_group \
--with-cc-opt="-I %_includedir/pcre/" \
--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_gzip_static_module \
--with-http_stub_status_module \
--with-http_perl_module

* This source code was highlighted with Source Code Highlighter.



Конфиг nginx — просто и понятно

Nginx писал админ для админов. Этот факт положительно отразился на синтаксисе конфигов, а также на простоте настройки.
Набросаем простенький конфиг и разберем его директивы:
user nginx;

# Число рабочих процессов, рекомендуется ставить по количеству ядер
worker_processes 8;

# Уменьшает число системных вызовов gettimeofday(), что приводит к увеличению производительности
timer_resolution 100ms;

# Изменяет ограничение на число используемых файлов RLIMIT_NOFILE для рабочего процесса.
worker_rlimit_nofile 8192;

# Директива задаёт приоритет рабочих процессов от -20 до 20 (отрицательное число означает более высокий приоритет).
worker_priority -5;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;

events {
worker_connections 2048;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;


log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

# Включить sendfile(). Использование sendfile() экономит системные вызовы, уменьшает число копирований данных,
# позволяет использовать меньше физической памяти.
sendfile on;
keepalive_timeout 65;

gzip on;
gzip_min_length 1100;
gzip_buffers 64 8k;
gzip_comp_level 3;
gzip_http_version 1.1;
gzip_proxied any;
gzip_types text/plain application/xml application/x-javascript text/css;

# Load config files from the /etc/nginx/conf.vs directory
include /etc/nginx/conf.vs/*.conf;
}

* This source code was highlighted with Source Code Highlighter.


Пример простейшей конфигурации виртуального сервера:
server {
listen 80;
server_name _;

location / {
gzip_static on;
root /var/nginx/html;
index index.html index.htm;
}

error_page 404 /404.html;
location = /404.html {
root /var/nginx/html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/nginx/html;
}
}

* This source code was highlighted with Source Code Highlighter.
Некоторые директивы я прокоментировал, некоторые мы рассмотрим позже. Главное, на что следует обратить внимание, что синтаксис понятен в большинстве случаев даже без документации.


Мониторинг сервера nginx

В конфиге nginx прописывам секцию
location = /stat {
stub_status on;
access_log off;
allow xx.xx.xx.xx;
deny all;
}

* This source code was highlighted with Source Code Highlighter.
теперь статистику работы nginx можно смотреть по адресу http://simple.com/stat

Для удобства также желательно настроить статистику для apache, который размещен за nginx. Для этого вначале доустанавливаем модуль mod_rpaf, который позволяет apache «видеть» IP-адреса клиентов, а не IP nginx (здесь можно скачать и скомпилировать мой вариант rpaf srpm), в конфиг apache добавляем:
LoadModule rpaf_module modules/mod_rpaf-2.0.so

#
# Mod rpaf
#

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 xx.xx.xx.xx
RPAFheader X-Forwarded-For

* This source code was highlighted with Source Code Highlighter.
И подключаем модуль просмотра статистики:
ExtendedStatus On

SetHandler server-status
Deny from all
Allow from xx.xx.xx.xx


* This source code was highlighted with Source Code Highlighter.
теперь статистику для apache можно смотреть по адресу http://simple.com/apache-stat


Типы статического контента

Статику я условно делю на 2 категории: «Легкий» контент: html, css, js, xml, rss, txt. Он хорошо поддается сжатию, требует мало места для хранения. Приминение nginx в любом случае даст заметный прирост производительности.
«Тяжелый» контент: фото, видео, аудио-файлы. Узким местом выступает, в первую очередь дисковая система, размер оперативной памяти, пропускная способность канала. Задача раздачи такого типа контента делится на 2 — хранение контента и, собственно, раздача контента. С помощью nginx можно добиться минимального расхода памяти и процессорного времени, но при увеличении нагрузки все же прийдется собирать RAID-масив.


Что делать когда сайт начинает тормозить

Ну во первых не паниковать. Возможно именно в этот момент к вашему сайту приходит популярность :)
Как правило тормозит не nginx а бекенд (сервер который генерит динамический контент) или, как часто бывает, сервер БД, место на дисках кончилось, запустился супер-пупер анализатор чеого-то и загреб все ресурсы,…
В рамках этой статьи мы рассмотрим тот случай когда вы подозреваете именно nginx. Что же можно подкрутить, чтоб временно облегчить страдания сервера?
Попробуйте увеличить количество worker_processes, автор nginx советует устанавливать их по количеству ядер. Я варьировал это количество приблизительно в диапазоне «количество ядер» — «количество ядер x 2», при этом добивался более быстрого установление соедиенения, но не всегда более оперативной обработки http-запроса. Не забудьте, что есть еще worker_connections (максимальное количество конекшинов для одного worker)
Поможет установка worker_priority в -5 и меньше (до -20). Тут будьте осторожны, так как другие сервисы могут начать заметно тормозить. На наших серверах этот параметрт установлен в -5. Чем меньше значение — тем выше приоритет для nginx
При большом количестве отдачи мелких файлов и медленном винчестере может помочь временное отключение логов access_log off.
Ищите узкое место, может его можно устранить. Вам помогут комманды: top, iostat, df -h, iptraf
Добавьте оперативной памяти или усовершенствуйте дисковую систему (например установите RAID-масив, можно поэкспериментировать с SSD-винчестером)



Приемы оптимизации

«Легкий» контент
Виртуальный диск.
Создаем виртуальный диск (tmpfs), папки js, css, images (если там небольшой обем картинок относящийся к дизайну а не контент) переносим туда и в конфиге nginx, отдельно прописываем
location /js/ {
root /var/www/img_virtual/auto.ria.ua/js
}
...
Для того, чтоб виртуальный диск создавался автоматически при перезагрузке в /etc/fstab добавляем
none /var/www/img_virtual tmpfs size=1g,mode=1777 0 0
(при старте системы автоматически будет создаваться диск, размером 1G)
Сжатие контента gzip-ом
Запускаем в нашей виртуальной папке
for i in `find ./* -type f -name '*.js'`; do echo $i; gzip -c -9 $i > $i.gz; done;
for i in `find ./* -type f -name '*.css'`; do echo $i; gzip -c -9 $i > $i.gz; done;
в конфиг nginx добавляем строчку gzip_static on:
location /js/ {
gzip_static on;
root /var/www/img_virtual/auto.ria.ua/js
}
Также можно включить online упаковку для динамических файлов:
location / {
gzip on;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_comp_level 3;
gzip_types text/plain application/xml application/x-javascript text/css;

root /var/www/auto.ria.ua/
}
Заголовки для проксирования контента
Указание в заголовках времени жизни статического контента также приведет к уменьшению нагрузки. Для этого будем использовать директиву expires. Если контент не будет меняться, со вренем можно использовать expires max. Даже expires 1d даст хороший результат
Кеширование дескрипторов файлов
Это даст прирост производительности, если у вас множество мелких файлов с развернутой иерархией директорий. Также можно закешировать обращение к несуществующим файлам. Выглядеть это будет приблизительно так:
location / {
root /var/www/;


open_file_cache max=1024 inactive=600s;
open_file_cache_valid 2000s;
open_file_cache_min_uses 1;
open_file_cache_errors on;
}

«Тяжелый» контент
Вначале надо обратить внимание на то, не используется ли swap при отдаче контента, если да то это может быть проблемой, если swap находится на обычном SATA-винчестере. Свопиться любит metod ядра «sendfile», это безусловно прогрессивная технология, но использование swap будет существенно влиять на отдачу и тогда я советую его отключить директивой sendfile off;
Если позволяет оперативная память, создайте виртуальный диск, на который поместите самые «запрашиваемые» файлы, со временем, скажем, раз в 10 минут вы можете корректировать список этих файлов. Теперь мы можем применить директиву try_files:
location / {
root /var/www/;
try_files /img_virtual/hot/$uri @storage;
}

location @storage {
proxy_pass http://backend;
proxy_set_header Host $host;
}
Если файл не будет найден, на виртуальном диске будет обращение к backend.

Как правило «гарячий контент» составляет менее 10% от общего объема.

Если свою программу по формированию кеша писать нет возможности, используйте директиву proxy_store
location @storage {
proxy_pass http://backend;
proxy_set_header Host $host;

proxy_store on;
proxy_store_access user:rw group:rw all:r;
proxy_temp_path /var/www/img_virtual/hot/;
root /var/www/img_virtual/hot/;
}
При такой конфигурации каждый запрошеный файл помещается в кеш.
Со временем кеш надо как-то чистить, самый простой способ запускать на кроне:
cd /var/www/img_virtual/hot/
find ./ -type f -amin +60 -delete
(если файл из кеша не запрашимвается более 60 минут, мы его удаляем)
Если storage большой, занимает терабайты — оперативой вопрос не решить. Можно на фронтенд-е собрать RAID. Не советую использовать fake-raid, это головная боль при апгрейде и при пропадании света! Берем побольше винтов SAS, берем полноценный RAID-котроллер (никаких hostraid!). Монтируем туда swap, spool и кеш.Для нечасто меняющегося контента и нечастой перезаписи кеша можно применять SSD-винчестеры. Это работает быстро, у таких винчестеров нет такой характеристики как seek-to-seek, малый расход энергии (например для Intel X25-M 0,15Вт), хорошая скорость отдачи (до 250 MB/s).
Кеширование проксированых запросов.
23 марта 2009 года вышла очередная бета nginx 0.7.44, в которой появилась экспериментальная поддержка кеширования проксированных запросов. Трудно переоценить важность этого события для пользователей nginx. Автор nginx вручает нам мощный инструмент в управлении раздачи большого объема статики.
Почему нужен такой кеш? Ответ на этот вопрос главным образом связан с разной «стоимостью» дисковой операции и сетевой операции. «Сходить» на диск во многих случаях значительно «дешевле», чем обращение в сеть. Главная задача такого кеширования сводится к сведению к необходимому минимуму сетевых опрераций и «интелектуальному управлению» дисковым кешем.