Almost Over

Установка NGINX или Tengine на CentOS

Установка NGINX или Tengine на CentOS

Немного о NGINX, NGINX Plus и Tengine

Держу пари, многие владельцы серверов сталкивались с проблемой нагрузки при объёмном количестве посетителей, если у них отсутствовал какой-либо кешируемый прокси-сервер перед обработкой бэкенда. И, наверное, каждый знает о грандиозном и нашумевшим в своё время продукте NGINX. EngineX — так расшифровывает эти заветные буквы автор и создатель этого проекта, Игорь Сысоев. Игорь долгое время работал в Рамблере и именно там он понял, что Apache сильно далёк от идеала. И тогда он начал разрабатывать свой движек, свой Engine; свой универсайльный и оптимальный код, свой X. И у него получилось. Кстати, именно Рамблер стал первопроходцем-испытателем этого движка, а теперь на NGINX’е работают чуть ли не пол мира серверов.

NGINX — идеален. И, полагаю, в ближайшие 10 лет ему вряд ли составят конкуренцию в области кешируемых/прокси серверов и балансировщиков нагрузки одноверменно. Чем больше я изучал этот продукт, тем больше я был в восторге от него. И Вы, без сомнений, будете. EngineX ещё никого не оставлял равнодушным. Что я знаю об идеальных продуктах?

  • Скорость.
  • Гибкость.
  • Масштабируемость.
  • Отказоустойчивость.


И ведь казалось бы, на сегодняшний день NGINX один из самых дорогих в мире электронных продуктов, а создал его, опять же/в который раз уже, обычный совецкий мужик. А почему, как вы думаете, продукт так внезапно стал замечен, зарегистрирован под версию для продажи, и, переехав на com, даже приобрёл себе Extened Validation сертификат на домен? Вопрос риторический, в принципе. Особенно, когда вы загуглите цену на NGNIX Plus. Лично я не думаю, что такой ценник был инициативой самого Автора. По крайней мере, я всегда буду верить как в простоту и щедрость Русской души, так и в тщеславность и алчность Американской. Но всё же факт остаётся фактом: платный NGINX попросту недоступен средним или малым организациям, а уж простым смертным тем более.

Здесь следует сделать оговорку: для большинства случаев обыкновенной бесплатной версии Джинкса будет достаточно. Собственно, все отличия бесплатной NGINX от NGINX Plus можно посомтреть здесь.


А каковы же тогда отличия Tengine от бесплатной NGINX? Их не мало, а посмотреть их можно на tengine.taobao.org.

  1. Расширенная динамическая подгрузка модулей. В новых версиях NGINX (>1.10.2) появилась возможность динамической загрузки модулей.
  2. Многие (если не все) платные возможности присутсвуют.
  3. Даже багфиксы есть.

Из минусов, наверное, это неофициальная поддержка и не настолько частые обновления версий. Тут каждый должен решить для себя сам, что для него лучше: ограниченная официальная версия с частыми обновлениями или не официальная версия с дополнительными возможностями и редкими обновлениями.

Надёжность или навороты?

Определились с выбором? Тогда поехали…


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

Автоочистка директории /tmp

$ yum install -y tmpwatch

Автообновление Yum

$ yum install -y yum-cron

$ nano /etc/sysconfig/yum-cron
1
2
YUM_PARAMETER="-x kernel* -x php*"
MAILTO=admin@site.com
$ service yum-cron start
$ chkconfig yum-cron on
$ yum update -y

Добавление репозиториев

$ yum install epel-release

Добавление базовых программ

$ yum install -y htop wget zip unzip mlocate mc

Отключение SELinux и Синхронизация времени

$ sestatus -v
$ nano /etc/sysconfig/selinux
1
SELINUX=disabled
$ ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

$ yum install -y ntpdate ntp
$ ntpdate pool.ntp.org

$ hwclock --systohc --utc
$ nano /etc/sysconfig/clock
1
2
3
ZONE="Europe/Moscow"
UTC=true
ARC=false
$ chkconfig ntpd on && service ntpd start
$ ntpq -p

$ # Перезагружать только если "selinux" был включен
$ reboot
$ sestatus -v

$ date
$ date --utc
$ hwclock --show
$ hwclock --show --utc
$ hwclock --show --localtime

$ unset HISTFILE    history -c
$ exit

Установка NGINX

Если Вы определились, что для Ваших целей будет вполне достаточно бесплатной версии, тогда следуем этому руководству.
Если всё же требуются расширенные возможности, пропускаем установку NGINX и переходим сразу к установке Tengine.

