Archive

Archive for the ‘nginx’ Category

Кэширование в nginx

March 24th, 2011

Включение кэширования средствами nginx позволяет повысить скорость отдачи часто используемых страниц в очень много раз. Фишка в том, что сгенерированная апачем страница сохраняется в виде готового html-файла на диске и при поступлении запроса на такой же урл (совпадение по md5) файл-кэш быстро отдается клиенту. Кэширование в nginx доступно с версии 0.7.44. Благо в репозитории EPEL уже штатно присутствует 0.8.
К настройке кэширования нужно относиться очень внимательно, потому что на динамических сайтах весьма высока вероятность обрубания функциональности сайта: перестанут работать корзины на сайтах-магазинах, поломаются счетчики просмотров и тд.
Самая простая настройка выглядит так:
Сначала в http-секции прописываем где будет лежать кэш, его размер и время устаревания:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myzone:16m inactive=7d max_size=1024m;

Чистить кэш nginx будет сам. Кстати, в процессе отладки вы можете просто ходить в эту папку и смотреть что там закэшировалось.
Кэш можно включить либо для определенного location либо для всего виртуального хоста.

proxy_no_cache $cookie_logged; #условия, при которых ответ не будет сохраняться в кэш
proxy_cache_bypass $cookie_logged; #условия, при которых ответ не будет браться из кэша
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_pass_header Set-Cookie;#разрешает передавать от проксируемого сервера клиенту запрещённые для передачи строки
proxy_ignore_headers "Expires" "Cache-Control"; #запрещает обработку некоторых строк заголовка из ответа проксированного сервера
proxy_cache_valid 200 301 302 304 1h; #время кэширования для разных ответов
proxy_cache myzone; #включает кэширование и задает зону

В процессе настройки посмотрите какие куки и в какой момент отправляет пользователю ваше приложение.
В интернете можно найти готовые конфиги nginx-а для кэширования под различные популярные CMS.
“Тупой” вариант кэширования с большим сроком устаревания кэша можно использовать в момент DDOS-а, тогда есть шанс, что сервер справится с наплывом запросов и сайт хоть и потеряет в функциональности, но останется доступен для поисковых систем и не уронит в след за собой остальные сайты на этом сервере.

nginx

Настройка SSL в nginx

December 9th, 2009

В nginx настроить SSL для домена еще проще чем в Апаче. Для начала генерим закрытый ключ, запрос на сертификат и подписываем его как указано в статье настройка SSL на Apache

Теперь конфиг:

server {
        listen 1.2.3.1:443;
        keepalive_timeout    70;

        server_name .domain.com;

        ssl                  on;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate      /etc/nginx/vhosts/www.domain.crt;
        ssl_certificate_key  /etc/nginx/vhosts/www.domain.key;
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  20m;

        location ~* \.(JPG|jpg|jpeg|gif|png|ico|zip|doc|gz|rar|bz2|swf|avi|mpg|vmw|wmv|mpeg|mkv|js)$ {
            root /usr/local/www/domain.com;
            expires max;
        }

        location / {
            proxy_pass         http://127.0.0.1:80/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For $remote_addr;
        }
    }

Нюансы такие:
Файл с закрытым ключем придется делать без пароля. Если он у вас с паролем, то снять пароль можно так:

openssl rsa -in key.pem -out keyout.pem

Ну и если вы делаете нормальные подписанные авторитетными CA сертификаты уникальные для каждого домена, то не забыть вешать каждый домен на отдельный ип.
На апаче в такой конфигурации вообще ничего изменять не нужно и до апача доходит уже расшифрованный трафик.

nginx ,

Закачка больших файлов через PHP

July 7th, 2009

Вот что нужно поправить:
Во-первых, в nginx.conf надо

client_max_body_size 20m;

Иначе если запрос не будет пролазить в этот лимит nginx покажет 413 Request Entity Too Large для некоторых браузеров или просто сбросит соединение.

В apache убедиться что не определено LimitRequestBody или имеет подходящий лимит. Если установлен mod_security то проверить еще SecRequestBodyLimit.

И наконец, в php.ini:

post_max_size = 20M
upload_max_filesize = 20M

Apache, nginx, php , ,

Установка nginx на сервер с DirectAdmin

