nginx — это веб-сервер, который используется в качестве самостоятельного веб-сервера, либо проксирующего frontend-сервера для передачи данных на другой веб-сервер, кеширования запросов, балансировки нагрузки.
Распространено использование связки nginx в качестве frontend-сервера, обслуживающего запросы к статическому содержимому и проксирующего запросы на Apache, который в качестве backend-сервера обрабатывает динамическое содержимое. Подобная реализация присутствует на серверах нашего хостинга.
Работа nginx и его модулей настраивается директивами, указанными в файле /etc/nginx/nginx.conf
. В нем же указываются пути к другим конфигурационным файлам, если требуется задать разные настройки для каждого сайта.
Конфигурационные файлы для отдельных сайтов расположены в каталоге:
Debian/Ubuntu: /etc/nginx/sites-available
CentOS: /etc/nginx/conf.d
Директивы делятся на блочные, внутри которых в фигурных скобках ({}
) содержится набор инструкций, и простые, которые состоят из имени и значений и оканчиваются символом ;
.
Блочные директивы называются контекстами. Они вложены друг в друга в следующем порядке:
- main
- http
- server
- 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; }