Nginx — различия между версиями

Материал из K.Wiki
Перейти к: навигация, поиск
(Шаблоны)
 
(не показано 7 промежуточных версии этого же участника)
Строка 1: Строка 1:
В этой статье описывается установка и настройка веб-сервера nginx для работы с [[PHP-FPM]] и [[MySQL]] в операционной системе [[Ubuntu]].
+
В этой статье описывается установка и настройка веб-сервера nginx для работы с [[PHP-FPM]], [[node.js]] и [[MySQL]] в операционной системе [[Ubuntu]].
  
 
== Установка ==
 
== Установка ==
Строка 5: Строка 5:
  
 
== Файл конфигурации ==
 
== Файл конфигурации ==
Настройки хранятся в файле <tt>/etc/nginx/nginx.conf</tt>.
+
Настройки хранятся в файле '''/etc/nginx/nginx.conf'''.
 +
<pre>## Пользователь, от имени которого запускается nginx.
 +
user www-data;
  
# Пользователь, от имени которого запускается nginx.
+
## Количество рабочих процессов, рекомендуется устанавливать по числу ядер.
user www-data;
+
worker_processes auto;
+
 
# Количество рабочих процессов, рекомендуется устанавливать по числу ядер.
+
## Файл с ID процесса.
worker_processes 4;
+
pid /run/nginx.pid;
+
 
# Файл с ID процесса.
+
## Директива уменьшает разрешение времени в рабочих процессах, за счёт чего уменьшается число системных вызовов gettimeofday().
pid /run/nginx.pid;
+
timer_resolution 100ms;
+
 
# Директива уменьшает разрешение времени в рабочих процессах, за счёт чего уменьшается число системных вызовов gettimeofday().
+
 
