influunt media

influunt media

Who am I?

Блог разработчика: обзор инструментов, практические примеры, мысли и исследования


Установка и настройка Nginx


Содержание:

  1. Установка
  2. Базовая настройка nginx
  3. Настройка виртуального сервера

Установка

Пакет веб-сервера Nginx доступен во многих дистрибутивах linux (Gentoo, Debian, Ubuntu, RHEL, CentOS, SLES). Установка в Ubuntu выглядит следующим образом:

root@pc:/# apt-get install nginx
root@pc:/# service nginx start

Если установка прошла успешно, nginx поприветсвует по адресу http://127.0.0.1:80/: Welcome

Базовая настройка nginx

В состав пакета включена конфигурация по умолчанию - /etc/nginx/nginx.conf:

user  nginx;
worker_processes  1;

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

events {
    worker_connections  1024;
}

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        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Рассмотрим основные параметры:

Параметр worker_processes по умолчанию равен 1. Иными словами все запросы будут обрабатываться в 1 потоке, используя 1 ядро процессора. Для максимальной производительности лучше сделать равным количеству ядер процессора или установить в "auto", чтобы nginx сам "распознал" их количество:

worker_processes  auto;

В совокупности с worker_processes стоит также увеличить и максимальное количество соединений на процесс. За это отвечает параметр worker_conenctions:

worker_connections  2048;

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

worker_rlimit_nofile 4096; #Значение по умолчанию отсутствует

Для уменьшения объема пересылаемого трафика и увеличения скорости доставки контента пользователю стоит включить компрессию. Nginx реализует алгоритм сжатия gzip:

gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss   text/javascript;
gzip_disable "msie6";

В браузерах Internet Explorer версии 6 и ниже сжатие не работает. Отключить сжатие для этих браузеров можно директивой gzip_disable, указав в качестве значения специальную маску “msie6”

/etc/nginx/nginx.conf после внесения правок:

user  nginx;
worker_processes  auto;
worker_rlimit_nofile 4096;

error_log  /var/log/nginx/error.log warn;
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        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss   text/javascript;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
}

Настройка витуального сервера

Виртуальный сервер описывается в секции server { ... } в рамках контекста http { ... }. Возможно создание нескольких серверов в рамках одного контекста.

В качестве отправной точки, возьмем виртуальный сервер для веб сайта использующего php и fastcgi:

user  nginx;
worker_processes  auto;
worker_rlimit_nofile 4096;

error_log  /var/log/nginx/error.log warn;
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        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss   text/javascript;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;

        server_name *.domain.tld;
        root /var/www/;

        index index.php index.html index.htm;

        rewrite ^/robots.txt /static/robots.txt last;

        location ^~ /static/ {
            try_files $uri =404;
        }

        location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to index.php
            try_files $uri $uri/ /index.php;
        }

        location ~ \.php$ {
            include fastcgi_params;

            try_files  $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
        }
    }
}

Данный виртуальный сервер обрабатывает запросы с доменным именем domain.tld. Корневая директория сайта находится в каталоге /var/www/.

Рассмотрим основные параметры:

Параметр listen используется для указания ip адреса и порта или пути для UNIX-сокета, на которых сервер будет принимать запросы Можно указать адрес и порт, либо только адрес или только порт. Кроме того, адрес может быть именем хоста:

listen 80;

Параметр server_name задает имя виртуального сервера. В именах сервера можно использовать звёздочку (“*”) и регулярные выражения. В случае если имя задано как “$hostname” nginx использует имя хоста (машины):

server_name *.domain.ltd;

Параметр index определяет файлы, которые будут использоваться в качестве индекса. В имени файла можно использовать переменные. Наличие файлов проверяется в порядке их перечисления. В конце списка может стоять файл с абсолютным путём:

index index.php index.html index.htm;

Параметр rewrite применяется для изменения URI запроса. Директивы выполняются последовательно, в порядке их следования в конфигурационном файле:

rewrite ^/robots.txt /static/robots.txt last;

Параметр location используется для распределения запросов по их URI. location может быть задан префиксной строкой или регулярным выражением. При сопоставлении проверяются location’ы, заданные префиксными строками (префиксные location’ы). Среди них ищется location с совпадающим префиксом максимальной длины и запоминается. Затем проверяются регулярные выражения, в порядке их следования в конфигурационном файле. Проверка регулярных выражений прекращается после первого же совпадения, и используется соответствующая конфигурация. Если совпадение с регулярным выражением не найдено, то используется конфигурация запомненного ранее префиксного location’а. Например:

location ^~ /static/ {
  try_files $uri =404;
}

location / {
  try_files $uri $uri/ /index.php;
}

location ~ \.php$ {
  include fastcgi_params;

  try_files  $uri =404;
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  fastcgi_pass unix:/var/run/php5-fpm.sock;
  fastcgi_index index.php;
}

Запросы будут обработаны следующим образом:

URI Запроса Выбранный location
“/” location / { ... }
“/index.html” location / { ... }
“/static/document.html” location /static/ { ... }
“/static/images/1.gif” location ^~ /static/ { ... }
“/static/index.php” location ~ \.php$ { ... }