1. Установите Nginx
1.1 Выбор стабильной версии
Мы компилируем и устанавливаем Nginx, чтобы настроить собственные модули, на машине CentOS 6.2 x86_64. Сначала установите отсутствующие пакеты зависимостей:
# yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
Если эти пакеты недоступны в yum, вы можете скачать исходный код, скомпилировать и установить их. Обратите внимание на каталог установки по умолчанию во время компиляции и убедитесь, что файлы динамических библиотек могут быть найдены при установке Nginx ниже (ldconfig).

сhttp://nginx.org/en/download.htmlскачайте стабильную версию nginx-1.6.3.tar.gz в /usr/local/src и распакуйте её.
Для последующей подготовки мы также скачиваем 2 модуля плагинов:nginx_upstream_check_module-0.3.0.tar.gz— Проверка состояния бэкенд-серверов,nginx-goodies-nginx-sticky-module-ng-bd312d586752.tar.gz(Рекомендуется переименовать каталог в nginx-sticky-module-ng-1.2.5 после распаковки в /usr/local/src) — для бэкендабалансировка нагрузкиРешите проблему прилипчивости сессии (при использовании с модулем upstream_check требуется дополнительный патч, пожалуйста, обратитесь кКонфигурация балансировки нагрузки Nginx на практике)。
Обратите внимание на совместимость версий плагинов и Nginx. Как правило, чем новее плагин, тем лучше; Nginx не нужно гнаться за самой новой версией, стабильность превыше всего. nginx-1.4.7, nginx-sticky-module-1.1, nginx_upstream_check_module-0.2.0, эта комбинация тоже подходит. sticky-1.1 с версиями nginx-1.6 вызывал ошибки компиляции из-за отставания обновлений. (Можно напрямую использовать Tengine, который по умолчанию включает эти модули)
[root@cachets nginx-1.6.3]# pwd /usr/local/src/nginx-1.6.3 [root@cachets nginx-1.6.3]# ./configure --prefix=/usr/local/nginx-1.6 --with-pcre / > --with-http_stub_status_module --with-http_ssl_module / > --with-http_gzip_static_module --with-http_realip_module / > --add-module=../nginx_upstream_check_module-0.3.0 [root@cachets nginx-1.6.3]# make && make install
1.2 Описание общих параметров компиляции
Большинство часто используемых модулей Nginx устанавливаются по умолчанию при компиляции; те, что начинаются с --without в ./configure --help, устанавливаются по умолчанию.
- --prefix=PATH: Указывает каталог установки Nginx. По умолчанию /usr/local/nginx
- --conf-path=PATH: Задает путь к файлу конфигурации nginx.conf. Nginx позволяет запускаться с различными файлами конфигурации с помощью опции -c в командной строке. По умолчаниюprefix/conf/nginx.conf
- --user=name: Задаёт пользователя для рабочих процессов Nginx. После установки вы можете в любой момент изменить директиву user в файле конфигурации nginx.conf. Имя пользователя по умолчанию — nobody. --group=name действует аналогично.
- --with-pcre: Задаёт путь к исходному коду библиотеки PCRE. Если она была установлена через yum, используйте --with-pcre, чтобы автоматически найти файлы библиотеки. При использовании --with-pcre=PATH необходимо скачать исходный код библиотеки pcre (версии 4.4 – 8.30) с сайта PCRE и распаковать его; остальное сделают ./configure и make Nginx. Регулярные выражения Perl используются в директиве location и модуле ngx_http_rewrite_module.
- --with-zlib=PATH: Указывает каталог распаковки исходников zlib (версии 1.1.3 – 1.2.5). zlib требуется для модуля сжатия при передаче по сети ngx_http_gzip_module, который включён по умолчанию.
- --with-http_ssl_module: Использует модуль протокола HTTPS. По умолчанию этот модуль не собирается. Необходимое условие — установлены openssl и openssl-devel.
- --with-http_stub_status_module: Используется для мониторинга текущего состояния Nginx
- --with-http_realip_module: Этот модуль позволяет изменять значение IP-адреса клиента в заголовках клиентского запроса (таких как X-Real-IP или X-Forwarded-For). Смысл в том, что он позволяет серверам бэкенда записывать исходный IP-адрес клиента.
- --add-module=PATH: Добавляет сторонние внешние модули, такие как nginx-sticky-module-ng или модули кэша. При каждом добавлении нового модуля требуется перекомпиляция (Tengine может добавлять новые модули без перекомпиляции).
Вот ещё одна схема компиляции:
./configure / > --prefix=/usr / > --sbin-path=/usr/sbin/nginx / > --conf-path=/etc/nginx/nginx.conf / > --error-log-path=/var/log/nginx/error.log / > --http-log-path=/var/log/nginx/access.log / > --pid-path=/var/run/nginx/nginx.pid / > --lock-path=/var/lock/nginx.lock / > --user=nginx / > --group=nginx / > --with-http_ssl_module / > --with-http_stub_status_module / > --with-http_gzip_static_module / > --http-client-body-temp-path=/var/tmp/nginx/client/ / > --http-proxy-temp-path=/var/tmp/nginx/proxy/ / > --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ / > --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi / > --with-pcre=../pcre-7.8 > --with-zlib=../zlib-1.2.3
1.3 Запуск и остановка Nginx
## 检查配置文件是否正确 # /usr/local/nginx-1.6/sbin/nginx -t # ./sbin/nginx -V # 可以看到编译选项 ## 启动、关闭 # ./sbin/nginx # 默认配置文件 conf/nginx.conf,-c 指定 # ./sbin/nginx -s stop или pkill nginx ## 重启,不会改变启动时指定的配置文件 # ./sbin/nginx -s reload или kill -HUP `cat /usr/local/nginx-1.6/logs/nginx.pid`
Конечно, вы также можете управлять Nginx как системной службой. Скачайте nginx в /etc/init.d/, измените пути внутри, а затем дайте ему права на выполнение.
# service nginx {start|stop|status|restart|reload|configtest}
1.4 Установка через yum
Установка RPM-пакета через yum намного проще, чем компиляция и установка. Многие модули устанавливаются по умолчанию, но недостаток в том, что если вы захотите позже установить сторонние модули, сделать это будет невозможно.
# vi /etc/yum.repo.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
Остальное делается с помощью yum install nginx. Вы также можете использовать yum install nginx-1.6.3, чтобы установить конкретную версию (при условии, что соответствующая версия есть в пакетах; по умолчанию используется последняя стабильная версия).
2. Конфигурационный файл nginx.conf
Файл конфигурации Nginx в основном делится на четыре части: main (глобальные настройки), server (настройки хоста), upstream (настройки upstream-серверов, в основном связанные с конфигурациями обратного прокси и балансировки нагрузки) и location (настройки после того, как URL совпадает с определённым местоположением). Каждая часть содержит несколько директив. Директивы, заданные в части main, влияют на настройки всех остальных частей; директивы в части server в основном используются для указания доменных имён виртуальных хостов, IP и портов; директивы в upstream используются для задания ряда бэкенд-серверов, настройки обратного прокси и балансировки нагрузки бэкенд-серверов; часть location используется для сопоставления местоположений веб-страниц (например, корневой каталог "/", "/images" и т. д.). Связь между ними такова: server наследует main, location наследует server; upstream не наследует директивы и сам не наследуется. У него есть собственные специальные директивы, и его не нужно применять где-либо ещё.
Несколько контекстов директив, поддерживаемых в настоящее время Nginx:
2.1 Общие
Следующий nginx.conf — простой пример того, как Nginx выступает в роли сервера обратного прокси на фронтенде, обрабатывает статические файлы, такие как js и png, и перенаправляет динамические запросы, такие как jsp, на другой сервер, Tomcat:
user www www;
worker_processes 2;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 2048;
}
http {
include 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 logs/access.log main;
sendfile on;
# tcp_nopush on;
keepalive_timeout 65;
# gzip压缩功能设置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
# http_proxy 设置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
# 设定负载均衡后台服务器列表
upstream backend {
#ip_hash;
server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
}
# 很重要的虚拟主机配置
server {
listen 80;
server_name itoatest.example.com;
root /apps/oaapp;
charset utf-8;
access_log logs/host.access.log main;
#对 / 所有做负载均衡+反向代理
location / {
root /apps/oaapp;
index index.jsp index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
#静态文件,nginx自己处理,不去backend请求tomcat
location ~* /download/ {
root /apps/oa/fs;
}
location ~ .*/.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /apps/oaapp;
expires 7d;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.10.0/24;
deny all;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
## 其它虚拟主机,server 指令开始
}
2.2 Описание общих директив
2.2.1 Глобальная конфигурация main
Некоторые параметры Nginx во время выполнения, не связанные с конкретными бизнес-функциями (такими как служба HTTP или прокси почтовой службы), например количество рабочих процессов, идентификационные данные пользователя, от имени которого выполняется запуск, и т. д.
- woker_processes 2
В секции верхнего уровня файла конфигурации — количество рабочих процессов в роли worker. Главный процесс получает запросы и распределяет их между рабочими процессами для обработки. Для простоты это значение можно задать равным числу ядер CPU `grep ^processor /proc/cpuinfo | wc -l`, что также является значением `auto`. Если включены SSL и gzip, его следует установить равным числу логических CPU или даже вдвое больше, что позволяет сократить операции ввода-вывода. Если сервер Nginx также выполняет другие сервисы, рассмотрите возможность его соответствующего уменьшения.mainТакже записывается в главной секции. - worker_cpu_affinity
В ситуациях высокой нагрузки задайте привязку к CPU, чтобы уменьшить потери производительности, вызванные перестройкой регистров и других контекстов из-за переключения между ядрами CPU. Например: worker_cpu_affinity 0001 0010 0100 1000; (четыре ядра).mainЗаписывается в - worker_connections 2048
секции. Каждый рабочий процесс может одновременно обрабатывать (инициировать) максимальное число соединений (включая все соединения с клиентами или проксируемыми бэкенд-серверами). Когда Nginx выступает в роли обратного прокси-сервера, формула расчёта такова: максимальное число соединений = worker_processes * worker_connections / 4, поэтому максимальное число клиентских соединений здесь равно 1024. Это можно без проблем увеличить до 8192, в зависимости от ситуации, но оно не может превышать указанное ниже worker_rlimit_nofile. Когда Nginx выступает в роли HTTP-сервера, формула расчёта делится на 2.eventsЗаписывается в - worker_rlimit_nofile 10240
секции. По умолчанию она не задаётся и может быть ограничена максимумом операционной системы 65535.mainЗаписывается в секции events. В Linux Nginx по умолчанию использует модель событий epoll. Благодаря этому Nginx довольно эффективен в Linux. В то же время Nginx использует kqueue — высокоэффективную модель событий, аналогичную epoll, в системах OpenBSD или FreeBSD. select используется только тогда, когда операционная система не поддерживает эти высокоэффективные модели. - использовать epoll
2.2.2 HTTP-сервер
Некоторые параметры конфигурации, связанные с предоставлением HTTP-сервисов. Например: использовать ли keepalive, использовать ли gzip для сжатия и т. д.
Включить высокоэффективный режим передачи файлов. Директива sendfile указывает, вызывает ли Nginx функцию sendfile для вывода файлов, что уменьшает переключения контекста из пользовательского пространства в пространство ядра. Для обычных приложений установите её в on; для приложений с высокой нагрузкой на дисковый ввод-вывод, таких как загрузки, её можно установить в off, чтобы сбалансировать скорости обработки дискового и сетевого ввода-вывода и снизить нагрузку на систему.
- sendfile on
Включить эффективный режим передачи файлов. Директива sendfile указывает, вызывает ли nginx функцию sendfile для вывода файлов, что уменьшает переключения контекста из пользовательского пространства в пространство ядра. Для обычных приложений установите её в on; если она используется для приложений с высокой нагрузкой на дисковый ввод-вывод, таких как загрузки, её можно установить в off, чтобы сбалансировать скорости обработки дискового и сетевого ввода-вывода и снизить нагрузку на систему. - keepalive_timeout 65 : таймаут keep-alive в секундах. Этот параметр очень чувствителен: он зависит от типов браузеров, настроек таймаутов серверной части и настроек операционной системы; ему можно было бы посвятить отдельную статью. Благодаря keep-alive при запросе множества небольших файлов можно снизить накладные расходы на повторное установление соединений. Однако если выполняется загрузка большого файла и она не завершится в течение 65 секунд, она завершится неудачно. Если таймаут установлен слишком большим и пользователей много, длительное удержание соединений будет потреблять много ресурсов.
- send_timeout : используется для указания таймаута ответа клиенту. Этот таймаут ограничен временем между двумя действиями соединения. Если у клиента нет активности дольше этого времени, Nginx закроет соединение.
- client_max_body_size 10m
Максимальный размер в байтах одного файла, допустимый для клиентских запросов. При загрузке больших файлов установите его ограничение. - client_body_buffer_size 128k
Максимальное количество байт для буферизации клиентских запросов в буфере прокси.
Модуль http_proxy:
Этот модуль реализует функциональность Nginx в качестве обратного прокси-сервера, включая кэширование (также см.статью)
- proxy_connect_timeout 60
Таймаут подключения Nginx к серверам бэкенда (таймаут соединения с прокси) - proxy_read_timeout 60
После успешного подключения — таймаут между двумя успешными операциями ответа с сервером бэкенда (таймаут приёма ответа прокси) - proxy_buffer_size 4k
Задаёт размер буфера для прокси-сервера (nginx) для чтения и сохранения пользовательской информации озаголовкахот сервера бэкенда. По умолчанию совпадает с размером proxy_buffers; фактически это значение директивы можно задать немного меньше. - proxy_buffers 4 32k
Буфер proxy_buffers: nginx кэшируетответыот сервера бэкенда для одного соединения. Если средняя веб-страница меньше 32k, настройте так - proxy_busy_buffers_size 64k
Размер буфера при высокой нагрузке (proxy_buffers*2) - proxy_max_temp_file_size
Когда proxy_buffers не может вместить содержимое ответа от backend-сервера, часть его будет сохранена во временный файл на диске. Это значение задаёт максимальный размер временного файла; по умолчанию — 1024M. Оно не связано с proxy_cache. Если размер превышает это значение, содержимое будет передано обратно с upstream-сервера. Установка значения 0 отключает это. - proxy_temp_file_write_size 64k
Когда кэшированные ответы проксируемого сервера записываются во временные файлы, эта опция ограничивает размер каждой записи во временный файл. proxy_temp_path (который можно задать во время компиляции) указывает каталог для записи.
proxy_pass и proxy_redirect, см. раздел location.
Модуль http_gzip:
- gzip on : включить вывод со сжатием gzip для уменьшения сетевого трафика.
- gzip_min_length 1k : задаёт минимальный размер страницы в байтах, разрешённый для сжатия. Размер страницы в байтах берётся из content-length в заголовке. Значение по умолчанию — 20. Рекомендуется задавать размер больше 1k; ниже 1k файл после сжатия может стать больше.
- gzip_buffers 4 16k : задаёт, сколько единиц кэша система получает для хранения потока данных результата, сжатого gzip. "4 16k" означает использование 16k как единицы, выделение памяти в объёме, в 4 раза превышающем исходный размер данных, единицами по 16k.
- gzip_http_version 1.0 : используется для определения версии протокола HTTP. Ранние браузеры не поддерживают gzip-сжатие, и пользователи видели бы нечитаемый текст. Поэтому эта опция была добавлена для поддержки более ранних версий. Если вы используете Nginx в качестве обратного прокси и хотите также включить gzip-сжатие, так как взаимодействие с backend идёт по http/1.0, установите значение 1.0.
- gzip_comp_level 6 : степень сжатия gzip. 1 — наименьшая степень сжатия и самая высокая скорость обработки; 9 — наибольшая степень сжатия, но самая низкая скорость обработки (быстрее передача, но больше нагрузка на CPU).
- gzip_types : сопоставляет MIME-типы для сжатия. Указан он или нет, тип "text/html" всегда сжимается.
- gzip_proxied any : включается, когда Nginx работает как обратный прокси. Он определяет, включать или отключать сжатие результатов, возвращаемых бэкенд-сервером. Предварительное условие для сопоставления — бэкенд-сервер должен возвращать заголовок, содержащий "Via".
- gzip_vary on : связано с HTTP-заголовками. Он добавляет заголовок ответа "Vary: Accept-Encoding", позволяя серверам кэширования на фронтенде кэшировать страницы, сжатые gzip. Например, используйте Squid для кэширования данных, сжатых Nginx.
2.2.3 Виртуальные хосты server
Служба http поддерживает несколько виртуальных хостов. Каждому виртуальному хосту соответствует блок конфигурации server, который содержит конфигурацию, относящуюся к этому виртуальному хосту. При предоставлении прокси для почтовой службы также можно создавать несколько блоков server. Каждый сервер различается по адресу или порту прослушивания.
- listen
Порт прослушивания, по умолчанию 80. Порты ниже 1024 должны запускаться от имени root. Он может быть в таких формах, как listen *:80, listen 127.0.0.1:80, и т. д. - server_name
Имя сервера, например localhost, www.example.com. Его можно сопоставлять с регулярными выражениями.
Модуль http_stream
Этот модуль реализует балансировку нагрузки от IP-адресов клиентов к бэкенд-серверам с помощью простого алгоритма планирования. После "upstream" указывается имя балансировщика нагрузки, а бэкенд-серверы организуются в {} в виде параметров host:port;. Если проксируется только один бэкенд, его также можно записать напрямую в proxy_pass.
2.2.4 location
В службе http — ряд директив конфигурации, соответствующих некоторым конкретным URL.
- root /var/www/html
Определяет расположение корневого каталога сайта по умолчанию для сервера. Если URL location совпадает с подкаталогом или файлом, root почти не влияет. Обычно размещается в директиве server или в разделе "/". - index index.jsp index.html index.htm
Задаёт имя файла по умолчанию для доступа по пути. Обычно размещается вместе с root. - proxy_pass http:/backend
Перенаправляет запросы к списку серверов, определённому backend, то есть обратный прокси, соответствующий балансировщику нагрузки upstream. Также может быть proxy_pass http://ip:port. - proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Пока что задайте эти четыре так. Если копнуть глубже, каждый из них включает очень сложное содержимое, которое будет объяснено в другой статье.
Что касается синтаксиса правил сопоставления location, можно сказать, что он особенно критичен и фундаментален. См. статьюКраткое описание конфигурации location и синтаксиса правил rewrite в Nginx;
2.3 Прочее
2.3.1 Управление доступом allow/deny
Модуль управления доступом Nginx устанавливается по умолчанию, и его синтаксис также очень прост. Может быть несколько директив allow и deny, разрешающих или блокирующих доступ с определённого IP или диапазона IP. Как только любое правило совпадает в порядке следования, сопоставление прекращается. Например:
location /nginx-status {
stub_status on;
access_log off;
# auth_basic "NginxStatus";
# auth_basic_user_file /usr/local/nginx-1.6/htpasswd;
allow 192.168.10.100;
allow 172.29.73.0/24;
deny all;
}
Мы также часто используем htpasswd из инструмента httpd-devel, чтобы установить пароль для входа для пути, к которому осуществляется доступ:
# htpasswd -c htpasswd admin New passwd: Re-type new password: Adding password for user admin # htpasswd htpasswd admin //修改admin密码 # htpasswd htpasswd sean //多添加一个认证用户
При этом по умолчанию создаётся файл паролей, зашифрованный с помощью CRYPT. Раскомментируйте две строки nginx-status выше и перезапустите Nginx, чтобы это вступило в силу.
2.3.2 Листинг каталога autoindex
По умолчанию Nginx не разрешает листинг всего каталога. Если вам нужна эта функция, откройте файл nginx.conf и добавьте "autoindex on;" в секции location, server или http. Также лучше добавить два других параметра:
- autoindex_exact_size off; По умолчанию on, показывается точный размер файла в байтах. После изменения на off отображается приблизительный размер файла в kB, MB или GB.
- autoindex_localtime on;
По умолчанию off, время файла отображается как время GMT. После изменения на on отображаемое время файла — это серверное время файла.
location /images {
root /var/www/nginx-default/images;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}