База знаний

Часто задаваемые вопросы, на которые мы уже ответили

Веб-сервер nginx

nginx — это веб-сервер, который используется в качестве самостоятельного веб-сервера, либо проксирующего frontend-сервера для передачи данных на другой веб-сервер, кеширования запросов, балансировки нагрузки.

Распространено использование связки nginx в качестве frontend-сервера, обслуживающего запросы к статическому содержимому и проксирующего запросы на Apache, который в качестве backend-сервера обрабатывает динамическое содержимое. Подобная реализация присутствует на серверах нашего хостинга.

Работа nginx и его модулей настраивается директивами, указанными в файле /etc/nginx/nginx.conf. В нем же указываются пути к другим конфигурационным файлам, если требуется задать разные настройки для каждого сайта.

Конфигурационные файлы для отдельных сайтов расположены в каталоге:

Debian/Ubuntu: /etc/nginx/sites-available

CentOS: /etc/nginx/conf.d

Директивы делятся на блочные, внутри которых в фигурных скобках ({}) содержится набор инструкций, и простые, которые состоят из имени и значений и оканчиваются символом ;.

Блочные директивы называются контекстами. Они вложены друг в друга в следующем порядке:

  1. main
  2. http
  3. server
  4. location

Может быть несколько блоков server, различающихся по портам и именам сервера.

Каждый блок server может содержать несколько директив location, после которой указывается префикс, сравниваемый с URI из запроса.

Стоит отметить: если в конфигурации есть совпадение с несколькими location, выбирается блок с самым длинным префиксом.

Пример:

server {
location / {
root /data/www;
}

location /images/ {
root /data;
}
}

В этом случае:

  • запросам http://localhost/images/ будут отдаваться файлы из /data/images;
  • запросам http://localhost/some будут отдаваться файлы из /data/www/some.

Установка

Установка веб-сервера nginx осуществляется следующим образом:

CentOS/RHEL

  • Загружаем ключ, которым подписаны пакеты и репозиторий nginx:
$ wget https://nginx.org/keys/nginx_signing.key
  • Создаем файл /etc/yum.repos.d/nginx.repo со ссылкой на репозиторий вида http://nginx.org/packages/OS/OSRELEASE/$basearch/, где вместо OS пишем rhel или centos, а вместо OSRELEASE цифру 6 или 7 в соответствии с дистрибутивом и его версией:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
  • Добавляем nginx_signing.key к связке ключей программы rpm:
$ rpm --import nginx_signing.key
  • Выполняем установку:
$ yum install nginx

Debian/Ubuntu

  • Загружаем ключ, которым подписаны пакеты и репозиторий nginx:
$ wget https://nginx.org/keys/nginx_signing.key
  • Добавляем его к связке ключей программы apt:
$ apt-key add nginx_signing.key
  • Добавляем в конец файла /etc/apt/sources.list добавляем строку «http://nginx.org/packages/os/ codename nginx», где место os указываем Debian или Ubuntu, а codename заменяем на то, которое соответствует дистрибутиву на официальном сайте nginx:
deb http://nginx.org/packages/debian/ jessie nginx
deb-src http://nginx.org/packages/debian/ jessie nginx
  • Обновляем менеджер пакетов:
$ apt-get update
  • Выполняем установку:
$ apt-get install nginx

Установка модулей

Если в текущей сборке веб-сервера отсутствуют необходимые модули, для их установки потребуется скомпилировать nginx самостоятельно.

Компиляция nginx выполняется следующим образом:

  • Смотрим, какая версия установлена сейчас и с какими модулями:
$ nginx -V
nginx version: nginx/1.11.5
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --lock-path=/var/lock/nginx.lock
--pid-path=/var/run/nginx.pid --with-pcre-jit --with-http_gzip_static_module --with-ipv6
--without-http_browser_module --without-http_geo_module --without-http_limit_req_module --without-http_limit_zone_module
--without-http_memcached_module --without-http_referer_module --without-http_scgi_module --without-http_split_clients_module --with-http_stub_status_module --without-http_ssi_module --without-http_userid_module --without-http_uwsgi_module --add-module=/tmp/buildd/nginx-1.12.0/debian/modules/nginx-echo
  • Устанавливаем необходимое для компиляции ПО:
$ apt-get install gcc make g++
  • Загружаем исходники той же версии:
$ wget http://nginx.org/download/nginx-1.11.5.tar.gz
  • Распаковываем архив:
$ tar xzf nginx-1.11.5.tar.gz
  • Переходим в каталог из архива:
