Установка Nginx из исходников, компиляция с дополнительными модулями
Нередко возникает ситуация когда на VPS с установленным Debian нужно установит nginx со сторонними модулями. Разумеется простой командой не обойтись и нужно все собирать из исходников.
Шаг 1. Обновляем репозиторий и устанавливаем требуемые библиотеки
apt-get update
Устанавливает пакеты, необходимые для сборки nginx из исходников
apt-get install build-essential libpcre3 libpcre3-dev libcurl4-openssl-dev gcc libpcrecpp0 libssl-dev zlib1g-dev
Шаг 2. Скачиваем исходник Nginx и требуемые модули
создаем папку для исходников
mkdir ~/src
перейдем в нее
cd ~/src
скачиваем модуль nginx-sla
git clone git://github.com/abbat/nginx-sla.git ~/src/nginx-sla
Качаем последнюю стабильную ветку на текущий момент:
wget http://nginx.org/download/nginx-1.8.1.tar.gz
и распаковываем его
tar -zxvf nginx-1.8.1.tar.gz
Заходим в каталог
cd ./nginx-1.8.1
Шаг 3. Собираем nginx из исходников
Создаем в ней файл conf.sh со следующим содержимым:
mcedit ./conf.sh
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin \
--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.pid \
--lock-path=/var/lock/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--with-http_realip_module \
--with-http_mp4_module \
--with-http_flv_module \
--with-http_dav_module \
--with-http_secure_link_module \
--with-http_ssl_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_stub_status_module \
--with-http_random_index_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_spdy_module \
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-z,relro -Wl,--as-needed' \
--with-ipv6 \
--add-module=/root/src/nginx-sla
Это наш конфиг для сборки, тут указаны какие модули подключать и с какими параметрами будет работать nginx. Наш сторонний модуль подключается командой:
--add-module=/root/src/nginx-sla
Устанавливаем права на созданный conf.sh файл:
chmod +rwx conf.sh
И запускаем его:
./conf.sh
Шаг 4. Добавляем Nginx в автозагрузку
создадим стартовый скрипт
mcedit /etc/init.d/nginx
#!/bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $network $remote_fs $local_fs. # Required-Stop: $network $remote_fs $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Stop/start nginx ### END INIT INFO # Author: Sergey BudnevitchPATH=/sbin:/usr/sbin:/bin:/usr/bin DESC=nginx NAME=nginx CONFFILE=/etc/nginx/nginx.conf DAEMON=/usr/sbin/nginx PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME SLEEPSEC=1 UPGRADEWAITLOOPS=5 [ -x $DAEMON ] || exit 0 [ -r /etc/default/$NAME ] && . /etc/default/$NAME DAEMON_ARGS="-c $CONFFILE $DAEMON_ARGS" . /lib/init/vars.sh . /lib/lsb/init-functions do_start() { start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS RETVAL="$?" return "$RETVAL" } do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --oknodo --retry=TERM/30/KILL/5 --pidfile $PIDFILE RETVAL="$?" rm -f $PIDFILE return "$RETVAL" } do_reload() { # start-stop-daemon --stop --signal HUP --quiet --pidfile $PIDFILE RETVAL="$?" return "$RETVAL" } do_configtest() { if [ "$#" -ne 0 ]; then case "$1" in -q) FLAG=$1 ;; *) ;; esac shift fi $DAEMON -t $FLAG -c $CONFFILE RETVAL="$?" return $RETVAL } do_upgrade() { OLDBINPIDFILE=$PIDFILE.oldbin do_configtest -q || return 6 start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE RETVAL="$?" for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do sleep $SLEEPSEC if [ -f $OLDBINPIDFILE -a -f $PIDFILE ]; then start-stop-daemon --stop --signal QUIT --quiet --pidfile $OLDBINPIDFILE RETVAL="$?" return fi done echo $"Upgrade failed!" RETVAL=1 return $RETVAL } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $? ;; configtest) do_configtest ;; upgrade) do_upgrade ;; reload|force-reload) log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;; do_upgrade() { OLDBINPIDFILE=$PIDFILE.oldbin do_configtest -q || return 6 start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE RETVAL="$?" for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do sleep $SLEEPSEC if [ -f $OLDBINPIDFILE -a -f $PIDFILE ]; then start-stop-daemon --stop --signal QUIT --quiet --pidfile $OLDBINPIDFILE RETVAL="$?" return fi done echo $"Upgrade failed!" RETVAL=1 return $RETVAL } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $? ;; configtest) do_configtest ;; upgrade) do_upgrade ;; reload|force-reload) log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" do_configtest -q || exit $RETVAL do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload|upgrade|configtest}" >&2 exit 3 ;; esac exit $RETVAL
делаем исполняемым, добавляем в автозагрузку
chmod +x /etc/init.d/nginx
update-rc.d -f nginx defaults
Шаг 5. Конфигурируем Nginx
Внесем изменения в конфигурационный файл nginx.conf
mcedit /etc/nginx/nginx.conf
http { sla_pool adminunix timings=100:200:300:500:1000:2000 http=200:404 default; server { listen [::1]:80; location / { sla_pass main; ... } location /sla_status { sla_status; sla_pass off; allow ::1; deny all; } location /sla_purge { sla_purge; sla_pass off; allow ::1; deny all; } }
Проверяем конфиг
nginx -t
и если ошибок нет перечитываем и применяем текущую конфигурацию.
nginx -s reload
Для проверки запустим
curl 127.0.0.1/sla_status
в ответ получим
adminunix.all.http = 1895 adminunix.all.http_200 = 1892 adminunix.all.http_404 = 3 adminunix.all.http_xxx = 1900 adminunix.all.http_1xx = 0 adminunix.all.http_2xx = 1892 adminunix.all.http_3xx = 4 adminunix.all.http_4xx = 4 adminunix.all.http_5xx = 0 adminunix.all.time.avg = 361 adminunix.all.time.avg.mov = 361 adminunix.all.100 = 1 adminunix.all.100.agg = 1 adminunix.all.200 = 60 adminunix.all.200.agg = 61 adminunix.all.300 = 24 adminunix.all.300.agg = 85 adminunix.all.500 = 12 adminunix.all.500.agg = 97 adminunix.all.1000 = 2 adminunix.all.1000.agg = 99 adminunix.all.2000 = 0 adminunix.all.2000.agg = 99 adminunix.all.inf = 1 adminunix.all.inf.agg = 100 adminunix.all.25% = 100 adminunix.all.50% = 100 adminunix.all.75% = 200 adminunix.all.90% = 300 adminunix.all.95% = 400 adminunix.all.98% = 500 adminunix.all.99% = 20400 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http = 1253 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_200 = 1253 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_404 = 0 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_xxx = 1256 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_1xx = 0 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_2xx = 1253 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_3xx = 3 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_4xx = 0 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.http_5xx = 0 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.time.avg = 361 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.time.avg.mov = 361 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.100 = 1 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.100.agg = 1 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.200 = 60 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.200.agg = 61 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.300 = 24 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.300.agg = 85 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.500 = 12 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.500.agg = 97 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.1000 = 2 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.1000.agg = 99 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.2000 = 0 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.2000.agg = 99 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.inf = 1 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.inf.agg = 100 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.25% = 100 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.50% = 100 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.75% = 200 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.90% = 300 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.95% = 400 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.98% = 500 adminunix.unix:/var/run/php5-vs.adminunix.ru.sock.99% = 20400
Здесь первое значение является именем пула статистики;
Второе значение является именем апстрима или all для всех апстримов пула (включая локальную статику);
Третье значение — имя ключа статистики:
- http — количество обработанных ответов с известными HTTP статусами;
- http_200 — количество ответов с HTTP-статусом 200 (может быть http_301, http_404, http_500 и т.д.);
- http_xxx — количество обработанных ответов в группах статусов HTTP (фактически, количество всех обработанных ответов);
- http_2xx — количество ответов в группе с HTTP-статусом 2xx (всего 5 групп соответствующих 1xx, 2xx ... 5xx);
- time — характеристика времени ответов;
- 500 — количество ответов апстримов в интервале времени 300-500 ms;
- 90% — время ответа в ms для 90% запросов (процентиль, может принимать значения 25%, 50%, 75%, 90%, 95%, 98%, 99%);
- inf — алиас для «бесконечного» интервала времени;
- avg — среднее;
- mov — скользящее (среднее);
- agg — аггрегированная статистика по всем интервалам до текущего. Так, например, в 500.agg попадают все запросы, которые выполнились от 0 и до 500 ms;