SCROLL
Среднее время на прочтение: 8 мин.

Установка Nginx из исходников на Debian 12

Nginx — это программное обеспечение с открытым исходным кодом для создания веб-серверов.

В этом руководстве я покажу, как установить веб-сервер Nginx на операционной системе Debian 12. Установку будем выполнять из исходников, используя актуальную на момент написания статьи версию Nginx.

Официальная ветка Nginx— https://github.com/nginx/nginx

Установка зависимостей

Устанавливаем необходимые пакеты зависимостей.

apt-get install gcc make libpcre3-dev zlib1g-dev libssl-dev curl git -y

Сборка и установка

Актуальную версию пакета можно посмотреть по ссылке:
  • https://github.com/nginx/nginx/releases
  • Клонируем репозиторий Nginx:

    cd /opt
    git clone https://github.com/nginx/nginx.git nginx

    Переходим в клонированный репозиторий:

    cd nginx/

    Переключаемся на актуальную версию релиза, выполняем команду:

    LATEST_TAG=$(curl -s https://api.github.com/repos/nginx/nginx/releases/latest | grep -oP '"tag_name": "\K[^"]+')
    git checkout $LATEST_TAG

    Сборка

    Выполняем конфигурирование nginx с минимальным необходимых модулей:

    auto/configure \
    --prefix=/usr \
    --conf-path=/etc/nginx/nginx.conf \
    --http-log-path=/var/log/nginx/access.log \
    --error-log-path=/var/log/nginx/error.log \
    --lock-path=/var/lock/nginx.lock \
    --pid-path=/run/nginx.pid \
    --modules-path=/usr/lib/nginx/modules \
    --user=www-data \
    --group=www-data \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module

    Собираем и устанавливаем:

    make -j$(nproc)
    make install

     Post-Install настройка

    Создаем необходимые каталоги для работы nginx и назначаем для них соответствующие права доступа:

    mkdir -p /etc/nginx/sites-available
    mkdir -p /etc/nginx/sites-enabled
    mkdir -p /etc/nginx/modules-available
    mkdir -p /etc/nginx/modules-enabled
    mkdir -p /etc/nginx/conf.d
    mkdir -p /var/lib/nginx/{body,fastcgi,proxy,scgi,uwsgi}
    mkdir -p /var/log/nginx
    mkdir -p /var/www/html
    
    chown www-data:root /var/lib/nginx/{body,fastcgi,proxy,scgi,uwsgi}
    chown www-data:www-data /var/log/nginx
    
    chmod 700 /var/lib/nginx/{body,fastcgi,proxy,scgi,uwsgi}

    Основная конфигурация Nginx

    Сперва удалим стандартный файл конфигурации /etc/nginx/nginx.conf:

    rm /etc/nginx/nginx.conf

    Затем создаем новый файл /etc/nginx/nginx.conf с базовыми настройками для работы веб-сервера:

    /etc/nginx/nginx.conf
    user www-data;
    worker_processes auto;
    
    pid /run/nginx.pid;
    
    error_log /var/log/nginx/error.log;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
            worker_connections 1024;
            # multi_accept on;
    }
    
    http {
            ##
            # Basic Settings
            ##
    
            sendfile on;
            tcp_nopush on;
            types_hash_max_size 2048;
            server_tokens off;
    
            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;
    
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            ##
            # SSL Settings
            ##
    
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
            ssl_prefer_server_ciphers on;
    
            ##
            # Logging Settings
            ##
    
            access_log /var/log/nginx/access.log;
    
            ##
            # Gzip Settings
            ##
    
            gzip on;
    
            # gzip_vary on;
            # gzip_proxied any;
            # gzip_comp_level 6;
            # gzip_buffers 16 8k;
            # gzip_http_version 1.1;
            # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
            ##
            # Virtual Host Configs
            ##
    
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    }

    Настройка сайта по умолчанию

    Создаем файл /etc/nginx/sites-available/default базовой конфигурации сайта по умолчанию:

    /etc/nginx/sites-available/default
    # Default server configuration
    server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
            server_name _;
    
            root /var/www/html;
            index index.html index.htm;
    
            location / {
                    try_files $uri $uri/ =404;
            }
    }

    Активируем её и копируем стартовую веб-страницу Nginx в каталог обслуживания веб-контента:

    ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
    cp /opt/nginx/docs/html/index.html /var/www/html/index.html

    Systemd

    Для управление запуском nginx создадим службу для Systemd:

    cat << EOF > /lib/systemd/system/nginx.service
    [Unit]
    Description=A high performance web server and a reverse proxy server
    Documentation=man:nginx(8)
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    
    [Service]
    Type=forking
    PIDFile=/run/nginx.pid
    ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
    ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
    ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
    ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
    TimeoutStopSec=5
    KillMode=mixed
    
    [Install]
    WantedBy=multi-user.target
    EOF

    Обновляем конфигурацию systemd, добавляем в автозапуск, запускаем службу и проверяем ее работу:

    systemctl daemon-reload
    
    systemctl enable nginx
    systemctl start nginx
    systemctl status nginx

    System V Init

    Так же создадим скрипт управления запуском nginx для System V Init:

    cat << EOF > /etc/init.d/nginx
    #!/bin/sh
    
    ### BEGIN INIT INFO
    # Provides:       nginx
    # Required-Start:    $local_fs $remote_fs $network $syslog $named
    # Required-Stop:     $local_fs $remote_fs $network $syslog $named
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts the nginx web server
    # Description:       starts nginx using start-stop-daemon
    ### END INIT INFO
    
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    DAEMON=/usr/sbin/nginx
    NAME=nginx
    DESC=nginx
    
    # Include nginx defaults if available
    if [ -r /etc/default/nginx ]; then
            . /etc/default/nginx
    fi
    
    STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"
    
    test -x $DAEMON || exit 0
    
    . /lib/init/vars.sh
    . /lib/lsb/init-functions
    
    # Try to extract nginx pidfile
    PID=$(cat /etc/nginx/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
    if [ -z "$PID" ]; then
            PID=/run/nginx.pid
    fi
    
    if [ -n "$ULIMIT" ]; then
            # Set ulimit if it is set in /etc/default/nginx
            ulimit $ULIMIT
    fi
    
    start_nginx() {
            # Start the daemon/service
            #
            # Returns:
            #   0 if daemon has been started
            #   1 if daemon was already running
            #   2 if daemon could not be started
            start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
                    || return 1
            start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
                    $DAEMON_OPTS 2>/dev/null \
                    || return 2
    }
    
    test_config() {
            # Test the nginx configuration
            $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
    }
    
    stop_nginx() {
            # Stops the daemon/service
            #
            # 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 --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
            RETVAL="$?"
            sleep 1
            return "$RETVAL"
    }
    
    reload_nginx() {
            # Function that sends a SIGHUP to the daemon/service
            start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME
            return 0
    }
    
    rotate_logs() {
            # Rotate log files
            start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME
            return 0
    }
    
    upgrade_nginx() {
            # Online upgrade nginx executable
            # http://nginx.org/en/docs/control.html
            #
            # Return
            #   0 if nginx has been successfully upgraded
            #   1 if nginx is not running
            #   2 if the pid files were not created on time
            #   3 if the old master could not be killed
            if start-stop-daemon --stop --signal USR2 --quiet --pidfile $PID --name $NAME; then
                    # Wait for both old and new master to write their pid file
                    while [ ! -s "${PID}.oldbin" ] || [ ! -s "${PID}" ]; do
                            cnt=`expr $cnt + 1`
                            if [ $cnt -gt 10 ]; then
                                    return 2
                            fi
                            sleep 1
                    done
                    # Everything is ready, gracefully stop the old master
                    if start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PID}.oldbin" --name $NAME; then
                            return 0
                    else
                            return 3
                    fi
            else
                    return 1
            fi
    }
    
    case "$1" in
            start)
                    log_daemon_msg "Starting $DESC" "$NAME"
                    start_nginx
                    case "$?" in
                            0|1) log_end_msg 0 ;;
                            2)   log_end_msg 1 ;;
                    esac
                    ;;
            stop)
                    log_daemon_msg "Stopping $DESC" "$NAME"
                    stop_nginx
                    case "$?" in
                            0|1) log_end_msg 0 ;;
                            2)   log_end_msg 1 ;;
                    esac
                    ;;
            restart)
                    log_daemon_msg "Restarting $DESC" "$NAME"
    
                    # Check configuration before stopping nginx
                    if ! test_config; then
                            log_end_msg 1 # Configuration error
                            exit $?
                    fi
    
                    stop_nginx
                    case "$?" in
                            0|1)
                                    start_nginx
                                    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
                    ;;
            reload|force-reload)
                    log_daemon_msg "Reloading $DESC configuration" "$NAME"
    
                    # Check configuration before stopping nginx
                    #
                    # This is not entirely correct since the on-disk nginx binary
                    # may differ from the in-memory one, but that's not common.
                    # We prefer to check the configuration and return an error
                    # to the administrator.
                    if ! test_config; then
                            log_end_msg 1 # Configuration error
                            exit $?
                    fi
    
                    reload_nginx
                    log_end_msg $?
                    ;;
            configtest|testconfig)
                    log_daemon_msg "Testing $DESC configuration"
                    test_config
                    log_end_msg $?
                    ;;
            status)
                    status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
                    ;;
            upgrade)
                    log_daemon_msg "Upgrading binary" "$NAME"
                    upgrade_nginx
                    log_end_msg $?
                    ;;
            rotate)
                    log_daemon_msg "Re-opening $DESC log files" "$NAME"
                    rotate_logs
                    log_end_msg $?
                    ;;
            *)
                    echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2
                    exit 3
                    ;;
    esac
    EOF

    Делаем созданный скрипт исполняемый:

    chmod +x /etc/init.d/nginx

    Заключение

    По итогу мы получим рабочий экземпляр веб-сервера на базе Nginx со следующими модулями:

    root:/opt/nginx# 2>&1 nginx -V | tr -- - '\n' | grep _module
    http_ssl_module
    http_v2_module
    http_realip_module
    http_stub_status_module
    http_gunzip_module
    http_gzip_static_module

    И если перейти в браузере по адресу веб-сервера, то нас будет встречать приветственная страница по умолчанию Nginx.

     

    ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

    Обсуждение

    0 комментариев

    Нет комментариев.