timer_resolution 100ms;
+
events {
+
        ## Максимальное число подключений к серверу на один рабочий процесс.
# Ограничение на максимальное число открытых файлов.
+
        worker_connections 768;
worker_rlimit_nofile 8192;
+
 
+
        ## Эффективный метод обработки соединений, используемый в Linux 2.6+
events {
+
        use epoll;
    # Максимальное число подключений к серверу на один рабочий процесс.
+
 
    worker_connections 768;
+
        ## Если выключен, то рабочий процесс за один раз принимает только одно новое соединение.
   
+
        multi_accept on;
    # Эффективный метод обработки соединений, используемый в Linux 2.6+
+
}
    use epoll;
+
 
   
+
 
    # Если выключен, то рабочий процесс за один раз принимает только одно новое соединение.
+
http {
    #multi_accept on;
+
        ####
}
+
        ## Основные настройки.
+
        ####
http {
+
 
    ##
+
        ## Разрешить использовать sendfile().
    # Основные настройки.
+
        sendfile on;
    ##
+
 
   
+
        ## Разрешить использование параметра сокета TCP_NOPUSH во FreeBSD или TCP_CORK в Linux.
    # Разрешить использовать sendfile().
+
        ## Параметр включается только при использовании sendfile.
    sendfile on;
+
        tcp_nopush on;
   
+
 
    # Разрешить использование параметра сокета TCP_NOPUSH во FreeBSD или TCP_CORK в Linux.
+
        ## Разрешить использование параметра TCP_NODELAY.
    # Параметр включается только при использовании sendfile.
+
        ## Параметр включаются только при переходе соединения в состояние keep-alive.
    tcp_nopush on;
+
        tcp_nodelay on;
   
+
 
    # Разрешить использование параметра TCP_NODELAY.
+
        ## Таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера.
    # Параметр включаются только при переходе соединения в состояние keep-alive.
+
        ## Значение 0 запрещает keep-alive соединения с клиентами.
    tcp_nodelay on;
+
        keepalive_timeout 65;
   
+
 
    # Таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера.
+
        ## Максимальный размер хэш-таблиц типов.
    # Значение 0 запрещает keep-alive соединения с клиентами.
+
        types_hash_max_size 2048;
    keepalive_timeout 65;
+
 
   
+
        ## Запретить выдавать версию nginx’а в сообщениях об ошибках и в поле “Server” заголовка ответа.
    # Максимальный размер хэш-таблиц типов.
+
        server_tokens off;
    types_hash_max_size 2048;
+
 
   
+
        ## Задать размер корзины в хэш-таблицах имён серверов.
    # Запретить выдавать версию nginx’а в сообщениях об ошибках и в поле “Server” заголовка ответа.
+
        ## Значение по умолчанию зависит от размера строки кэша процессора.
    server_tokens off;
+
        # server_names_hash_bucket_size 64;
   
+
 
    # Подключить описание MIME-типов.
+
        ## Разрешить или запретить использовать в абсолютных перенаправлениях, выдаваемых nginx’ом, основное имя сервера, задаваемое директивой server_name.
    include /etc/nginx/mime.types;
+
        ## Если использование основного имени сервера запрещено, то используется имя, указанное в поле “Host” заголовка запроса.
   
+
        ## Если же этого поля нет, то используется IP-адрес сервера.
    # MIME-тип ответов по умолчанию.
+
        # server_name_in_redirect off;
    default_type application/octet-stream;
+
 
   
+
        ## Подключить описание MIME-типов.
       
+
        include /etc/nginx/mime.types;
    ##
+
 
    # Настройки логов.
+
        ## MIME-тип ответов по умолчанию.
    ##
+
        default_type application/octet-stream;
   
+
 
    # Настройки файла логов доступа.
+
 
    access_log /var/log/nginx/access.log;
+
        ####
   
+
        ## Настройки SSL
    # Настройки файла логов ошибок.
+
        ####
    error_log /var/log/nginx/error.log;
+
 
   
+
        ## Разрешить указанные протоколы.
   
+
        ## Параметры TLSv1.1 и TLSv1.2 работают только при использовании библиотеки OpenSSL версии 1.0.1 и выше.
    ##
+
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    # Настройки сжатия.
+
 
    ##
+
        ## Указать, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские.
   
+
        ssl_prefer_server_ciphers on;
    # Разрешить сжатие ответа методом gzip.
+
 
    gzip on;
+
 
   
+
        ####
    # Запретить сжатие ответа методом gzip для запросов с полями заголовка “User-Agent”, совпадающими с заданными регулярными выражениями.
+
        ## Настройки логов.
    gzip_disable "msie6";
+
        ####
   
+
 
    # Разрешить или запретить выдавать в ответе поле заголовка “Vary: Accept-Encoding”, если активны директивы gzip, gzip_static или gunzip.
+
        ## Задать путь, формат и настройки буферизованной записи в лог.
    #gzip_vary on;
+
        ## http://nginx.org/ru/docs/http/ngx_http_log_module.html#access_log
   
+
        access_log /var/log/nginx/access.log;
    # Разрешить или запретить сжатие ответа методом gzip для проксированных запросов в зависимости от запроса и ответа.  
+
 
    #gzip_proxied any;
+
        ## Настроить запись в лог.
   
+
        ## На одном уровне может использоваться несколько логов (1.5.2).
    # Степень сжатия ответа методом gzip.
+
        ## http://nginx.org/ru/docs/ngx_core_module.html#error_log
    # Допустимые значения находятся в диапазоне от 1 до 9.
+
        error_log /var/log/nginx/error.log;
    #gzip_comp_level 6;
+
 
   
+
 
    # Число и размер буферов, в которые будет сжиматься ответ.
+
        ####
    #gzip_buffers 16 8k;
+
        ## Настройки сжатия.
   
+
        ####
    # Минимальная HTTP-версия запроса, необходимую для сжатия ответа.
+
 
    #gzip_http_version 1.1;
+
        ## Разрешить сжатие ответа методом gzip.
   
+
        gzip on;
    # Разрешить сжатие ответа методом gzip для указанных MIME-типов в дополнение к “text/html”.
+
 
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
+
        ## Запретить сжатие ответа методом gzip для запросов с полями заголовка “User-Agent”, совпадающими с заданными регулярными выражениями.
   
+
        gzip_disable "msie6";
   
+
 
    ##
+
        ## Разрешить или запретить выдавать в ответе поле заголовка “Vary: Accept-Encoding”, если активны директивы gzip, gzip_static или gunzip.
    # Настройки виртуальных хостов.
+
        # gzip_vary on;
    ##
+
 
   
+
        ## Разрешить или запретить сжатие ответа методом gzip для проксированных запросов в зависимости от запроса и ответа.
    # Подключить дополнительные файлы настроек.
+
        # gzip_proxied any;
    include /etc/nginx/conf.d/*.conf;
+
 
   
+
        ## Степень сжатия ответа методом gzip.
    # Подключить настройки активных сайтов.
+
        ## Допустимые значения находятся в диапазоне от 1 до 9.
    include /etc/nginx/sites-enabled/*;
+
        # gzip_comp_level 6;
}
+
 
 +
        ## Число и размер буферов, в которые будет сжиматься ответ.
 +
        # gzip_buffers 16 8k;
 +
 
 +
        ## Минимальная HTTP-версия запроса, необходимую для сжатия ответа.
 +
        # gzip_http_version 1.1;
 +
 
 +
        ## Разрешить сжатие ответа методом gzip для указанных MIME-типов в дополнение к “text/html”.
 +
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
 +
 
 +
 
 +
        ####
 +
        ## Настройки виртуальных хостов.
 +
        ####
 +
 
 +
        ## Подключить дополнительные файлы настроек.
 +
        include /etc/nginx/conf.d/*.conf;
 +
 
 +
        ## Подключить настройки активных сайтов.
 +
        include /etc/nginx/sites-enabled/*;
 +
}</pre>
  
 
Для учета изменений настроек нужно перезагрузить службу
 
Для учета изменений настроек нужно перезагрузить службу
  # service nginx reload
+
  sudo service nginx reload
  
=== Ссылки ===
+
Ссылки
 
* [http://nginx.org/ru/docs/ngx_core_module.html Основная функциональность - nginx.org]
 
* [http://nginx.org/ru/docs/ngx_core_module.html Основная функциональность - nginx.org]
 
* [http://nginx.org/ru/docs/http/ngx_http_core_module.html Модуль ngx_http_core_module - nginx.org]
 
* [http://nginx.org/ru/docs/http/ngx_http_core_module.html Модуль ngx_http_core_module - nginx.org]
Строка 128: Строка 150:
 
== Виртуальные хосты ==
 
== Виртуальные хосты ==
 
Виртуальные хосты используются для описания параметров отдельных сайтов, которые обслуживает nginx.
 
Виртуальные хосты используются для описания параметров отдельных сайтов, которые обслуживает nginx.
По-умолчанию, настройки хранятся в отдельных файлах в директории <tt>/etc/nginx/sites-available/</tt>,
+
По-умолчанию, настройки хранятся в отдельных файлах в директории '''/etc/nginx/sites-available/''',
а для активации хоста нужно создать символьную ссылку в директории <tt>/etc/nginx/sites-enabled/</tt> на соответствующий файл настроек
+
а для активации хоста нужно создать символьную ссылку в директории '''/etc/nginx/sites-enabled/''' на соответствующий файл настроек
  # ln -s /etc/nginx/sites-available/{имя сайта} /etc/nginx/sites-enabled/{имя сайта}
+
  sudo ln -s /etc/nginx/sites-available/{имя сайта} /etc/nginx/sites-enabled/{имя сайта}
 
и перезагрузить службу
 
и перезагрузить службу
  # service nginx reload
+
  sudo service nginx reload
  
 
Один файл может содержать описание для нескольких сайтов, каждое должно находиться логическом блоке
 
Один файл может содержать описание для нескольких сайтов, каждое должно находиться логическом блоке
 
  server {
 
  server {
     # Обрабатываемый порт.
+
     ## Для того, чтобы сайт был доступен по адресам <nowiki>http://{имя домена 1}/</nowiki> и <nowiki>http://{имя домена 2}/</nowiki>.
 +
    server_name {имя домена 1} {имя домена 2};
 +
         
 +
    ## Обрабатываемый порт.
 
     listen 80;
 
     listen 80;
     # Обрабатываемый порт для определенного домена.
+
     ## Обрабатываемый порт для определенного домена.
 
     #listen {имя домена} 8080;
 
     #listen {имя домена} 8080;
     # Обрабатываемый порт для ipv6.
+
     ## Обрабатываемый порт для ipv6.
 
     #listen [::]:80 [{имя домена}] ipv6only=on;
 
     #listen [::]:80 [{имя домена}] ipv6only=on;
 
      
 
      
     # Директория с файлами сайта.
+
     ## Директория с файлами сайта.
 
     root /var/www/{имя сайта}/www;
 
     root /var/www/{имя сайта}/www;
 
      
 
      
     # Для того, чтобы сайт был доступен по адресам <nowiki>http://{имя домена 1}/</nowiki> и <nowiki>http://{имя домена 2}/</nowiki>.
+
     ## Файл лога для проблем доступа.
    server_name {имя домена 1} {имя домена 2};
+
         
+
    # Файл лога для проблем доступа.
+
 
     access_log /var/www/{имя сайта}/access.log;
 
     access_log /var/www/{имя сайта}/access.log;
 
      
 
      
     # Файл лога для ошибок.
+
     ## Файл лога для ошибок.
 
     error_log /var/www/{имя сайта}/error.log;
 
     error_log /var/www/{имя сайта}/error.log;
 
      
 
      
     # Подключение шаблона со стандартными настройками.
+
     ## Подключение шаблона со стандартными настройками.
 
     include /etc/nginx/templates/default;
 
     include /etc/nginx/templates/default;
 
      
 
      
     # Страница для ошибки 404.
+
     ## Страница для ошибки 404.
 
     #error_page 404 /404.html;
 
     #error_page 404 /404.html;
 
      
 
      
     # Перенаправление при ошибках на статическую страницу /50x.html.
+
     ## Перенаправление при ошибках на статическую страницу /50x.html.
 
     #error_page 500 502 503 504 /50x.html;
 
     #error_page 500 502 503 504 /50x.html;
 
     #location = /50x.html {
 
     #location = /50x.html {
Строка 167: Строка 189:
 
     #}
 
     #}
 
  }
 
  }
 +
Если <code>server_name</code> совпадает с именем сайта, то можно использовать макрос <code>$server_name</code> для подстановки вместо <code>{имя сайта}</code>.
  
 
=== Шаблоны ===
 
=== Шаблоны ===
 
Благодаря директиве <tt>include</tt> в блок настроек виртуального хоста можно включать внешние файлы.
 
Благодаря директиве <tt>include</tt> в блок настроек виртуального хоста можно включать внешние файлы.
 
Шаблоны принято использовать для описания общих настроек.
 
Шаблоны принято использовать для описания общих настроек.
Файлы шаблонов, как правило, сохраняются в директорию <tt>/etc/nginx/templates/</tt>.
+
Файлы шаблонов, как правило, сохраняются в директорию '''/etc/nginx/templates/'''.
  
Например, стандартные настройки HTTP-хоста в файле <tt>/etc/nginx/templates/default</tt>
+
Например, стандартные настройки HTTP-хоста в файле '''/etc/nginx/templates/default'''
  # Файлы, открываемые при пустом пути, в порядке приоритета.
+
  ## Файлы, открываемые при пустом пути, в порядке приоритета.
 
  index index.php index.html index.htm;
 
  index index.php index.html index.htm;
 
   
 
   
 
  location / {
 
  location / {
     # Сначала запрос обрабатывается как файл, потом как директория, потом происходит переход на страницу 404.
+
     ## Сначала запрос обрабатывается как файл, потом как директория, потом происходит переход на страницу 404.
 
     try_files $uri $uri/ =404;
 
     try_files $uri $uri/ =404;
 
      
 
      
     # Раскоментировать для использования naxsi в этой области.
+
     ## Раскоментировать для использования naxsi в этой области.
 
     #include /etc/nginx/naxsi.rules
 
     #include /etc/nginx/naxsi.rules
 
  }
 
  }
 
   
 
   
  # Закрыть доступ к файлами .htaccess и .htpassword.
+
  ## Закрыть доступ к файлами .htaccess и .htpassword.
 
  location ~ /\.ht {
 
  location ~ /\.ht {
 
     deny all;
 
     deny all;
 
  }
 
  }
 
   
 
   
  # Отключить логи, связанные с отсутствием иконки сайта.
+
  ## Отключить логи, связанные с отсутствием иконки сайта.
 
  location = /favicon.ico {
 
  location = /favicon.ico {
 
     log_not_found off;
 
     log_not_found off;
Строка 196: Строка 219:
 
  }
 
  }
 
   
 
   
  # Доступ к файлу с настройками для поисковых роботов.
+
  ## Доступ к файлу с настройками для поисковых роботов.
 
  location = /robots.txt {
 
  location = /robots.txt {
 
     allow all;
 
     allow all;
 
     log_not_found off;
 
     log_not_found off;
 
     access_log off;
 
     access_log off;
 +
}
 +
 +
# Активировать кэширование.
 +
location ~* \.(ico|css|js)$ {
 +
    expires 7d;
 +
    add_header Pragma public;
 +
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
 
  }
 
  }
  
 
=== PHP ===
 
=== PHP ===
Для работы с [[PHP-FPM]] достаточно создать шаблон <tt>/etc/nginx/templates/php</tt>
+
Для работы с [[PHP-FPM]] достаточно создать шаблон '''/etc/nginx/templates/php''':
  # Адрес FastCGI-сервера (имя или адрес и порт или путь к UNIX-сокету).
+
  ## Адрес FastCGI-сервера (имя или адрес и порт или путь к UNIX-сокету).
  # Указывается в настройках виртуального хоста.
+
  ## Указывается в настройках виртуального хоста.
 
  #fastcgi_pass
 
  #fastcgi_pass
 
   
 
   
  # Имя файла, который при создании переменной $fastcgi_script_name будет добавляться после URI, если URI заканчивается слэшом.
+
  ## Имя файла, который при создании переменной $fastcgi_script_name будет добавляться после URI, если URI заканчивается слэшом.
 
  fastcgi_index index.php;
 
  fastcgi_index index.php;
 
   
 
   
  # Передавать ли клиенту ответы FastCGI-сервера с кодом больше либо равным 300.
+
  ## Передавать ли клиенту ответы FastCGI-сервера с кодом больше либо равным 300.
 
  #fastcgi_intercept_errors on;
 
  #fastcgi_intercept_errors on;
 
   
 
   
  # Добавить параметры из /etc/nginx/fastcgi_param.
+
  ## Добавить параметры из /etc/nginx/fastcgi_param.
 
  include fastcgi_params;
 
  include fastcgi_params;
 
   
 
   
  # Путь к скрипту, который будет передан в PHP-FPM.
+
  ## Путь к скрипту, который будет передан в PHP-FPM.
  # При использовании chroot окружения нужно указывать относительный путь.
+
  ## При использовании chroot окружения нужно указывать относительный путь.
 
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 
   
 
   
  # Закрывать ли соединение с FastCGI-сервером в случае, если клиент закрыл соединение, не дождавшись ответа.
+
  ## Закрывать ли соединение с FastCGI-сервером в случае, если клиент закрыл соединение, не дождавшись ответа.
 
  fastcgi_ignore_client_abort off;
 
  fastcgi_ignore_client_abort off;
 
и добавить в настройки виртуального хоста блок (<tt>{путь к файлу сокета}</tt> нужно заменить своим значением)
 
и добавить в настройки виртуального хоста блок (<tt>{путь к файлу сокета}</tt> нужно заменить своим значением)
  # Настройки обработки PHP-скриптов.
+
  ## Настройки обработки PHP-скриптов.
 
  location ~ \.php$ {
 
  location ~ \.php$ {
     # Подключение шаблона с настройками PHP.
+
     ## Подключение шаблона с настройками PHP.
 
     include /etc/nginx/templates/php;
 
     include /etc/nginx/templates/php;
 
      
 
      
     # Путь к UNIX-сокету PHP-FPM.
+
     ## Путь к UNIX-сокету PHP-FPM.
 
     fastcgi_pass unix:{путь к файлу сокета}
 
     fastcgi_pass unix:{путь к файлу сокета}
 
  }
 
  }
Строка 238: Строка 268:
  
 
Например (<tt>{адрес почты}</tt> и <tt>{имя сайта}</tt> нужно заменить своими значениями)
 
Например (<tt>{адрес почты}</tt> и <tt>{имя сайта}</tt> нужно заменить своими значениями)
  # Путь к sendmail и параметр, указывающий адрес почты администратора сайта.  
+
  ## Путь к sendmail и параметр, указывающий адрес почты администратора сайта.  
 
  fastcgi_param PHP_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f{адрес почты}";
 
  fastcgi_param PHP_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f{адрес почты}";
 
   
 
   
  # Директории с файлами сайта, файлами сессий и временными файлами.
+
  ## Директории с файлами сайта, файлами сессий и временными файлами.
  fastcgi_param PHP_ADMIN_VALUE "open_basedir = /var/www/{имя сайта}/:/var/www/{имя сайта}/save/:/var/www/{имя сайта}/tmp/";
+
  fastcgi_param PHP_ADMIN_VALUE "open_basedir = /var/www/{имя сайта}/:/tmp/:/";
 
   
 
   
  # Ограничение памяти для выполнения скриптов.
+
  ## Ограничение памяти для выполнения скриптов.
 
  fastcgi_param PHP_VALUE "memory_limit = 256M";
 
  fastcgi_param PHP_VALUE "memory_limit = 256M";
 
   
 
   
  # Максимальное время в секундах, в течение которого скрипт должен полностью загрузиться.
+
  ## Максимальное время в секундах, в течение которого скрипт должен полностью загрузиться.
 
  fastcgi_param PHP_VALUE "max_execution_time = 60";
 
  fastcgi_param PHP_VALUE "max_execution_time = 60";
 +
 +
Если при выполнении скриптов возникает ошибка 502, то может помочь добавление
 +
fastcgi_buffer_size 16k;
 +
fastcgi_buffers 4 16k;
 +
в настройки виртуального сервера.
 +
 +
=== node.js ===
 +
Для работы с сервером, основанным на [[node.js]] достаточно создать шаблон '''/etc/nginx/templates/nodejs_{имя сервера}''' (пример для сервера, основанного на [[node.js/Express|Express]]; <tt>{имя сервера}</tt>, <tt>{путь к корневой директории проекта}</tt>, <tt>{номер порта}</tt> и {путь к unix-сокету} нужно заменить подходящими значениями):
 +
<pre>## Директория с файлами сайта.
 +
root {путь к корневой директории проекта}/public;
 +
 +
## Файл лога для проблем доступа.
 +
access_log {путь к корневой директории проекта}/access.log;
 +
 +
## Файл лога для ошибок.
 +
error_log {путь к корневой директории проекта}/error.log;
 +
 +
## Передача node.js обработки запросов не статического контента.
 +
location ~ ^/(?!css|images|js|favicon.ico) {
 +
    ## Для сервера, слушающего порт.
 +
    #proxy_pass http://localhost:{номер порта};
 +
    ## Для сервера, слушающего unix-сокет.
 +
    proxy_pass http://unix:{путь к unix-сокету}:$uri$is_args$args;
 +
 +
    proxy_http_version 1.1;
 +
    proxy_set_header Upgrade $http_upgrade;
 +
    proxy_set_header Connection 'upgrade';
 +
    proxy_set_header Host $host;
 +
    proxy_cache_bypass $http_upgrade;
 +
}
 +
 +
## Отключить логи, связанные с отсутствием иконки сайта.
 +
location = /favicon.ico {
 +
    log_not_found off;
 +
    access_log off;
 +
}
 +
 +
## Доступ к файлу с настройками для поисковых роботов.
 +
location = /robots.txt {
 +
    allow all;
 +
    log_not_found off;
 +
    access_log off;
 +
}</pre>
 +
и подключить этот файл в настройках каждого виртуального хоста, работающего с рассматриваемым сервером [[node.js]].
  
 
=== Ссылки ===
 
=== Ссылки ===
Строка 262: Строка 336:
 
[[Категория:База знаний]]
 
[[Категория:База знаний]]
 
[[Категория:Linux]][[Категория:Ubuntu]]
 
[[Категория:Linux]][[Категория:Ubuntu]]
 +
[[Категория:nginx]][[Категория:PHP]][[Категория:node.js]][[Категория:MySQL]]

Текущая версия на 06:49, 21 марта 2017

В этой статье описывается установка и настройка веб-сервера nginx для работы с PHP-FPM, node.js и MySQL в операционной системе Ubuntu.

Установка[править]

# apt-get install nginx

Файл конфигурации[править]

Настройки хранятся в файле /etc/nginx/nginx.conf.

## Пользователь, от имени которого запускается nginx.
user www-data;

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

## Файл с ID процесса.
pid /run/nginx.pid;

## Директива уменьшает разрешение времени в рабочих процессах, за счёт чего уменьшается число системных вызовов gettimeofday().
timer_resolution 100ms;


events {
        ## Максимальное число подключений к серверу на один рабочий процесс.
        worker_connections 768;

        ## Эффективный метод обработки соединений, используемый в Linux 2.6+
        use epoll;

        ## Если выключен, то рабочий процесс за один раз принимает только одно новое соединение.
        multi_accept on;
}


http {
        ####
        ## Основные настройки.
        ####

        ## Разрешить использовать sendfile().
        sendfile on;

        ## Разрешить использование параметра сокета TCP_NOPUSH во FreeBSD или TCP_CORK в Linux.
        ## Параметр включается только при использовании sendfile.
        tcp_nopush on;

        ## Разрешить использование параметра TCP_NODELAY.
        ## Параметр включаются только при переходе соединения в состояние keep-alive.
        tcp_nodelay on;

        ## Таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера.
        ## Значение 0 запрещает keep-alive соединения с клиентами.
        keepalive_timeout 65;

        ## Максимальный размер хэш-таблиц типов.
        types_hash_max_size 2048;

        ## Запретить выдавать версию nginx’а в сообщениях об ошибках и в поле “Server” заголовка ответа.
        server_tokens off;

        ## Задать размер корзины в хэш-таблицах имён серверов.
        ## Значение по умолчанию зависит от размера строки кэша процессора.
        # server_names_hash_bucket_size 64;

        ## Разрешить или запретить использовать в абсолютных перенаправлениях, выдаваемых nginx’ом, основное имя сервера, задаваемое директивой server_name.
        ## Если использование основного имени сервера запрещено, то используется имя, указанное в поле “Host” заголовка запроса.
        ## Если же этого поля нет, то используется IP-адрес сервера. 
        # server_name_in_redirect off;

        ## Подключить описание MIME-типов.
        include /etc/nginx/mime.types;

        ## MIME-тип ответов по умолчанию.
        default_type application/octet-stream;


        ####
        ## Настройки SSL
        ####

        ## Разрешить указанные протоколы.
        ## Параметры TLSv1.1 и TLSv1.2 работают только при использовании библиотеки OpenSSL версии 1.0.1 и выше.
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

        ## Указать, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские.
        ssl_prefer_server_ciphers on;


        ####
        ## Настройки логов.
        ####

        ## Задать путь, формат и настройки буферизованной записи в лог.
        ## http://nginx.org/ru/docs/http/ngx_http_log_module.html#access_log
        access_log /var/log/nginx/access.log;

        ## Настроить запись в лог.
        ## На одном уровне может использоваться несколько логов (1.5.2).
        ## http://nginx.org/ru/docs/ngx_core_module.html#error_log
        error_log /var/log/nginx/error.log;


        ####
        ## Настройки сжатия.
        ####

        ## Разрешить сжатие ответа методом gzip.
        gzip on;

        ## Запретить сжатие ответа методом gzip для запросов с полями заголовка “User-Agent”, совпадающими с заданными регулярными выражениями.
        gzip_disable "msie6";

        ## Разрешить или запретить выдавать в ответе поле заголовка “Vary: Accept-Encoding”, если активны директивы gzip, gzip_static или gunzip.
        # gzip_vary on;

        ## Разрешить или запретить сжатие ответа методом gzip для проксированных запросов в зависимости от запроса и ответа.
        # gzip_proxied any;

        ## Степень сжатия ответа методом gzip.
        ## Допустимые значения находятся в диапазоне от 1 до 9.
        # gzip_comp_level 6;

        ## Число и размер буферов, в которые будет сжиматься ответ.
        # gzip_buffers 16 8k;

        ## Минимальная HTTP-версия запроса, необходимую для сжатия ответа.
        # gzip_http_version 1.1;

        ## Разрешить сжатие ответа методом gzip для указанных MIME-типов в дополнение к “text/html”.
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;


        ####
        ## Настройки виртуальных хостов.
        ####

        ## Подключить дополнительные файлы настроек.
        include /etc/nginx/conf.d/*.conf;

        ## Подключить настройки активных сайтов.
        include /etc/nginx/sites-enabled/*;
}

Для учета изменений настроек нужно перезагрузить службу

sudo service nginx reload

Ссылки

Виртуальные хосты[править]

Виртуальные хосты используются для описания параметров отдельных сайтов, которые обслуживает nginx. По-умолчанию, настройки хранятся в отдельных файлах в директории /etc/nginx/sites-available/, а для активации хоста нужно создать символьную ссылку в директории /etc/nginx/sites-enabled/ на соответствующий файл настроек

sudo ln -s /etc/nginx/sites-available/{имя сайта} /etc/nginx/sites-enabled/{имя сайта}

и перезагрузить службу

sudo service nginx reload

Один файл может содержать описание для нескольких сайтов, каждое должно находиться логическом блоке

server {
    ## Для того, чтобы сайт был доступен по адресам http://{имя домена 1}/ и http://{имя домена 2}/.
    server_name {имя домена 1} {имя домена 2};
         
    ## Обрабатываемый порт.
    listen 80;
    ## Обрабатываемый порт для определенного домена.
    #listen {имя домена} 8080;
    ## Обрабатываемый порт для ipv6.
    #listen [::]:80 [{имя домена}] ipv6only=on;
    
    ## Директория с файлами сайта.
    root /var/www/{имя сайта}/www;
    
    ## Файл лога для проблем доступа.
    access_log /var/www/{имя сайта}/access.log;
    
    ## Файл лога для ошибок.
    error_log /var/www/{имя сайта}/error.log;
    
    ## Подключение шаблона со стандартными настройками.
    include /etc/nginx/templates/default;
    
    ## Страница для ошибки 404.
    #error_page 404 /404.html;
    
    ## Перенаправление при ошибках на статическую страницу /50x.html.
    #error_page 500 502 503 504 /50x.html;
    #location = /50x.html {
    #    root /var/www/{имя сайта}/www;
    #}
}

Если server_name совпадает с именем сайта, то можно использовать макрос $server_name для подстановки вместо {имя сайта}.

Шаблоны[править]

Благодаря директиве include в блок настроек виртуального хоста можно включать внешние файлы. Шаблоны принято использовать для описания общих настроек. Файлы шаблонов, как правило, сохраняются в директорию /etc/nginx/templates/.

Например, стандартные настройки HTTP-хоста в файле /etc/nginx/templates/default

## Файлы, открываемые при пустом пути, в порядке приоритета.
index index.php index.html index.htm;

location / {
    ## Сначала запрос обрабатывается как файл, потом как директория, потом происходит переход на страницу 404.
    try_files $uri $uri/ =404;
    
    ## Раскоментировать для использования naxsi в этой области.
    #include /etc/nginx/naxsi.rules
}

## Закрыть доступ к файлами .htaccess и .htpassword.
location ~ /\.ht {
    deny all;
}

## Отключить логи, связанные с отсутствием иконки сайта.
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

## Доступ к файлу с настройками для поисковых роботов.
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}
# Активировать кэширование.
location ~* \.(ico|css|js)$ {
    expires 7d;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}

PHP[править]

Для работы с PHP-FPM достаточно создать шаблон /etc/nginx/templates/php:

## Адрес FastCGI-сервера (имя или адрес и порт или путь к UNIX-сокету).
## Указывается в настройках виртуального хоста.
#fastcgi_pass

## Имя файла, который при создании переменной $fastcgi_script_name будет добавляться после URI, если URI заканчивается слэшом.
fastcgi_index index.php;

## Передавать ли клиенту ответы FastCGI-сервера с кодом больше либо равным 300.
#fastcgi_intercept_errors on;

## Добавить параметры из /etc/nginx/fastcgi_param.
include fastcgi_params;

## Путь к скрипту, который будет передан в PHP-FPM.
## При использовании chroot окружения нужно указывать относительный путь.
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

## Закрывать ли соединение с FastCGI-сервером в случае, если клиент закрыл соединение, не дождавшись ответа.
fastcgi_ignore_client_abort off;

и добавить в настройки виртуального хоста блок ({путь к файлу сокета} нужно заменить своим значением)

## Настройки обработки PHP-скриптов.
location ~ \.php$ {
    ## Подключение шаблона с настройками PHP.
    include /etc/nginx/templates/php;
    
    ## Путь к UNIX-сокету PHP-FPM.
    fastcgi_pass unix:{путь к файлу сокета}
}

С помощью директивы fastcgi_param и параметра PHP_VALUE можно изменять настройки службы PHP. Если использовать параметр PHP_ADMIN_VALUE, то указанная настройка не сможет быть изменена скриптом.

Например ({адрес почты} и {имя сайта} нужно заменить своими значениями)

## Путь к sendmail и параметр, указывающий адрес почты администратора сайта. 
fastcgi_param PHP_VALUE "sendmail_path = /usr/sbin/sendmail -t -i -f{адрес почты}";

## Директории с файлами сайта, файлами сессий и временными файлами.
fastcgi_param PHP_ADMIN_VALUE "open_basedir = /var/www/{имя сайта}/:/tmp/:/";

## Ограничение памяти для выполнения скриптов.
fastcgi_param PHP_VALUE "memory_limit = 256M";

## Максимальное время в секундах, в течение которого скрипт должен полностью загрузиться.
fastcgi_param PHP_VALUE "max_execution_time = 60";

Если при выполнении скриптов возникает ошибка 502, то может помочь добавление

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;

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

node.js[править]

Для работы с сервером, основанным на node.js достаточно создать шаблон /etc/nginx/templates/nodejs_{имя сервера} (пример для сервера, основанного на Express; {имя сервера}, {путь к корневой директории проекта}, {номер порта} и {путь к unix-сокету} нужно заменить подходящими значениями):

## Директория с файлами сайта.
root {путь к корневой директории проекта}/public;

## Файл лога для проблем доступа.
access_log {путь к корневой директории проекта}/access.log;

## Файл лога для ошибок.
error_log {путь к корневой директории проекта}/error.log;

## Передача node.js обработки запросов не статического контента.
location ~ ^/(?!css|images|js|favicon.ico) {
    ## Для сервера, слушающего порт.
    #proxy_pass http://localhost:{номер порта};
    ## Для сервера, слушающего unix-сокет.
    proxy_pass http://unix:{путь к unix-сокету}:$uri$is_args$args;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

## Отключить логи, связанные с отсутствием иконки сайта.
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

## Доступ к файлу с настройками для поисковых роботов.
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

и подключить этот файл в настройках каждого виртуального хоста, работающего с рассматриваемым сервером node.js.

Ссылки[править]

Ссылки[править]