$ cd nginx-1.11.5
  • Конфигурируем nginx с необходимыми нам параметрами. Установку производим в директорию, отличную от той, где веб-сервер работает сейчас. Указываем путь к каталогу в параметре --prefix. Для установки нового модуля добавляем --with с его именем, например, --with-http_ssl_module
/configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --lock-path=/var/lock/nginx.lock
--pid-path=/var/run/nginx.pid --with-pcre-jit --with-http_gzip_static_module  --with-ipv6
--without-http_browser_module --with-http_geoip_module --without-http_memcached_module --without-http_referer_module
--without-http_scgi_module --without-http_split_clients_module --with-http_stub_status_module --without-http_ssi_module
--without-http_userid_module --without-http_uwsgi_module --with-http_ssl_module
  • При конфигурации может возникнуть ошибка, если необходимые библиотеки отсутствуют:
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl= option.
  • Чтобы исправить ошибку с OpenSSL, устанавливаем библиотеку libssl-dev:
$ apt-get install libssl-dev
  • В результате успешной сборки в выводе будет следующее:
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ using system zlib library

nginx path prefix: "/usr/local/nginx" 
nginx binary file: "/usr/local/nginx/sbin/nginx" 
nginx modules path: "/usr/local/nginx/modules" 
nginx configuration prefix: "/usr/local/nginx/conf" 
nginx configuration file: "/usr/local/nginx/conf/nginx.conf" 
nginx pid file: "/usr/local/nginx/logs/nginx.pid" 
nginx error log file: "/usr/local/nginx/logs/error.log" 
nginx http access log file: "/usr/local/nginx/logs/access.log" 
nginx http client request body temporary files: "client_body_temp" 
nginx http proxy temporary files: "proxy_temp" 
nginx http fastcgi temporary files: "fastcgi_temp" 
nginx http uwsgi temporary files: "uwsgi_temp" 
nginx http scgi temporary files: "scgi_temp" 
  • Выполняем компиляцию:
$ make
  • Выполняем установку:
$ make install
  • Останавливаем работу веб-сервера
service nginx stop
  • Заменяем текущую версию nginx на новую:
$ mv /usr/sbin/nginx /usr/sbin/nginx_back
$ mv /etc/nginx/sbin/nginx /usr/sbin/nginx
  • Проверяем, что необходимый модуль появился:
$ nginx -V
  • Запускаем веб-сервер:
service nginx start

Более подробно о процессе компиляции и конфигурации nginx вы можете узнать из официальной документации.

Настройка

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

Для избежания ошибок в работе веб-сервера после внесения изменений, необходимо проверить корректность конфигурации с помощью команды:

$ sudo nginx -t

Если в результате обнаружены какие-либо ошибки, их необходимо исправить перед запуском веб-сервера.

Применение изменений

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

$ nginx -s reload

или

$ systemctl reload nginx

HTTP2

Для корректной работы протокола HTTP 2.0 необходимо наличие OpenSSL v1.0.2 и модуля ngx_http_v2_module.

Также в конфигурационный файл nginx необходимо добавить директивы:

server {
listen 443 ssl http2;

ssl_certificate server.crt;
ssl_certificate_key server.key;
}

Скрыть версию веб-сервера

Для скрытия версии веб-сервера в теле HTTP-запроса, в конфигурационный файл nginx.conf в секцию http требуется добавить директиву:

server_tokens off;

Перенаправление на другой домен

Для настройки перенаправления, в  блок server для сайта, с которого надо настроить перенаправление, добавляем директиву return с нужным кодом ответа и целевым доменом:

server {
listen 80;
server_name domain.ru;
return 302 http://www.domain.ru$request_uri;
}

Расширение статических файлов и их кеширование в браузере

За время кеширования статики на стороне браузера отвечает параметр expires. Он указывается в директиве location после перечисления расширений, к которым будет применяться:

server {
...
location ~* ^.+\.(jpg|jpeg|gif|png|ico|)$ {
expires 1d;
}
location ~* ^.+\.(rss|js|css)$ {
expires 1h;
}
...
}

Настройка nginx + PHP + MySQL

nginx не имеет встроенной поддержки обработки PHP, поэтому потребуется менеджер процессов fastCGI, который умеет интерпретировать PHP, и внести изменения в конфигурационный файл.

Для этого необходимо выполнить следующее:

  • Устанавливаем php-fpm и модуль для взаимодействия PHP с MySQL:
$ sudo apt-get install php-fpm php-mysql
  • Изменяем индексный файл по умолчанию на index.php:
server {
...
index index.php
  • Добавляем location для обработки скриптов php средствами fastCGI:
server {
...
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
...
  • Запрещаем доступ к .htaccess, так как nginx не обрабатывает эти файлы:
    location ~ /\.ht {
deny all;
}


Была ли эта инструкция полезной?