Есть 2 варианта установки:

  1. Стандартная установка из репозитория.
  2. Ручная сборка из исходников с поддержкой ALPN (HTTP2) и PageSpeed (рекомендуется).

Добавляем NGINX репозиторий

$ nano /etc/yum.repos.d/nginx.repo
1
2
3
4
5
[nginx]
name=NGINX repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
$ yum repolist
$ yum install nginx nginx-module-geoip

Список пакетов модулей на данный момент следующий:

  • nginx-module-geoip
  • nginx-module-image-filter
  • nginx-module-njs
  • nginx-module-perl
  • nginx-module-xslt

Установка с ALPN и ngx_pagespeed (рекомендуется)

$ cd /tmp
$ wget https://raw.githubusercontent.com/ivan-nginx/scripts/master/install-nginx-http2.sh
$ nano install-nginx-http2.sh
1
2
3
NGINX_VERSION=1.12.0
OPENSSL_VERSION=1.0.2l
NPS_VERSION=1.11.33.2
$ sh ./install-nginx-http2.sh
$ yum install nginx-module-geoip

Подгружаем модуль GeoIP динамически

$ nano /etc/nginx/nginx.conf

В блок main перед секцией events вписываем:

1
2
load_module modules/ngx_http_geoip_module.so;
#load_module modules/ngx_stream_geoip_module.so;

$ service nginx start
$ chkconfig nginx on

Установка Tengine

$ cd /tmp
$ wget https://raw.githubusercontent.com/ivan-nginx/scripts/master/centos-tengine/install-tengine.sh
$ sh ./install-tengine.sh

Если SELinux был включен, будет произведена автоматическая перезагрузка сервера (reboot). Если так, после перезагрузки переходим в директорию /tmp и снова запускаем скрипт.

При установке нужно будет ввести IP. Для единого сервера оставляем поле пустым и просто жмём Enter. Если же требуется проксировать на сторонний сервер, тогда указываем IP нужного сервера.
Скрипт установит все необходимые зависимости и скомпилирует исполняемый файл с указанными модулями, что займёт достаточно длительное время. Самое время поставить чайник. coffee

По окончанию установки, скрипт добавит nginx в автозагрузку и следом запустит его.

Смотрим список модулей Tengine

$ nginx -V

Возможные ошибки

На 64-ёх разрядных версиях CentOS при запуске сервиса может произойти такая ошибка:

Starting nginx: /usr/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

Проблема решается следующим образом:

$ cp /usr/local/lib/libpcre.so.1 /lib64/libpcre.so.1
$ updatedb
$ locate libpcre.so

Starting nginx: nginx: [emerg] getpwnam(“nginx”) failed

Ошибка означает, что в системе нет пользователя nginx. Можно либо создать пользователя, либо раскомментировать директиву user nobody; в самом начале главного конфига nginx’а:

$ nano /etc/nginx/nginx.conf
1
user  nobody;

Автообновление GeoIP

$ echo -e "CN 1;\nHK 1;" > /etc/nginx/bad_countries
$ mkdir -p /usr/share/GeoIP/
$ crontab <(crontab -l; echo "35 5 * * 0 cd /usr/share/GeoIP/ && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz && gunzip -f GeoIP.dat.gz && wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz && gunzip -f GeoLiteCity.dat.gz")
$ service crond restart

Коды стран расположены здесь: dev.maxmind.com/geoip/legacy/codes/iso3166


Вот таким вот нехитрым способом мы получаем, по-сути, платную версию Nginx — бесплатно. А ведь достаточно было лишь немного поискать и найти, чем довольствоваться малым и слепо следовать туда, куда все. wink

Но почему неймется мне?
Нахальный я!
Условья, в общем, в колее
Нормальные.
Никто не стукнет, не притрет -
Не жалуйся.
Захочешь двигаться вперед?
Пожалуйста.

Отказа нет в еде-питье
В уютной этой колее,

И я живо себя убедил -
Не один я в нее угодил.
Так держать! Колесо в колесе!
И доеду туда, куда все.

Прошиб меня холодный пот
До косточки,
И я прошелся чуть вперед
По досточке.
Гляжу - размыли край ручьи
Весенние,
Там выезд есть из колеи -
Спасение!

Я грязью из-под шин плюю
В чужую эту колею.

Эй, вы, задние! Делай, как я.
Это значит - не надо за мной.
Колея эта - только моя!
Выбирайтесь своей колеей.

Владимир Высоцкий — Чужая колея, 1973