April 29th, 2009

Иногда бывает необходимо поставить nginx перед апачем на сервере с уже установленным DirectAdmin-ом. И тут есть несколько варинтов:

  • Перевесить апач на 127.0.0.1, а nginx на все внешние адреса. Но для этого прийдется править конфиги всех сайтов + темплейты для создания новых хостов в ДиректАдмине (шаблоны лежат тут $DIRECTADMIN_HOME/data/templates/). Так же этот вариант опасен тем, что если что-то пойдет не так, то сайты будут не доступны некоторое время.
  • Перевесить апач на другой порт, а nginx на 80. В этом варианте тоже прийдется править шаблоны.
  • Ну и самый удобный вариант это просто добавить новый ip на сервер, но не добавлять его в ДиректАдмин. Повесить на этот ип nginx и уже на него перевести днс-ы тех доменов, которые больше всего грузят сервер. После добавления ип-а и
    /etc/init.d/network restart

    не забыть сделать

    /etc/init.d/startips start

И в /etc/httpd/conf/httpd.conf заменить

Listen 80

на

Listen 1.1.1.1:80
Listen 1.1.1.2:80

Apache, nginx , ,

Быстрая установка awstats для анализа логов nginx

February 3rd, 2009

Ставим awstats из портов или из Yum-а.
Теперь надо определиться с логами nginx-а. Тут два варианта: либо логи для всех виртуалхостов пишутся в один файл, либо для каждого хоста в свой. В nginx 0.7 есть функционал позволяющий в директиве access_log использовать переменные. Т.е. например можно сделать так:

access_log /var/log/$host-nginx/nginx-access.log

В 0.6 так нельзя. Поэтому я буду рассматривать вариант, когда лог-файл один и общий.
Формат логов сделаем такой:

log_format  main  '$host $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/nginx-access.log main;

Теперь создаем конфиг awstats-а для каждого виртуалхоста на базе дефолтового образца.
Правим в нем строки:

LogFile="/var/log/nginx/nginx-access.log"
LogType=W
LogFormat = "%virtualname %host %time1 %methodurl %code %bytesd %refererquot %uaquot"
LogSeparator=" "

и параметры SiteDomain, HostAliases.
Так же если надо считать статистику по странам в конфиг надо добавить строчку:

LoadPlugin="geoip GEOIP_STANDARD /usr/local/share/GeoIP/GeoIP.dat"

И поставить порты: GeoIP-1.4.4_1, p5-Geo-IP-1.36 (Linux: geoip.x86_64, perl-Geo-IP.x86_64)

Теперь создаем и добавляем в кронтаб файлик awstats_run.sh с такими строками:

#!/bin/sh
/usr/share/awstats/tools/awstats_buildstaticpages.pl -config=domain -dir=/home/awstats/domain.com -static -update

Не забыть включить ротацию логов Nginx. Пример для newsyslog.conf

/var/log/nginx/nginx-access.log               640  7     *    @T00  Z        /var/run/nginx.pid  30

Если дело происходит на Linux и надо настроить logrotate, то можно сделать ротацию и обсчет логов по другому:
Правим Logrotate-конфиг Nginx:

