Установка 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 Budnevitch 

PATH=/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;

Понравилась статья, расскажи о ней друзьям, нажми кнопку!