среда, 9 января 2013 г.

Nginx команды

Запуск, остановка и тестирование сервера.

nginx.exe - Запуск сервера
nginx -s stop - Остановка сервера
nginx -s reload - Перезапуск сервера
nginx -t - Проверка правильности файла конфига
nginx -v - Версия сервера

Настройка nginx.conf:

# -  это комментарий.

# Все директивы обязательно оканчиваются знаком ( ; ).

#user nobody;
worker_processes 1; # Число процессов равно числу ядер в процессоре.

include other_settings.conf; # include вставлет в это место настройки из другого файла конфига.

( Комментарии.

Содержимое other_settings.conf:

    error_log logs/error.log;
    pid logs/nginx.pid;

Примеры подключаемых файлов конфигов.

nginx.conf - главный конфигурационный файл сервера
mime.types - список расширений файлов и их соотвествий MIME types
fastcgi.conf - файл конфиг для FastCGI
proxy.conf - файл конфиг для Proxy
sites.conf -  файл конфиг для сайтов, обслуживаемых сервером Nginx, также известный как virtual hosts. Рекомендуется создавать отдельные файлы для каждого домена.

)

include sites/*.conf; # Подключать можно сразу все конфигурационные файлы из папки, используя символ ( * ), вместо имен файлов.

http {
    server {
        listen 80; # Слушать порт 80
        server_name example.com; # Домен http://www.example.com/
        access_log /var/log/nginx/example.com.log; # Лог для сайта записывать в файл example.com.log
        location ^~ /admin/ { # По адресу http://www.example.com/admin/ открывать файл index.php
            index index.php;
            access_log off; # Лог для страницы по адресу http://www.example.com/admin/ не записывать
        }
    }
}

(

Комментарии.

Единицы измерения.

k или K: Kilobytes
m или M: Megabytes

Примеры:

client_max_body_size 2M;
client_max_body_size 2048k;

Единицы времени.

ms: Milliseconds
s: Seconds
m: Minutes
h: Hours
d: Days
w: Weeks
M: Months (30 days)
y: Years (365 days)

Примеры:

client_body_timeout 3m;
client_body_timeout 180s;
client_body_timeout 180;

)

location ^~ /admin/ {
    access_log logs/main.log;
    log_format main '$pid - $nginx_version - $remote_addr'; # $pid, $nginx_version, $remote_addr - это подставляемые значения переменных. Как в PHP переменные начинаются со знака ( $ ).
}

Пример конфигурации сервера по умолчанию.

user boris admins; # Означает, что данный процесс будет главным - корневым, для всех других процессов. Процесс управляется из под аккаунта пользователя boris, находящегося в группе пользователей admins.

worker_processes 1; # Установка числа процессов по принципу 1 процесс на 1 ядро процессора или более.


worker_priority 0; # Установка приоритета работы программы Nginx над другими программами, запущенными в операционной системе. Приоритет работы изменяется от -20 (высший приоритет) до 19 (низший приоритет). 0 - обычный приоритет. Не стоит устанавливать значение меньше -5, так как это приоритет работы самой операционной системы.

error_log logs/error.log error; # Установка файла, куда записывать логи в случае возникновения ошибок.

log_not_found on; # Записывать ли в лог-файл ошибки 404 - Страница (или файл) не найдена или нет? on - записывать, off - не записывать. Для конкретных сайтов следует перезаписать эту директиву log_not_found off. Но стоит оставить её в режиме on для базовой конфигурации всего сервера. 

events {
    accept_mutex on;
    accept_mutex_delay 500ms;
    multi_accept off;
    worker_connections 1024; # Предельное число возможных установленных одновременных соединений с сервером. Если число worker_processes 4, то общее число возможных одновременныз соединений в этом случае будет 1024 * 4 = 4096. Чем больше значение RAM и CPU, тем большее число соединений вы можете поддерживать.
}

Примеры рекомендуемых значений для компьютеров разных мощностей.

Главное значение имеет число worker_processes и worker_connections.
worker_processes должно соответствовать числу ядер в процессоре.
worker_connections зависит от величины RAM. Если значение worker_connections мало, то некоторые запросы со стороны браузеров могут оказаться не обработаны сервером. Установка данного значения зависит от числа пользователей, посещающих ваш сайт.

Низкий трафик


CPU: Dual-core (2 ядра)
RAM: 2 GB
Requests: ~ 1/s

worker_processes 2;
worker_rlimit_nofile 1024;
worker_priority -5;
worker_cpu_affinity 01 10;
events {
    multi_accept on;
    worker_connections 128;
}

Средний трафик

CPU: Quad-core (4 ядра)
RAM: 4 GB
Requests: ~ 50/s

worker_processes 4;
worker_rlimit_nofile 8192;
worker_priority 0;
worker_cpu_affinity 0001 0010 0100 1000;
events {
    multi_accept off;
    worker_connections 1024;
}

Высокий трафик

CPU: 8-core (8 ядер)
RAM: 12 GB
Requests: ~1000/s

worker_processes 8;
worker_priority 0;
events {
    multi_accept off;
    worker_connections 8192;
}

Таким образом, в качестве настроек сперва:
1. Устанавливаем пользователя user, из-под которого работает сервер.
2. Устанавливаем число рабочих процессов и соединений в зависимости о CPU и RAM.
3. Устанавливаем приоритет процессов сервера в операционной системе.
4. Прописываем адрес лог-файла.
5. Создаем тестовый сервер.

Типичная структура сервера.

http {

    server {

        server_name localhost;
        listen 80;

        location /downloads/ {

        }

    }

}

Тестовый сервер.

http { # Для соединений через протокол http://
    include mime.types; # включаем файл-конфиг для mime.types
    default_type application/octet-stream; # устанавливаем тип передачи
    sendfile on;
    keepalive_timeout 65; # устанавливаем время поддержания соединения
    server {
        listen 80; # ожидаем соединения на порту 80
        server_name localhost; # домен сайта localhost (соотвествует ip-адресу сайта 127.0.0.1)
        location / { # по адресу localhost/ загружаем файлы
            root html; # загружаем html, если адрес localhost/
            index index.html index.htm; # загружаем index.html или index.htm, если адрес localhost/index.html или localhost/index.htm, перебираем все файлы по порядку пока не найдем тот, который можно будет загрузить.
        }
        error_page 500 502 503 504 /50x.html; # Страницы с ошибками 500, 502, 503, 504 загружаются из файла localhost/50x.html
        location = /50x.html {# по адресу localhost/50x.html загружаем файлы
            root html; # загружаем html, если адрес localhost/50x.html
        }
    }
}

Полный рабочий пример тестового сервера Nginx.

# user boris admins;

worker_processes 1;
worker_priority 0;

error_log logs/error.log error;

events {
    worker_connections 1024;
}

http {
    include mime.types;
    default_type application/cotet-stream;
    sendfile on;
    keepalive_timeout 65;
    log_not_found on;
    server {
        listen 80;
        server_name localhost;
        location / {
            root html;
            index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location /50x.html {
            root html;
        }
    }
}


Для проверки правильности конфигурации в консоли запускаем команду

nginx -t


Методология работы тут такая:
1. Изменить конфигурацию.
2. Запустить тест.
3. Перезапустить сервер.


Программы для тестирования нагрузки на сервер:

httperf
Autobench
OpenWebLoad

Каждая из программ генерирует большое количество HTTP-запросов на сервер и приводит статистику результатов тестирования.

Апгрейд работающего сервера Nginx.

1. Заменить старый бинарник Nginx (по умолчанию он располагается в папке по адресу /usr/local/nginx/sbin/nginx) на новый.
2. Найти идентификатор процесса pid сервера Nginx в операционной системе по команде ps x | grep nginx | grep master или найдя его значение в pid-файле.
3. Послать сигнал USR2 (12) главному процессу —kill –USR2 ***, заменив *** на номер найденного pid в шаге 2. Эта процедура запустит обновление через переименование сторого .pid файла и запустит новый бинарник Nginx.
4. Послать сигнал WINCH (28) старому главному процессу —kill –WINCH ***, заменив ***  на номер найденного pid в шаге 2. Эта процедура отключит старый рабочий процесс сервера.
5. Убедитесь в том, что старый рабочий процесс сервера уничтожен и затем пошлите сигна QUIT старому главному процессу —kill –QUIT ***, заменив *** на номер найденного pid в шаге 2.

С этого момента ваш сервер Nginx считается обновленным без потерь соединения с браузерами пользователей.

Пример передачи серврером заархивированных данных в формате gzip.

http {
    # Включаем сжатие данных в gzip на уровне http блока
    gzip on;
    server {
       server_name localhost; # домен сайта localhost
       listen 80; # прослушиваем порт 80
       location /downloads/ {
            gzip off; # Отключаем отдачу архивированных данных для адреса localhost/downloads/
      }
    }
}

Как видно из примера, директивы внутри блока могут перезаписывать директивы внешнего блока.

Пример прописывания адресов.

http {
    server {
        server_name localhost; # домен
        listen 127.0.0.1:80; # вместо домена можно полностью прописать ip-адрес и порт

        root /var/www/website.com/html; # корневой адрес сайта, при переходе по адресу http://localhost/ файлы будут загружены их папки /var/www/website.com/html

        location /admin/ { # адрес страницы сайта, при переходе по адресу http://localhost/admin/ файлы будут загружены их папки /var/www/locked/
            alias /var/www/locked/;
        }

        error_page 404 /not_found.html; # при возникновении ошибки 404 будет загружена страница not_found.html
        error_page 500 501 502 503 504 /server_error.html; # при возникновении ошибок 500 501 502 503 504 будет загружена страница server_error.html
        error_page 403 http://website.com/; # при возникновении ошибки 403 будет загружена страница по адресу http://website.com/

        location / {
                try_files $uri $uri.html $uri.php $uri.xml
                @proxy;
        }
        # Следующий блок @proxy - это именованный блок, значения из которого будут подставлены в блок выше, через переменную @proxy
        location @proxy {
                proxy_pass 127.0.0.1:8080;
        }

    }
}

Установка Mime types.

http {

    include mime.types;

    location /downloads/ {

        default_type application/octet-stream;

        types {
                text/html html;
                image/gif gif;
                image/jpeg jpg;
        }

    }

}

Установка ограничений на ip-адреса.

location /admin/ {
    limit_except GET {
        allow 192.168.1.0/24;
        deny all;
    }
}

Установка базовой авторизации.

location /admin/ {

    allow 192.168.1.0/24;
    deny all;

    auth_basic "Authentication required";
    auth_basic_user_file conf/htpasswd;

}

Регулярные выражения в location.

server {
    server_name website.com;
    location ~ ^/abcd$ { # соответсвует, например, адресу http://website.com/abcd?param1&param2
    }
}

Приоритет адресов в location.

Nginx выбирает адреса в следующей приоритетной последовательности:

1. Есть модификатор ( = ), то есть четко указан точный адрес.
Например
location = /files/ {...}

2. Нет модификатора ( = ).
Например
location /files/ {...}

3. Есть модификатор ( ^~ ), то есть строка адреса должна начинаться с некоторой последовательности символов.
Например
location ^~ /doc {...}

4. Есть модификатор ( ~ ) или модификатор ( ~* ), то есть строка адреса должна соотвествовать условию регулярного выражения.
Например
location ~* ^/document$ {...}

5. Нет никакого модификатора.
Например 
location /doc {...}


Перезаписывание адресов модуль Rewrite.

rewrite hel{2,}o /hello.php; # invalid
rewrite "hel{2,}o" /hello.php; # valid
rewrite 'hel{2,}o' /hello.php; # valid

server {

    server_name website.com;

    location ~* ^/(downloads|files)/(.*)$ {
        add_header Capture1 $1;
        add_header Capture2 $2;
    }

}

server {

    server_name website.com;
    root /var/www/vhosts/website.com/httpdocs/;

    location /storage/ {
        internal;
        alias /var/www/storage/;
    }

    location /documents/ {
        rewrite ^/documents/(.*)$ /storage/$1;
    }

}

Часто используемые варианты перезаписи адресов через Rewrite.

Поиск данных на сайте.

URI в строке браузера
http://website.com/search/some-search-keywords

Переписанный на сервере URI
http://website.com/search.php?q=some-search-keywords

Правило для Rewrite
rewrite ^/search/(.*)$ /search.php?q=$1?;


Страница пользователя на сайте.

URI в строке браузера
http://website.com/user/31/James

Переписанный на сервере URI
http://website.com/user.php?id=31&name=James

Правило для Rewrite
rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;


Передача нескольких параметров в адресной строке.

URI в строке браузера
http://website.com/index.php/param1/param2/param3

Переписанный на сервере URI
http://website.com/index.php?p1=param1&p2=param2&p3=param3

Правило для Rewrite
rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;


Стиль Wikipedia.

URI в строке браузера
http:// website.com/wiki/Some_keyword

Переписанный на сервере URI
http://website.com/wiki/index.php?title=Some_keyword

Правило для Rewrite
rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;


Стиль новостного сайта.

URI в строке браузера
http://website.com/33526/us-economy-strengthens

Переписанный на сервере URI
http://website.com/article.php?id=33526

Правило для Rewrite
rewrite ^/([0-9]+)/.*$ /article.php?id=$1?;


Стиль форума.

URI в строке браузера
http://website.com/topic-1234-50-some-keywords.html

Переписанный на сервере URI
http://website.com/viewtopic.php?topic=1234&start=50

Правило для Rewrite
rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ /viewtopic.php?topic=$1&start=$2?;


Условная переадресация.

server {

    if ($request_method = GET) {
       ...
    }

    if ($request_method = POST) {
       ...
    }

}
 
Server Side Includes (SSI)

server {

    server_name website.com;

    location ~* \.shtml$ {
        ssi on;
    }

}

<html>
<head>
    <!--# include file="header.html" -->
</head>
<body>
    <!--# include file="body.html" -->
    <!--# include virtual="/footer.php?id=123" -->
</body>
</html>

Установка главного файла Index (если никакой из файлов не указан в адресе, например, localhost/).

index file1 [file2…] [absolute_file];

Пример 1.

index index.php index.html index.htm;

Пример 2.

index index.php index2.php /catchall.php;

Показ всех файлов на сервере Autoindex.

autoindex on;



Включение базовой авторизации Basic Aithorization.

location /admin/ {
    auth_basic "Admin control panel";
    auth_basic_user_file access/password_file;
}

Разрешение доступа к содержимому страницы Access.

location {
    allow 127.0.0.1; # разрешить только ip-адрес 127.0.0.1
    deny all; # запретить все другие ip-адреса
}

Empty GIF.

location = /empty.gif {
    empty_gif;
}

FLV.

location ~* \.flv {
    flv;
}

Кэширование Memcached.

server {

    server_name example.com;

    location / {
        set $memcached_key $uri;
        memcached_pass 127.0.0.1:11211;
        error_page 404 @notcached;
    }

    location @notcached {
        internal;
        # Если файл не найден, то переадать запрос далее прокси-серверу
        proxy_pass 127.0.0.1:8080;
    }

}

Замена ip-адреса клиента на статичный ip-адрес Real IP.

Данный модуль просто заменяет ip-адрес клиента на адрес установленный в заголовке X-Real-IP HTTP header для клиентов посещающих сайт за прокси или для получения адресов с правильными заголовками, если Nginx используется, как backend server. Для использования этой опции необходимо вставить директиву  real_ip_header X-Real-IP или real_ip_header X-Forwarded-For. Затем необходимо определить доверенные ip-адреса, другими словами клиентов, которым дозволено использовать эти заголовки.

real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from 127.0.0.1;

SSL.

server {
    listen 443;
    server_name secure.website.com;
    ssl on;
    ssl_certificate /path/to/combined.crt;
    ssl_certificate_key /path/to/secure.website.com.key;
}

Страница с описанием текущего состояния сервера.

location = /nginx_status {
    stub_status on;
    allow 127.0.0.1; # вы возможно захотите ограничить доступ к данной странице
    deny all;
}

Взаимодействие Nginx с Django и Python.

server {

    server_name .website.com;
    listen 80;

    root /home/website/www;
    index index.html;

    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params;
    }

}

Nginx как Reverse Proxy.

proxy_pass http://localhost:8080;
proxy_pass http://127.0.0.1:8080;
proxy_pass http://unix:/tmp/nginx.sock;
proxy_pass https://192.168.0.1;
proxy_pass http://localhost:8080/uri/;
proxy_pass http://unix:/tmp/nginx.sock:/uri/;
proxy_pass http://$server_name:8080;


--------------------------------------------------------------------------------------------------

# Используя upstream блок
upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

location ~* \.php$ {
    proxy_pass http://backend;
}

--------------------------------------------------------------------------------------------------

server {

    server_name .example.com;
    root /home/example.com/www;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }

}

--------------------------------------------------------------------------------------------------

upstream apache {
    server 192.168.0.1:80;
    server 192.168.0.2:80;
    server 192.168.0.3:80 weight=2;
    server 192.168.0.4:80 backup;
}

server {

    server_name .example.com;
    root /home/example.com/www;

    location / {
        proxy_pass http://apache;
    }

}

Комментариев нет:

Отправить комментарий