Перейти к содержанию

Системное Администрирование

обсуждение CI/CD, автоматизации, облаков (AWS, Azure), Docker, Kubernetes, мониторинга и IaC. Обмен опытом, решение задач, лучшие практики. Советы по инструментам (Ansible, Terraform), кейсы, оптимизация workflows

15 Темы 50 Сообщения

Подкатегории


  • 5 Темы
    12 Сообщения
    MugiwaraM
    Linux и Unix имеют философию “всё есть файл” и “делай одно, но делай хорошо”. Команды — это ваш инструмент для управления системой через терминал. В этом гайде разберём самые полезные команды, которые встречаются в 90% работы. 1. Навигация по файловой системе pwd (Print Working Directory) Что это: выводит полный путь текущей директории Зачем нужно: понять, где вы находитесь в файловой системе pwd /home/user/Documents Вы в папке Documents, которая находится в /home/user. ls (List) Что это: выводит список файлов и папок в текущей директории Зачем нужно: видеть содержимое папки Базовое использование: ls Desktop Documents Downloads Pictures Полезные флаги: # -l показывает подробную информацию (права доступа, размер, дату) ls -l drwxr-xr-x 5 user user 4096 Jan 9 10:30 Desktop -rw-r--r-- 1 user user 2048 Jan 8 15:42 document.txt # -a показывает скрытые файлы (начинаются с точки) ls -a . .. .config .ssh Desktop document.txt # -h показывает размеры в понятном формате (MB, GB) ls -lh -rw-r--r-- 1 user user 2.5M Jan 8 15:42 video.mp4 # Комбинирование флагов ls -lah Как это работает: ls читает содержимое директории из файловой системы и выводит список. Флаги изменяют формат вывода. cd (Change Directory) Что это: меняет текущую директорию (переходит в другую папку) Зачем нужно: перемещаться по файловой системе # Переход в конкретную папку cd /home/user/Documents # Переход в домашнюю папку пользователя cd ~ # или просто cd # Переход на уровень выше cd .. # Переход в предыдущую директорию cd - # Переход в корневую директорию cd / Как это работает: shell (интерпретатор команд) изменяет текущее рабочее пространство на указанную директорию. Все последующие команды будут работать относительно этой папки. 2. Работа с файлами и папками mkdir (Make Directory) Что это: создаёт новую папку Зачем нужно: организовать файлы по папкам # Создание одной папки mkdir myproject # Создание вложенной структуры (флаг -p) mkdir -p /home/user/projects/myapp/src/components Как это работает: mkdir вызывает системный вызов для создания директории в файловой системе. touch Что это: создаёт пустой файл или обновляет время модификации существующего Зачем нужно: быстро создать файл или обновить его “дату последнего изменения” # Создание пустого файла touch index.html # Создание нескольких файлов сразу touch file1.txt file2.txt file3.txt # Обновление времени модификации (полезно для вспомогательных действий) touch existing_file.txt cp (Copy) Что это: копирует файлы или папки Зачем нужно: создать копию файла или резервную копию # Копирование файла cp document.txt document_backup.txt # Копирование файла в другую папку cp document.txt /home/user/backup/ # Копирование папки со всем содержимым (флаг -r) cp -r myproject myproject_backup # Копирование с информацией о прогрессе (флаг -v) cp -v large_file.iso /backup/ 'large_file.iso' -> '/backup/large_file.iso' Как это работает: cp читает содержимое файла-источника и записывает его в новый файл-назначение. mv (Move) Что это: перемещает или переименовывает файлы и папки Зачем нужно: перенести файл в другую папку или переименовать его # Переименование файла mv old_name.txt new_name.txt # Перемещение файла в другую папку mv document.txt /home/user/Documents/ # Перемещение и переименование одновременно mv /home/user/Downloads/file.pdf /home/user/Documents/important_file.pdf # Перемещение папки mv old_project_folder new_project_folder Как это работает: mv изменяет указатель на файл в файловой системе, поэтому это очень быстро даже для больших файлов. rm (Remove) Что это: удаляет файлы или папки Зачем нужно: удалить ненужные файлы # Удаление файла rm temporary_file.txt # Удаление папки со всем содержимым (флаг -r) rm -r old_project/ # Удаление с подтверждением перед каждым файлом (флаг -i) rm -i *.log remove file1.log? y remove file2.log? n # Принудительное удаление без подтверждения (флаг -f) rm -f file.txt # Комбинирование флагов rm -rf /path/to/folder ️ Важно: Linux не имеет “корзины” — удаленные файлы очень сложно восстановить. Будьте осторожны с rm -rf. Как это работает: rm удаляет запись о файле из директории и помечает место на диске как свободное. Данные еще какое-то время остаются на диске, но получить к ним доступ становится очень сложно. 3. Просмотр содержимого файлов cat (Concatenate) Что это: выводит полное содержимое файла Зачем нужно: быстро посмотреть содержимое небольших текстовых файлов # Просмотр содержимого файла cat config.txt server=localhost port=5432 database=mydb # Просмотр нескольких файлов (выведет один за другим) cat file1.txt file2.txt # Нумерация строк (флаг -n) cat -n script.sh 1 #!/bin/bash 2 echo "Hello" 3 date # Показание символов конца строк (полезно для отладки) cat -A file.txt hello$ world $ Как это работает: cat читает содержимое файла и выводит его в стандартный вывод (stdout). less и more Что это: просматривает файл по страницам (постраничный просмотр) Зачем нужно: смотреть большие файлы без перегрузки экрана # Постраничный просмотр большого файла less large_log_file.txt # После запуска less используйте: # Space или Page Down - следующая страница # b или Page Up - предыдущая страница # g - в начало файла # G - в конец файла # /search_term - поиск текста # q - выход Как это работает: less подгружает файл по частям, позволяя экономно использовать память и быстро навигировать по большим файлам. head и tail Что это: выводит начало (head) или конец (tail) файла Зачем нужно: посмотреть первые/последние строки логов или файлов # Вывод первых 10 строк (по умолчанию) head log.txt 2026-01-09 10:15:23 INFO Starting application 2026-01-09 10:15:25 INFO Database connected ... # Вывод первых 20 строк head -20 log.txt # Вывод последних 10 строк tail log.txt # Вывод последних 50 строк tail -50 log.txt # Отслеживание нового содержимого в реальном времени (очень полезно для логов) tail -f /var/log/syslog 2026-01-09 10:35:12 kernel: [12345.123456] CPU0: Package temperature/speed normal 2026-01-09 10:35:15 kernel: [12348.456789] systemd[1]: Started session... # Будет обновляться по мере появления новых строк Как это работает: head читает файл с начала и выводит N строк, tail ищет конец файла и выводит N последних строк. Флаг -f создаёт постоянный поток данных. 4. Поиск и фильтрация find Что это: ищет файлы и папки по различным критериям Зачем нужно: быстро найти нужный файл в большой структуре папок # Поиск файла по имени в текущей директории и подпапках find . -name "document.txt" ./Documents/document.txt # Поиск всех файлов с расширением .log find . -name "*.log" # Поиск в конкретной директории find /var/log -name "*.log" # Поиск файлов больше определённого размера (здесь более 100 MB) find . -size +100M # Поиск файлов, изменённых в течение последних 7 дней find . -mtime -7 # Поиск папок (тип -type d) find . -type d -name "node_modules" # Поиск файлов (тип -type f) find . -type f -name "*.js" # Комбинирование условий find /home/user/projects -type f -name "*.js" -size +1M # Выполнение команды для каждого найденного файла find . -name "*.txt" -exec rm {} \; # Здесь {} заменяется на имя файла, ; закрывает команду Как это работает: find рекурсивно проходит по директориям, проверяя каждый файл по заданным условиям. grep Что это: ищет текст внутри файлов по шаблону Зачем нужно: найти строку в файле или отфильтровать вывод других команд # Поиск в одном файле grep "error" log.txt 2026-01-09 10:15:23 ERROR Connection failed 2026-01-09 10:16:45 ERROR Timeout # Поиск во всех файлах папки (флаг -r рекурсивный) grep -r "TODO" /home/user/project project/app.js:// TODO: refactor this function project/utils.js:// TODO: add error handling # Поиск с игнорированием регистра (флаг -i) grep -i "ERROR" log.txt # найдёт error, Error, ERROR и т.д. # Показание номеров строк (флаг -n) grep -n "config" config.js 5:const config = require('./config.json'); 12:const dbConfig = config.database; # Инверсия поиска - строки, НЕ содержащие шаблон (флаг -v) grep -v "^#" config.txt # выведет все строки, кроме комментариев (начинающихся с #) # Подсчёт количества совпадений (флаг -c) grep -c "error" log.txt 47 # Использование регулярных выражений (флаг -E) grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}" log.txt # найдёт строки, начинающиеся с даты в формате YYYY-MM-DD # Комбинирование с другими командами через pipe (|) cat log.txt | grep "error" | wc -l # подсчитает количество строк с "error" Как это работает: grep читает файл строку за строкой и проверяет каждую строку по заданному шаблону. 5. Работа с процессами и системой ps (Process Status) Что это: показывает запущенные процессы Зачем нужно: увидеть, какие программы работают в системе # Просмотр процессов текущего пользователя ps PID TTY STAT TIME COMMAND 1234 pts/0 Ss 0:00 bash 1456 pts/0 R+ 0:00 ps # PID - идентификатор процесса # TTY - терминал, в котором запущен процесс # STAT - статус процесса (S = sleeping, R = running) # COMMAND - команда, запустившая процесс # Полный список всех процессов в системе ps aux # aux означает: # a - все процессы для всех пользователей # u - подробный формат # x - включить процессы без контролирующего терминала # Примеры вывода: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.4 103008 6720 ? Ss 10:00 0:02 /sbin/init user 1234 0.0 1.2 4523456 45320 ? S 10:15 0:05 node app.js Как это работает: ps читает информацию о процессах из файловой системы Linux (/proc) и выводит её в форматированном виде. top Что это: интерактивный монитор процессов в реальном времени Зачем нужно: видеть, какие процессы потребляют больше всего ресурсов (CPU, памяти) # Запуск top top # Вывод будет выглядеть так: top - 10:36:45 up 5 days, 2:15, 1 user, load average: 0.45, 0.52, 0.48 Tasks: 156 total, 2 running, 154 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.3 us, 1.1 sy, 0.0 ni, 96.2 id, 0.1 wa, 0.2 hi, 0.1 si MiB Mem : 16384.0 total, 12456.3 free, 2048.5 used, 1879.2 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 13985.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2345 user 20 0 1234567 456789 98765 S 8.3 2.8 2:15.47 firefox 1890 root 20 0 345678 123456 67890 S 3.1 0.8 1:05.32 systemd-journal Ключевые навыки использования top: q - выход из top k - убить процесс (введите PID) Shift+M - сортировка по памяти Shift+P - сортировка по CPU (по умолчанию) kill Что это: останавливает (завершает) процесс по его PID Зачем нужно: закрыть зависший процесс или остановить ненужную программу # Нормальное завершение процесса (дает процессу время на очистку) kill 2345 # Принудительное завершение (жёсткий kill) kill -9 2345 # 9 - это сигнал SIGKILL, он не может быть проигнорирован # Другие полезные сигналы: kill -15 2345 # SIGTERM - вежливый запрос на завершение (по умолчанию) kill -19 2345 # SIGSTOP - приостановка процесса kill -18 2345 # SIGCONT - продолжение приостановленного процесса # Поиск PID и kill в одной команде pkill firefox # убьёт все процессы с именем firefox Как это работает: kill отправляет сигнал операционной системы процессу. Процесс может обработать этот сигнал по-своему. 6. Работа с правами доступа chmod (Change Mode) Что это: меняет права доступа к файлам и папкам Зачем нужно: контролировать, кто может читать, писать и выполнять файлы # Права доступа в Linux состоят из трёх групп: # rwx rwx rwx # | | └─ права для остальных (other) # | └───── права для группы (group) # └───────── права для владельца (user/owner) # r (read) - чтение (4) # w (write) - запись (2) # x (execute) - выполнение (1) # Пример прав: drwxr-xr-x # d - это директория # rwx - владелец может читать, писать и выполнять # r-x - группа может читать и выполнять (но не писать) # r-x - остальные могут читать и выполнять (но не писать) # Численный способ (самый простой): chmod 755 script.sh # 7 = rwx для владельца (4+2+1) # 5 = r-x для группы (4+0+1) # 5 = r-x для остальных (4+0+1) # Символический способ: chmod u+x script.sh # добавить execute для владельца chmod g+w file.txt # добавить write для группы chmod o-r file.txt # убрать read для остальных chmod a+r file.txt # добавить read для всех (a = all) # Делает скрипт исполняемым chmod +x script.sh # Рекурсивное изменение прав для папки и содержимого chmod -R 755 /path/to/folder Как это работает: каждый файл в Linux содержит информацию о правах доступа. chmod изменяет эту информацию. chown (Change Owner) Что это: меняет владельца файла или папки Зачем нужно: изменить, кто является владельцем файла # Изменение владельца (требует прав администратора) sudo chown newuser file.txt # Изменение владельца и группы одновременно sudo chown newuser:newgroup file.txt # Рекурсивное изменение для папки и содержимого sudo chown -R newuser:newgroup /path/to/folder # Практический пример: файл создан от имени root, нужна смена на обычного пользователя sudo chown -R user:user /home/user/project 7. Управление пакетами и установка программ apt / apt-get (Debian/Ubuntu) Что это: менеджер пакетов для Debian-based систем (Ubuntu, Debian и т.д.) Зачем нужно: устанавливать, обновлять и удалять программы # Обновление списка доступных пакетов sudo apt update # Установка пакета sudo apt install nodejs # Установка нескольких пакетов одновременно sudo apt install git curl wget # Обновление установленных пакетов до последней версии sudo apt upgrade # Удаление пакета sudo apt remove nodejs # Удаление пакета и его конфигурационных файлов sudo apt purge nodejs # Поиск пакета apt search postgres postgresql - object-relational SQL database postgresql-client - front-end programs for PostgreSQL ... # Показание информации о пакете apt show nodejs Package: nodejs Version: 18.12.1-1nodesource1 Priority: optional Section: devel ... yum / dnf (RedHat/Fedora) Что это: менеджер пакетов для RedHat-based систем (Fedora, RHEL, CentOS) Зачем нужно: то же самое, что apt, но для другого семейства Linux # Обновление списка пакетов (обычно автоматически) sudo dnf check-update # Установка пакета sudo dnf install nodejs # Обновление пакетов sudo dnf upgrade # Удаление пакета sudo dnf remove nodejs # Поиск пакета sudo dnf search postgres 8. Работа с текстом и обработка данных wc (Word Count) Что это: считает строки, слова и символы в файле Зачем нужно: получить статистику по размеру файла # Подсчёт строк, слов и символов wc document.txt 42 156 1024 document.txt # 42 строки, 156 слов, 1024 символа # Только количество строк (флаг -l) wc -l log.txt 1523 log.txt # Только количество слов (флаг -w) wc -w document.txt 156 document.txt # Только количество символов (флаг -c) wc -c document.txt 1024 document.txt # Для нескольких файлов и итога wc -l *.log 100 file1.log 250 file2.log 180 file3.log 530 total sort и uniq Что это: sort сортирует строки, uniq удаляет дубликаты Зачем нужно: организовать или очистить данные # Сортировка содержимого файла sort data.txt # выведет строки в алфавитном порядке # Числовая сортировка (флаг -n) sort -n numbers.txt # отсортирует как числа, а не строки # "2" будет перед "10", а не после # Сортировка в обратном порядке (флаг -r) sort -r data.txt # Удаление дубликатов (при условии, что файл отсортирован) sort data.txt | uniq # Показание только дубликатов (флаг -d) sort data.txt | uniq -d # Показание количества повторений (флаг -c) sort data.txt | uniq -c 3 apple 1 banana 2 cherry cut Что это: извлекает колонки из текста Зачем нужно: получить определённые поля из структурированных данных # Извлечение 1-го и 3-го полей, разделённых табуляцией cut -f1,3 data.tsv # Извлечение первых 10 символов каждой строки (флаг -c) cut -c1-10 long_text.txt # Указание другого разделителя (флаг -d) cut -d',' -f1,2 data.csv # для CSV файлов, где разделитель - запятая 9. Перенаправление и pipes Это очень важно для работы в Linux. Pipes позволяют связывать команды вместе. Pipe (|) Что это: передаёт вывод одной команды на вход другой Зачем нужно: объединять простые команды в мощные цепочки # Вывести только строки с ошибками из большого лог-файла cat huge_log.txt | grep "ERROR" # Отсортировать ошибки cat huge_log.txt | grep "ERROR" | sort # Удалить дубликаты из отсортированного списка cat huge_log.txt | grep "ERROR" | sort | uniq # Подсчитать количество ошибок cat huge_log.txt | grep "ERROR" | wc -l 42 # Более сложный пример: найти 5 самых частых ошибок cat huge_log.txt | grep "ERROR" | cut -d' ' -f4 | sort | uniq -c | sort -rn | head -5 15 Connection 8 Timeout 7 Authentication 6 Database 4 Memory Перенаправление ввода-вывода (>, >>, <) Что это: перенаправляет вывод команды в файл или входные данные из файла Зачем нужно: сохранять результаты команд в файлы # Перенаправление вывода в файл (перезапишет файл) echo "Hello" > output.txt # содержимое output.txt: Hello # Добавление вывода в конец файла (не перезапишет) echo "World" >> output.txt # содержимое output.txt: Hello\nWorld # Перенаправление входа из файла cat < input.txt # Перенаправление ошибок в файл (2 это stderr) ls /nonexistent 2> errors.txt # нормальный вывод в консоль, ошибки в файл # Перенаправление и нормального вывода и ошибок в один файл ls /nonexistent > output.txt 2>&1 # Отправка вывода в никуда (полезно для скрытия сообщений) rm /tmp/* 2>/dev/null Как это работает: операционная система имеет три стандартных потока: stdin (0), stdout (1) и stderr (2). Перенаправление меняет, куда идёт данный поток. 10. Полезные утилиты echo Что это: выводит текст Зачем нужно: выводить сообщения, переменные, создавать содержимое файлов # Простой вывод echo "Hello, World!" Hello, World! # Вывод переменной echo $HOME /home/user # Вывод без переноса строки (флаг -n) echo -n "Enter name: " # Вывод с интерпретацией escape-последовательностей (флаг -e) echo -e "Line 1\nLine 2\tTabbed" Line 1 Line 2 Tabbed # Создание файла с содержимым echo "server=localhost" > config.txt man (Manual) Что это: показывает справку (man-страницы) по командам Зачем нужно: узнать подробности о команде, её флаги и примеры # Справка по команде man ls # откроется справка, используйте Space для навигации, q для выхода # Поиск команды по ключевому слову man -k "copy" # выведет все команды, связанные со словом "copy" # Примеры: man grep man chmod man find which и whereis Что это: найти, где находится исполняемый файл команды Зачем нужно: узнать полный путь к программе # Полный путь к исполняемому файлу which python3 /usr/bin/python3 # Более подробная информация (источник, man-страница, и т.д.) whereis python3 python3: /usr/bin/python3 /usr/share/man/man1/python3.1.gz date Что это: выводит текущую дату и время Зачем нужно: узнать текущее время или использовать в скриптах # Текущая дата и время date Fri Jan 9 10:36:45 MSK 2026 # Пользовательский формат date "+%Y-%m-%d %H:%M:%S" 2026-01-09 10:36:45 # Использование в скриптах для создания файлов с датой backup_file="backup_$(date +%Y%m%d_%H%M%S).tar.gz" echo $backup_file backup_2026010910364501_363645.tar.gz tar Что это: упаковывает и распаковывает архивы Зачем нужно: создавать резервные копии, передавать группы файлов # Создание архива (флаг c, v - вывод процесса, f - файл) tar -cvf archive.tar folder/ folder/ folder/file1.txt folder/file2.txt # Создание сжатого архива (.tar.gz через флаг z) tar -cvzf archive.tar.gz folder/ # Распаковка архива tar -xvf archive.tar # Распаковка .tar.gz tar -xvzf archive.tar.gz # Список содержимого архива (без распаковки) tar -tvf archive.tar drwxr-xr-x user/user 0 2026-01-09 10:35 folder/ -rw-r--r-- user/user 1024 2026-01-09 10:35 folder/file1.txt du (Disk Usage) Что это: показывает размер файлов и папок Зачем нужно: узнать, сколько места занимает папка # Размер текущей папки du . # Размер в понятном формате (MB, GB) du -h 256K ./config 1.2M ./logs 45M ./data 1.3G ./cache # Итоговый размер только du -sh . 48G . # Размер конкретной папки du -sh /home/user/Downloads 3.5G /home/user/Downloads # 10 самых больших папок du -h . | sort -rh | head -10 df (Disk Free) Что это: показывает свободное место на диске Зачем нужно: проверить, хватает ли места на диске # Показание свободного места df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 100G 65G 35G 65% / tmpfs 7.8G 0 7.8G 0% /dev/shm /dev/sda2 500G 420G 80G 84% /home # По файловой системе (флаг -i показывает inodes) df -i 11. Работа с переменными окружения export Что это: устанавливает переменную окружения Зачем нужно: передать переменную всем дочерним процессам (программам) # Установка переменной для текущей сессии export PATH="/usr/local/bin:$PATH" # Использование переменной echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin # Частая переменная - HOME (домашняя папка) echo $HOME /home/user # USER - текущий пользователь echo $USER user # Переменная для программ (например, NODE_ENV для Node.js) export NODE_ENV=production node app.js # приложение получит переменную 12. Комбинирование команд && (И) и || (ИЛИ) Что это: условное выполнение нескольких команд Зачем нужно: выполнить команды в определённом порядке или только при успехе # Выполнить вторую команду, если первая успешна (&&) cd project && npm install # cd выполнится, и если успешно, то выполнится npm install # Выполнить вторую команду, если первая не успешна (||) cd /nonexistent || echo "Directory not found" # cd не выполнится, но выведет "Directory not found" # Комбинирование mkdir backup && cp -r project backup || echo "Backup failed" Практические примеры использования Пример 1: Поиск и удаление больших логов # Найти все файлы .log больше 100 MB и удалить find /var/log -name "*.log" -size +100M -exec rm {} \; # Или с подтверждением перед удалением find /var/log -name "*.log" -size +100M -exec rm -i {} \; Пример 2: Резервная копия с датой # Создать архив с датой в названии tar -czf "backup_$(date +%Y%m%d_%H%M%S).tar.gz" important_folder/ # Вывод: # backup_20260109_103645.tar.gz Пример 3: Мониторинг нового содержимого в логе # Смотреть новые строки в логе в реальном времени tail -f /var/log/syslog | grep "ERROR" # Альтернатива с цветным выводом (если система поддерживает) tail -f /var/log/syslog | grep --color=auto "ERROR" Пример 4: Подсчёт количества файлов по типам # Сколько JavaScript файлов в проекте find . -name "*.js" | wc -l # Какие расширения файлов есть в проекте find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn 234 js 89 json 45 md 12 html Пример 5: Поиск и удаление дублирующихся файлов по имени # Найти все файлы, которые встречаются в папке несколько раз find . -type f -exec basename {} \; | sort | uniq -d # Найти конкретный дублирующийся файл find . -name "config.js" -ls # Покажет ВСЕ файлы с именем config.js и их размер Заключение Эти команды покрывают 80-90% повседневной работы в Linux/Unix. Ключ к мастерству: Понимайте, что делает каждая команда - не просто копируйте команды, понимайте логику Используйте man страницы - man command всегда даст вам полную информацию Экспериментируйте - практика - лучший учитель Комбинируйте команды - мощь Unix в ability объединять простые инструменты в сложные цепочки (pipes) Будьте осторожны с rm - Linux не имеет корзины! Удачи в изучении Linux!
  • 2 4
    2 Темы
    4 Сообщения
    MugiwaraM
    Nginx — это высокопроизводительный веб-сервер, обратный прокси-сервер и балансировщик нагрузки. Архитектура Nginx основана на модели master-процесса и worker-процессов. Master-процесс читает и обрабатывает конфигурацию, а также управляет worker-процессами, которые выполняют фактическую обработку запросов. Структура конфигурационного файла Конфигурация Nginx имеет иерархическую блочную структуру, где директивы организованы в контексты. Основной конфигурационный файл обычно находится по адресу /etc/nginx/nginx.conf. Основные контексты конфигурации Main (главный) контекст — глобальная область, содержащая директивы, которые влияют на весь экземпляр Nginx. Events контекст — управляет настройками обработки соединений. HTTP контекст — содержит всю HTTP-связанную конфигурацию. Server контекст — определяет виртуальные хосты и специфичные для сервера настройки. Location контекст — специфичная для URL конфигурация внутри server-блока. Upstream контекст — определяет группы серверов для балансировки нагрузки. Пример базовой структуры конфигурации # Main контекст - глобальные директивы user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; # Events контекст events { worker_connections 1024; use epoll; } # HTTP контекст http { include /etc/nginx/mime.types; default_type application/octet-stream; # Server контекст server { listen 80; server_name example.com; root /var/www/html; # Location контекст location / { try_files $uri $uri/ =404; } } } Процессы и соединения Worker Processes Директива worker_processes определяет количество рабочих процессов для обработки запросов. Каждый worker-процесс является однопоточным. worker_processes auto; # автоматически определяет количество CPU ядер Как это работает: Если Nginx выполняет CPU-интенсивные операции (например, SSL или gzip), и у вас 2 или более CPU/ядер, то вы можете установить worker_processes равным количеству CPU или ядер. Значение auto автоматически определяет оптимальное количество на основе доступных ядер. Worker Connections Директива worker_connections определяет максимальное количество одновременных соединений, которые может открыть один worker-процесс. events { worker_connections 1024; } Расчет максимального количества клиентов: max_clients = worker_processes × worker_connections Например, если у вас 4 worker-процесса и 1024 соединения на процесс, вы можете обслуживать до 4096 клиентов одновременно. Важное замечание: При использовании Nginx в качестве reverse proxy, это число нужно делить на 2, поскольку каждое клиентское соединение требует соединения с backend-сервером. Оптимизация worker_connections По умолчанию значение составляет 512 или 768. Вы можете увеличить это значение до лимита системы, определяемого командой ulimit -n. events { worker_connections 1024; use epoll; # для Linux multi_accept on; # принимать несколько соединений за один цикл событий } Директива Server Server-блок определяет виртуальный хост — конфигурацию для конкретного домена или IP-адреса. Listen директива Определяет, на каком порту и адресе сервер будет слушать входящие соединения. server { listen 80; # IPv4 на порту 80 listen [::]:80; # IPv6 на порту 80 listen 443 ssl http2; # HTTPS с HTTP/2 listen 192.168.1.10:8080; # конкретный IP и порт } Server_name директива Определяет доменное имя (или имена), которые будут обрабатываться этим server-блоком. server { server_name example.com www.example.com; # несколько доменов } server { server_name *.example.com; # wildcard } server { server_name ~^(?<subdomain>.+)\.example\.com$; # regex } Как Nginx выбирает server-блок: Точное совпадение имени Самое длинное совпадение, начинающееся с * Самое длинное совпадение, заканчивающееся на * Первое совпадение по регулярному выражению Default server (указанный с default_server в listen) Директива Location Location-блоки определяют, как обрабатывать запросы в зависимости от URI. Синтаксис и модификаторы location [modifier] path { # конфигурация } Модификаторы: = — точное совпадение (наивысший приоритет) ^~ — преимущественное префиксное совпадение (останавливает поиск regex) ~ — regex с учетом регистра ~* — regex без учета регистра (без модификатора) — префиксное совпадение Порядок приоритета location Точные совпадения = Преимущественные префиксы ^~ Регулярные выражения ~ и ~* (в порядке появления в файле) Префиксные совпадения (самый длинный префикс имеет приоритет) Примеры location # Точное совпадение - наивысший приоритет location = /exact { return 200 "Exact match"; } # Преимущественный префикс - останавливает regex location ^~ /images/ { root /var/www; } # Regex с учетом регистра location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; } # Regex без учета регистра location ~* \.(jpg|png|gif)$ { expires 1y; } # Префиксное совпадение location /api/ { proxy_pass http://backend; } # Дефолтный обработчик location / { root /var/www/html; index index.html; } Root и Alias директивы Root директива Директива root устанавливает корневую директорию для запросов. Полный путь формируется путем добавления URI запроса к значению root, включая часть location. location /images/ { root /var/www; } Для запроса /images/logo.png файл будет искаться по пути: /var/www/images/logo.png. Alias директива Директива alias заменяет часть URI, указанную в location, на путь из alias. Часть location НЕ добавляется к пути. location /images/ { alias /var/www/static/; } Для запроса /images/logo.png файл будет искаться по пути: /var/www/static/logo.png. Важное различие: С root путь location добавляется к корневому пути, с alias — заменяется. Try_files директива Директива try_files проверяет существование файлов в указанном порядке и обслуживает первый найденный. Синтаксис try_files file1 file2 ... uri; try_files file1 file2 ... =code; Примеры использования # Базовое использование для SPA приложений location / { try_files $uri $uri/ /index.html; } Как это работает: Сначала проверяет, существует ли файл $uri Если нет, проверяет, является ли $uri/ директорией Если нет, отдает /index.html # С named location для проксирования location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend-server; } # С кодом ошибки location / { try_files $uri $uri/ =404; } Важно: При использовании try_files внутри location, если последний параметр — URI, Nginx выполнит внутренний редирект. Reverse Proxy конфигурация Proxy_pass директива Директива proxy_pass перенаправляет запросы на proxied-сервер. location /api/ { proxy_pass http://127.0.0.1:8000; } Важные proxy заголовки location / { proxy_pass http://backend; # Передает оригинальный Host header proxy_set_header Host $host; # IP адрес клиента proxy_set_header X-Real-IP $remote_addr; # Цепочка proxy серверов proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Протокол (http или https) proxy_set_header X-Forwarded-Proto $scheme; } Почему это важно: По умолчанию Nginx перезаписывает Host header на адрес proxied-сервера. Приложению на backend нужен оригинальный Host header, чтобы правильно обрабатывать запросы. Proxy_redirect # Перезаписывает Location и Refresh заголовки в ответах от proxied-сервера proxy_redirect http://localhost:8000/ http://example.com/; # Или для всех URL proxy_redirect http://localhost:8000/ /; Отключение буферизации location /stream/ { proxy_pass http://backend; proxy_buffering off; # для приложений с низкой задержкой } Upstream и балансировка нагрузки Директива upstream определяет группу серверов для балансировки нагрузки. Базовая конфигурация upstream backend { server backend1.example.com:8080; server backend2.example.com:8080; server backend3.example.com:8080; } server { location / { proxy_pass http://backend; } } Методы балансировки Round Robin (по умолчанию) — запросы распределяются последовательно. upstream backend { server backend1.example.com; server backend2.example.com; } Least Connections — запросы направляются на сервер с наименьшим количеством активных соединений. upstream backend { least_conn; server backend1.example.com; server backend2.example.com; } IP Hash — клиент всегда направляется на один и тот же сервер на основе IP. upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; } Weight — распределение нагрузки с учетом весов. upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=2; server backend3.example.com weight=1; } Параметры серверов в upstream upstream backend { server backend1.example.com:8080 weight=5; server backend2.example.com:8080 max_fails=3 fail_timeout=30s; server backend3.example.com:8080 max_conns=100; server backend4.example.com:8080 backup; # используется только если основные недоступны server backend5.example.com:8080 down; # временно исключен } SSL/TLS конфигурация Базовая HTTPS конфигурация server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; # Пути к сертификатам ssl_certificate /etc/nginx/certs/ssl_certificate.crt; ssl_certificate_key /etc/nginx/certs/ssl_certificate.key; # Протоколы SSL ssl_protocols TLSv1.2 TLSv1.3; # Шифры ssl_ciphers HIGH:!aNULL:!MD5; location / { root /var/www/html; } } Редирект HTTP на HTTPS # Редирект всех HTTP запросов на HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$host$request_uri; } # HTTPS сервер server { listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /path/to/cert.crt; ssl_certificate_key /path/to/cert.key; location / { root /var/www/html; } } Каноническая форма URL # Редирект с example.com на www.example.com server { listen 443 ssl http2; server_name example.com; ssl_certificate /path/to/cert.crt; ssl_certificate_key /path/to/cert.key; return 301 https://www.example.com$request_uri; } # Основной сервер server { listen 443 ssl http2; server_name www.example.com; ssl_certificate /path/to/cert.crt; ssl_certificate_key /path/to/cert.key; location / { root /var/www/html; } } Gzip сжатие Gzip сжатие уменьшает размер передаваемых файлов, ускоряя загрузку сайта. Основная конфигурация http { # Включить gzip gzip on; # Уровень сжатия (1-9) # 5 - оптимальный баланс между размером и CPU gzip_comp_level 5; # Минимальная длина ответа для сжатия gzip_min_length 256; # Включить сжатие для proxied запросов gzip_proxied any; # MIME типы для сжатия gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/xml+rss application/xhtml+xml image/svg+xml; # Добавить Vary: Accept-Encoding header gzip_vary on; } Как это работает: Когда браузер делает запрос, сервер сжимает файл с помощью gzip перед отправкой. Браузер распаковывает его перед отображением пользователю. Уровень сжатия 5 обеспечивает около 75% уменьшения размера для большинства текстовых файлов. Примечание: text/html всегда включен в gzip по умолчанию, его не нужно указывать явно. Security Headers Security headers защищают от различных атак (XSS, clickjacking, MIME-sniffing). Основные заголовки безопасности # В http или server контексте add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" always; Описание заголовков: Strict-Transport-Security (HSTS) — принудительное использование HTTPS X-Frame-Options — защита от clickjacking, запрещает встраивание в iframe X-Content-Type-Options — запрещает MIME-sniffing браузерами X-XSS-Protection — включает встроенный XSS фильтр браузера Content-Security-Policy — контролирует, какие ресурсы можно загружать Referrer-Policy — контролирует передачу Referer header Параметр always: Гарантирует, что Nginx добавит заголовки даже для ответов с кодами 4xx и 5xx. Создание переиспользуемого snippet # /etc/nginx/snippets/security-headers.conf add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; Использование в server-блоке: server { listen 443 ssl http2; server_name example.com; include snippets/security-headers.conf; location / { root /var/www/html; } } Таймауты Таймауты контролируют, как долго Nginx ждет различных событий. Основные директивы таймаутов http { # Таймаут для чтения заголовков запроса от клиента client_header_timeout 60s; # Таймаут для чтения тела запроса от клиента client_body_timeout 60s; # Время, в течение которого keepalive соединение остается открытым keepalive_timeout 75s; # Таймаут для отправки ответа клиенту send_timeout 60s; } Client_body_timeout Определяет, сколько времени Nginx будет ждать отправки тела запроса клиентом. Важно для загрузки больших файлов. # Для сайтов с загрузкой больших файлов client_body_timeout 300s; Keepalive_timeout Определяет, как долго keepalive соединение остается открытым после отправки ответа. keepalive_timeout 65s; Как это работает: После отправки ответа клиенту соединение не закрывается сразу, а остается открытым указанное время. Это позволяет повторно использовать соединение для последующих запросов, избегая накладных расходов на установку нового TCP соединения. Оптимизация: Высокое значение позволяет повторно использовать соединения, но потребляет больше ресурсов сервера. Для сайтов с высокой нагрузкой можно уменьшить до 30s. Пример для API с большими загрузками location /api/upload { client_header_timeout 120s; client_body_timeout 300s; client_max_body_size 100m; proxy_pass http://backend; proxy_read_timeout 300s; proxy_connect_timeout 60s; } Размеры буферов Client_body_buffer_size Определяет размер буфера для чтения тела запроса клиента. # По умолчанию 8k или 16k client_body_buffer_size 16k; Как это работает: Если размер тела запроса превышает размер буфера, Nginx записывает его во временный файл на диске. Это замедляет обработку из-за дополнительных операций I/O. Оптимизация: Для API с большими загрузками можно увеличить размер буфера, но не устанавливайте его слишком большим, чтобы избежать уязвимостей к DoS атакам. Client_max_body_size Ограничивает максимальный размер тела запроса клиента. http { client_max_body_size 10M; } # Или для конкретного location location /upload { client_max_body_size 100M; } По умолчанию: 1M. Если клиент отправляет файл больше этого размера, Nginx возвращает ошибку 413 (Request Entity Too Large). PHP-FPM конфигурация Базовая настройка для PHP server { listen 80; server_name example.com; root /var/www/html; index index.php index.html; location / { try_files $uri $uri/ =404; } # Обработка PHP файлов location ~ \.php$ { include snippets/fastcgi-php.conf; # Для UNIX сокета fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # Или для TCP/IP # fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # Запрет доступа к .htaccess файлам location ~ /\.ht { deny all; } } Как это работает: Когда запрашивается файл .php, Nginx передает запрос PHP-FPM через FastCGI протокол. PHP-FPM выполняет скрипт и возвращает результат обратно Nginx. Разные версии PHP для разных сайтов server { server_name site1.com; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; include fastcgi_params; } } server { server_name site2.com; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; include fastcgi_params; } } Rewrite и редиректы Return директива Директива return — самый эффективный способ создания редиректов. # Постоянный редирект (301) location /old-page { return 301 /new-page; } # Временный редирект (302) location /temp { return 302 /temporary-location; } # Редирект на другой домен server { server_name old-domain.com; return 301 https://new-domain.com$request_uri; } Почему return лучше rewrite: return немедленно останавливает обработку и отправляет редирект, без дополнительных проверок. Это быстрее и проще в понимании. Rewrite директива Директива rewrite использует регулярные выражения для изменения URI. Синтаксис: rewrite regex replacement [flag]; Флаги: last — останавливает обработку rewrite и начинает новый поиск location break — останавливает обработку rewrite в текущем контексте redirect — временный редирект (302) permanent — постоянный редирект (301) Примеры rewrite # Простой rewrite с захватом групп location /data/ { rewrite ^(/data/.*)/geek/(\w+)\.?.*$ $1/linux/$2.html last; } # /data/distro/geek/test.php -> /data/distro/linux/test.html Как это работает: $1 и $2 захватывают части URI, заключенные в скобки () в регулярном выражении. # Rewrite для контроллера location /linux/ { rewrite ^/linux/(.*)$ /linux.php?distro=$1 last; } # /linux/ubuntu -> /linux.php?distro=ubuntu # Условный rewrite if ($scheme = "http") { rewrite ^ https://example.com$uri permanent; } Редирект с сохранением параметров location /old-path/ { return 301 /new-path$request_uri; } Переменные Nginx Nginx предоставляет множество встроенных переменных для использования в конфигурации. Основные переменные запроса # IP адрес клиента $remote_addr # Порт клиента $remote_port # Полный URI запроса с параметрами $request_uri # Нормализованный URI (после rewrite) $uri # HTTP метод (GET, POST, etc.) $request_method # Протокол запроса (http или https) $scheme # Host header из запроса $host # Доменное имя сервера $server_name # Порт сервера $server_port # Query string (параметры после ?) $args или $query_string Пример использования переменных # Логирование с переменными log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; # Установка заголовков location / { proxy_pass http://backend; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # Условная логика if ($request_method = POST) { return 405; } Переменные для доступа к параметрам # Доступ к конкретному query параметру $arg_name # для параметра ?name=value # Пример if ($arg_debug = "true") { return 200 "Debug mode"; } Map директива Директива map создает новые переменные на основе значений других переменных. Синтаксис: map $source_variable $destination_variable { default default_value; value1 result1; value2 result2; ~regex result3; } Примеры использования map # Редирект поддоменов map $host $redirect_host { default "example.org"; ~^(?<subdomain>\S+)\.example\.com$ $subdomain.example.org; } server { server_name .example.com; return 301 https://$redirect_host$request_uri; } # Определение backend на основе User-Agent map $http_user_agent $backend { default backend_default; ~*bot backend_bots; ~*mobile backend_mobile; } server { location / { proxy_pass http://$backend; } } # Установка переменной для блокировки IP map $remote_addr $blocked { default 0; 192.168.1.10 1; 10.0.0.5 1; } server { if ($blocked) { return 403; } } Важно: map директива может использоваться только в http контексте, а не внутри server или location. Rate Limiting (ограничение частоты запросов) Rate limiting защищает сервер от перегрузки и DoS атак. Limit_req (ограничение запросов) http { # Определяем зону для отслеживания limit_req_zone $binary_remote_addr zone=limitbyip:10m rate=10r/s; # Статус для отклоненных запросов limit_req_status 429; server { location /api/ { # Применяем ограничение limit_req zone=limitbyip burst=20 nodelay; proxy_pass http://backend; } } } Параметры: $binary_remote_addr — ключ для идентификации клиентов (IP адрес) zone=limitbyip:10m — имя зоны и размер памяти (10 МБ) rate=10r/s — максимальная частота (10 запросов в секунду) burst=20 — разрешает временные всплески до 20 запросов nodelay — обрабатывает burst запросы немедленно, без задержки Как это работает: Nginx отслеживает количество запросов от каждого IP адреса. Если частота превышает указанный лимит, запросы задерживаются (помещаются в очередь) или отклоняются с ошибкой 429. Limit_conn (ограничение соединений) http { # Определяем зону limit_conn_zone $binary_remote_addr zone=connlimit:10m; server { location /downloads/ { # Максимум 5 одновременных соединений от одного IP limit_conn connlimit 5; root /var/www/files; } } } Множественные ограничения http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; server { location / { limit_req zone=perip burst=5 nodelay; limit_req zone=perserver burst=10; proxy_pass http://backend; } } } MIME типы Default_type и mime.types Nginx использует MIME типы для определения типа содержимого файлов. http { include /etc/nginx/mime.types; default_type application/octet-stream; } Как это работает: Файл mime.types содержит сопоставление расширений файлов и MIME типов. Если расширение файла не найдено в mime.types, используется default_type. application/octet-stream означает, что браузер будет скачивать файл как бинарный, вместо попытки отобразить его. Добавление пользовательских MIME типов http { include mime.types; types { application/javascript mjs; application/wasm wasm; } } Логирование Access log http { # Определение формата лога log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # Использование формата access_log /var/log/nginx/access.log main; } Пользовательский формат лога http { log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time $upstream_response_time'; access_log /var/log/nginx/custom.log custom; } Полезные переменные для логов: $request_time — полное время обработки запроса $upstream_response_time — время ответа backend сервера $status — код HTTP ответа $body_bytes_sent — количество отправленных байт Error log # Уровни: debug, info, notice, warn, error, crit, alert, emerg error_log /var/log/nginx/error.log warn; Отключение логов для статики location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { access_log off; expires 1y; } Include директива Директива include позволяет подключать внешние конфигурационные файлы. http { include /etc/nginx/mime.types; include /etc/nginx/conf.d/*.conf; server { include /etc/nginx/snippets/ssl-params.conf; include /etc/nginx/snippets/security-headers.conf; } } Преимущества использования include: Модульность конфигурации Переиспользование общих настроек Упрощение управления большими конфигурациями Структура директорий /etc/nginx/ ├── nginx.conf # Главный файл ├── conf.d/ # Дополнительные конфигурации │ └── default.conf ├── sites-available/ # Доступные сайты │ ├── example.com.conf │ └── test.com.conf ├── sites-enabled/ # Активные сайты (симлинки) │ └── example.com.conf -> ../sites-available/example.com.conf └── snippets/ # Переиспользуемые фрагменты ├── ssl-params.conf └── security-headers.conf If директива и её подводные камни Директива if в Nginx работает не так, как ожидается в большинстве языков программирования. Когда безопасно использовать if Безопасно только с директивами return и rewrite: if ($scheme = "http") { return 301 https://$host$request_uri; } if ($request_method = POST) { return 405; } Проблемы с if # НЕПРАВИЛЬНО - может вызвать segmentation fault location / { if ($request_uri ~* "admin") { proxy_pass http://admin_backend; } root /var/www/html; } Почему это проблема: if в Nginx оценивается на этапе конфигурации, а не на каждом запросе. Это может приводить к неожиданному поведению и ошибкам. Альтернативы if Используйте map вместо if: map $request_uri $backend { default http://default_backend; ~*admin http://admin_backend; } server { location / { proxy_pass $backend; } } Используйте разные location блоки: location ~* /admin { proxy_pass http://admin_backend; } location / { proxy_pass http://default_backend; } Events контекст и оптимизация производительности Основные директивы events events { # Количество одновременных соединений на worker worker_connections 1024; # Метод обработки событий (зависит от ОС) use epoll; # Linux # use kqueue; # FreeBSD, macOS # Принимать несколько соединений за раз multi_accept on; } Методы обработки событий Linux: epoll — наиболее эффективный метод для Linux систем. FreeBSD/macOS: kqueue — оптимизированный для BSD систем. Почему это важно: Эти методы используют механизмы ядра операционной системы для эффективной обработки тысяч соединений одновременно без блокировки. Полная оптимизация производительности user nginx; worker_processes auto; worker_rlimit_nofile 65535; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 4096; use epoll; multi_accept on; } http { # Основные настройки sendfile on; tcp_nopush on; tcp_nodelay on; # Таймауты keepalive_timeout 65; client_header_timeout 60; client_body_timeout 60; send_timeout 60; # Буферы client_body_buffer_size 16k; client_max_body_size 10m; # Gzip gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml; # Кэширование открытых файлов open_file_cache max=10000 inactive=30s; open_file_cache_valid 60s; open_file_cache_min_uses 2; open_file_cache_errors on; } Проверка и перезагрузка конфигурации Проверка синтаксиса # Проверка конфигурации sudo nginx -t # Вывод: # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok # nginx: configuration file /etc/nginx/nginx.conf test is successful Управление Nginx # Запуск sudo systemctl start nginx # Остановка sudo systemctl stop nginx # Перезапуск sudo systemctl restart nginx # Перезагрузка конфигурации без разрыва соединений sudo systemctl reload nginx # Или напрямую sudo nginx -s reload # Проверка статуса sudo systemctl status nginx Сигналы Nginx # Изящная остановка (ждет завершения запросов) sudo nginx -s quit # Быстрая остановка sudo nginx -s stop # Перезагрузка конфигурации sudo nginx -s reload # Переоткрыть лог-файлы sudo nginx -s reopen Полный пример конфигурации production-сервера user nginx; worker_processes auto; worker_rlimit_nofile 65535; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 4096; use epoll; multi_accept on; } http { include /etc/nginx/mime.types; default_type application/octet-stream; # Логирование log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $upstream_response_time'; access_log /var/log/nginx/access.log main; # Основные настройки sendfile on; tcp_nopush on; tcp_nodelay on; # Таймауты keepalive_timeout 65; client_header_timeout 60; client_body_timeout 60; send_timeout 60; # Буферы client_body_buffer_size 16k; client_max_body_size 10m; # Gzip сжатие gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/xml+rss; # Rate limiting limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s; limit_req_status 429; # Upstream для балансировки upstream backend { least_conn; server backend1.example.com:8080 weight=3; server backend2.example.com:8080 weight=2; server backend3.example.com:8080 backup; } # Редирект HTTP на HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri; } # Редирект с example.com на www.example.com server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/certificate.crt; ssl_certificate_key /etc/nginx/ssl/private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; return 301 https://www.example.com$request_uri; } # Основной сервер server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.example.com; root /var/www/html; index index.php index.html; # SSL ssl_certificate /etc/nginx/ssl/certificate.crt; ssl_certificate_key /etc/nginx/ssl/private.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # Security headers add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" always; # Логирование access_log /var/log/nginx/example.com.access.log main; error_log /var/log/nginx/example.com.error.log warn; # Основной location location / { try_files $uri $uri/ /index.php?$args; } # API с rate limiting location /api/ { limit_req zone=general burst=20 nodelay; proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 300s; proxy_connect_timeout 60s; } # PHP обработка location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # Статические файлы location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; } # Запрет доступа к скрытым файлам location ~ /\. { deny all; access_log off; log_not_found off; } # Health check endpoint location = /health { access_log off; return 200 "OK\n"; add_header Content-Type text/plain; } } } Заключение Эта статья охватывает основные и продвинутые аспекты конфигурации Nginx: Архитектура — master и worker процессы, обработка соединений Структура конфигурации — иерархия контекстов и директив Location блоки — модификаторы и приоритеты обработки Reverse proxy — проксирование запросов на backend серверы Балансировка нагрузки — upstream блоки и методы распределения SSL/TLS — настройка HTTPS и редиректы Оптимизация — gzip, кэширование, буферы и таймауты Безопасность — security headers и rate limiting PHP-FPM — интеграция с PHP приложениями Логирование — форматы логов и пользовательские настройки Понимание того, как работает каждая директива и почему она настроена определенным образом, поможет вам создавать эффективные, безопасные и высокопроизводительные конфигурации Nginx для любых задач.
  • 0 0
    0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 3 21
    3 Темы
    21 Сообщения
    DinozaurD
    Сейчас есть новая команда docker compose {args}
  • Github как перенести репозиторий в организацию или передать пользователю

    github
    1
    3
    2 Голоса
    1 Сообщения
    44 Просмотры
    Нет ответов
  • error: Your local changes to the following files would be overwritten by merge

    git
    1
    2 Голоса
    1 Сообщения
    36 Просмотры
    Нет ответов
  • Git Branching - изучение git

    git
    1
    2 Голоса
    1 Сообщения
    53 Просмотры
    Нет ответов
  • DDoS

    Перенесена
    7
    0 Голоса
    7 Сообщения
    224 Просмотры
    itraceI
    @Jspi а где написано, что человек запретил обсуждать тему?)))
  • Полный гайд-шпаргалка по Git: от основ до эффективной работы

    3
    1 Голоса
    3 Сообщения
    142 Просмотры
    AladdinA
    Git Fetch Что делает: Загружает изменения из удаленного репозитория в ваш локальный Не изменяет ваши рабочие файлы или текущую ветку Обновляет удаленные ссылки (origin/main, origin/develop и т.д.) Основные команды: # Получить все изменения из всех удаленных репозиториев git fetch # Получить изменения из конкретного удаленного репозитория git fetch origin # Получить изменения для конкретной ветки git fetch origin main # Получить изменения и очистить устаревшие ветки git fetch --prune Зачем использовать: Увидеть изменения перед интеграцией Обновить информацию о удаленных ветках Безопасно проверить чужие изменения перед слиянием Типичный workflow: git fetch - получить изменения git diff origin/main - посмотреть что изменилось git merge origin/main - влить изменения Git Fetch . Что делает: Использует текущий репозиторий как источник для обновления ссылок Позволяет манипулировать ветками без сетевого взаимодействия Основные команды: # Обновить ветку на основе текущего состояния git fetch . main:feature-branch # Принудительное обновление ветки (осторожно!) git fetch . main:feature-branch --force Зачем использовать: Быстрое создание/обновление веток без переключения Синхронизация удаленных ссылок с локальным состоянием Создание резервных копий перед рискованными операциями Отличие от обычного fetch: Работает только с локальным репозиторием Не требует сетевого подключения Может перезаписывать историю (с флагом --force) Безопасное использование Обычный fetch — безопасен, рекомендуется для повседневного использования Fetch с точкой — продвинутая команда, используйте с осторожностью: Всегда проверяйте состояние перед использованием Создавайте резервные копии веток Избегайте --force без крайней необходимости Для большинства задач обычный git fetch вполне достаточен. git fetch . — это специализированный инструмент