/var/log/nginx/*log {
    rotate 10
    size=100M
    missingok
    notifempty
    compress
    sharedscripts
    prerotate
    /etc/awstats/awstats_run.sh
    endscript
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Небольшой минус – ротация будет не точно посуточная.

Если надо подключить к awstats много доменов, то можно воспользоваться этим скриптом, предварительно создав конфиг-образец awstats.domain.com.conf:

#!/usr/local/bin/bash
CONFIG="/usr/local/etc/awstats"
OUTPUT="/home/domains/sampledomain.com/awstats"

if [ "x$1" = "x" ]; then
    echo "Usage: $0 domain.com"
    exit
fi

sed -e "s/domain.com/$1/g" "$CONFIG/awstats.domain.com.conf" > "$CONFIG/awstats.$1.conf"
echo "/usr/local/www/awstats/tools/awstats_buildstaticpages.pl -config=$1 -dir=$OUTPUT -static -update" >> $CONFIG/awstats_run.sh

Если мы будем генерировать статистику для всех сайтов и выкладывать ее на какой то один общий домен, то не забыть отключить дефолтный конфиг для awstats для апача.
Для создания общей страницы статистики для всех сайтов можно использовать эту тулзу
В различных ОС и дистрибутивах Linux скрипты awstats устанавливаются в разные места. Это надо проверить вручную запустив пересчет статистики и убедившись в отсутствии ошибок.

nginx ,

Конфигурация nginx, не универсальная, freebsd

January 31st, 2009

nginx.conf:

user nobody;
worker_processes 2;
worker_rlimit_nofile 8192;

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

pid /var/run/nginx.pid;

events {
    worker_connections 8192;
    use kqueue;
}

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

    #access_log /var/log/nginx/nginx-access.log;
    access_log  off;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    keepalive_timeout 65;
    client_max_body_size 20m;

    server {
        listen 1.2.3.1 default accept_filter=httpready;
        server_name foobar;
        location / {
            root /var/empty;
        }
    }

    include /usr/local/etc/nginx/vhosts/*.conf;
}

Файл-пример конфига для виртхоста:

server {
    listen 1.2.3.2;

    server_name sample.com www.sample.com;
    location ~ /\.ht {
        deny  all;
    }

    location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
        root /usr/home/domains/sample.com;
expires max;
    }

location / {
        proxy_pass         http://127.0.0.1:80;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        client_body_buffer_size    128k;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_temp_file_write_size 64k;
    }
}

nginx ,

nginx, apache, mod_rpaf и не правильное определение прокси

January 18th, 2009

Если вы используете такую связку, и в nginx присуствуют следующие директивы

proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header    X-Forwarded-For $remote_addr;

чтобы пробросить ip пользователя к apache, то некоторые скрипты, работающие под apache из-за заголовка X-Forwarded-For могут считать, что пользователь пришел через прокси. А это не желательно. В таком случае в nginx те два заголовка надо заменить на:

proxy_set_header   Test $remote_addr;

а в конфиге mod_rpaf сделать так:

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 внешние ип-ы
RPAFheader Test

Apache, nginx , ,

установка nginx на linux из yum

January 9th, 2009

Надо лишь добавить репозитарий:

rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

или

rpm -ihv http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

или скачать rpm напрямую, например:

http://download.fedora.redhat.com/pub/epel/5/x86_64/nginx-0.6.33-1.el5.x86_64.rpm

linux, nginx , ,

универсальный конфиг nginx

December 9th, 2008

С данным конфигом не надо будет прописывать в nginx каждый сайт. Условимся что сайты лежат в /home/домен-без-www/html

user  nobody;
worker_processes  4;
worker_rlimit_nofile 8192;

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

pid        /var/run/nginx.pid;

events {
worker_connections  2048;
# for linux
use epoll;
# for freebsd
# use kqueue;
}

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

#access_log  /var/log/httpd/nginx-access.log  main;
access_log  off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout  65;
client_max_body_size       20m;

gzip  on;
gzip_disable "MSIE [1-6]";
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain text/css text/xml application/x-javascript;

server {
listen       *:80 default;
server_name ~^(.*)$;

set $p $host;
if ($host ~ www\.(.*)) { set $p $1; }

location / {
proxy_pass         http://127.0.0.1/;
proxy_redirect     off;
proxy_set_header   Host             $p;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header    X-Forwarded-For $remote_addr;
}

location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|js|swf)$ {
root /home/$p/html;
expires max;
}
}
}

FreeBSD, nginx

nginx, ограничение скорости по урлу

December 9th, 2008
if ( $query_string !~* 'premium=true' ) {
       set $limit_rate  120k;
   }

nginx

nginx распределение коннекций по воркерам

December 9th, 2008
fstat | grep 'nginx.*tcp' | awk '{print $3}' | sort | uniq -c

если вдруг сильно не равномерно распределяется то можно попробовать

events {
   accept_mutex  off;
}

nginx

nginx Тюнинг под отдачу мувиков с сата винтов

December 9th, 2008

варианты:
1. патч на бсд, sendfile on, переформатить разделы под размер блока в 64К http://www.lexa.ru/nginx-ru/msg19477.html
2. sendfile off, output_buffers 1 1m; http://www.lexa.ru/nginx-ru/msg20623.html

nginx