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
Сборка и установка
Актуальную версию пакета можно посмотреть по ссылке:
Клонируем репозиторий Nginx:
cd /optgit 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 serverDocumentation=man:nginx(8)After=network-online.target remote-fs.target nss-lookup.targetWants=network-online.target[Service]Type=forkingPIDFile=/run/nginx.pidExecStartPre=/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 reloadExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pidTimeoutStopSec=5KillMode=mixed[Install]WantedBy=multi-user.targetEOF
Обновляем конфигурацию 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 INFOPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binDAEMON=/usr/sbin/nginxNAME=nginxDESC=nginx# Include nginx defaults if availableif [ -r /etc/default/nginx ]; then . /etc/default/nginxfiSTOP_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 pidfilePID=$(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.pidfiif [ -n "$ULIMIT" ]; then # Set ulimit if it is set in /etc/default/nginx ulimit $ULIMITfistart_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 ;;esacEOF
Делаем созданный скрипт исполняемый:
chmod +x /etc/init.d/nginx
Заключение
По итогу мы получим рабочий экземпляр веб-сервера на базе Nginx со следующими модулями:
root:/opt/nginx# 2>&1 nginx -V | tr — — ‘n’ | grep _modulehttp_ssl_modulehttp_v2_modulehttp_realip_modulehttp_stub_status_modulehttp_gunzip_modulehttp_gzip_static_module
И если перейти в браузере по адресу веб-сервера, то нас будет встречать приветственная страница по умолчанию Nginx.
