Инструменты пользователя

Инструменты сайта


linux:nginx

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
linux:nginx [2021/04/20 09:47]
admin создано
linux:nginx [2024/12/29 06:31] (текущий)
admin
Строка 3: Строка 3:
 ===== Сведения ===== ===== Сведения =====
  
 +<details>
 +<summary>:!: Общее</summary>
 Эффективное использование ресурсов, отзывчив под нагрузкой.\\ Эффективное использование ресурсов, отзывчив под нагрузкой.\\
 Используется как веб так и прокси сервер.\\ Используется как веб так и прокси сервер.\\
 Спроектирован на базе асинхронных неблокирующих event-driver алгоритмов, сервер однопоточный и не создает процессы под каждое соединение, использование ресурсов относительно равномерно. Спроектирован на базе асинхронных неблокирующих event-driver алгоритмов, сервер однопоточный и не создает процессы под каждое соединение, использование ресурсов относительно равномерно.
  
-=== Динамический контент ===+ 
 +**Динамический контент**\\
 Nginx не имеет возможности самостоятельно обрабатывать запросы к динамическому контенту (например php), для этого он передает запрос внешнему процессу (например [[:linux:php|php-fpm]]) и ожидает результата. \\ Nginx не имеет возможности самостоятельно обрабатывать запросы к динамическому контенту (например php), для этого он передает запрос внешнему процессу (например [[:linux:php|php-fpm]]) и ожидает результата. \\
 На каждый запрос создается отдельное соединение с процессом. (плюс в экономии на статических запросах).\\ На каждый запрос создается отдельное соединение с процессом. (плюс в экономии на статических запросах).\\
 Взаимодействие может быть по одному из следующих протоколов: http, FastCGI, SCGI, uWSGI, memcache.\\ Взаимодействие может быть по одному из следующих протоколов: http, FastCGI, SCGI, uWSGI, memcache.\\
  
-=== Интерпретация запросов ===+ 
 +**Интерпретация запросов**\\
 В отличии от сервера [[:linux:apache|Apache]], Nginx интерпретирует запросы в первую очередь как URL а не как пути в файловой системе.\\ В отличии от сервера [[:linux:apache|Apache]], Nginx интерпретирует запросы в первую очередь как URL а не как пути в файловой системе.\\
 Во многом из-за своего Альтер Эго в роли прокси сервера, из-за чего и не реализует поддержку файлов .thaccess. Во многом из-за своего Альтер Эго в роли прокси сервера, из-за чего и не реализует поддержку файлов .thaccess.
  
-=== Модули ===+ 
 +**Модули**\\
 В отличии от [[:linux:apache|Apache]], в Nginx модули не являются динамическими, а должны компилироваться с ядром сервера. В отличии от [[:linux:apache|Apache]], в Nginx модули не являются динамическими, а должны компилироваться с ядром сервера.
  
-=== Совместное использование с Apache ===+ 
 +**Совместное использование с Apache**\\
 Очень частая практика использования обоих серверов вместе, Nginx ставится в качестве реверс-прокси, т.е. фронтенд а [[:linux:apache|Apache]] бэкенд.\\ Очень частая практика использования обоих серверов вместе, Nginx ставится в качестве реверс-прокси, т.е. фронтенд а [[:linux:apache|Apache]] бэкенд.\\
 Nginx самостоятельно обслуживает статический контент а динамический передает [[:linux:apache|Apache]].\\ Nginx самостоятельно обслуживает статический контент а динамический передает [[:linux:apache|Apache]].\\
 в такой конфигурации можно ставить несколько бэкендов, таким образом хорошо масштабировать систему. в такой конфигурации можно ставить несколько бэкендов, таким образом хорошо масштабировать систему.
 +</details>
 +
  
 ===== Установка ===== ===== Установка =====
Строка 36: Строка 44:
 Проверяем/включаем запуск/автозапуск Проверяем/включаем запуск/автозапуск
 <code bash># systemctl start/enable nginx</code> <code bash># systemctl start/enable nginx</code>
 +
  
 ===== Конфигурация ===== ===== Конфигурация =====
Строка 54: Строка 63:
 Конфиги с виртуальными хостами расположены в **/etc/nginx/conf.d/**\\ Конфиги с виртуальными хостами расположены в **/etc/nginx/conf.d/**\\
 Виртуальные хосты наследуют параметры из основного файла конфигурации - **/etc/nginx/nginx.conf**, эти параметры могут быть переопределены в каждом виртуальном хосте. Наследуются все явно не указанные параметры.\\ Виртуальные хосты наследуют параметры из основного файла конфигурации - **/etc/nginx/nginx.conf**, эти параметры могут быть переопределены в каждом виртуальном хосте. Наследуются все явно не указанные параметры.\\
 +
  
 ==== Location ==== ==== Location ====
Строка 79: Строка 89:
 } }
 </code> </code>
 +
  
 ==== Работа с php-fpm ==== ==== Работа с php-fpm ====
Строка 120: Строка 131:
 </code> </code>
  
-==== Настройка SSL сертификата ==== 
-FIXME☝ 
  
-==== Проксирование запросов ====+ 
 +==== Прокси ====
 Проксирование происходит с помощью блока Location, и директивы **proxy_pass**.\\ Проксирование происходит с помощью блока Location, и директивы **proxy_pass**.\\
 **Пример: ** Все запросы содержащие **/forum/** будут направлены на отдельный сервер **Пример: ** Все запросы содержащие **/forum/** будут направлены на отдельный сервер
Строка 136: Строка 146:
 } }
 </code> </code>
 +
 +
 +<details>
 +<summary>:!: Пример с заббиксом</summary>
 +По умолчанию apache заббикса слушает 80, переводим его на другой, например 8080, так же задаем локальный адрес для прослушивания\\
 +Nginx может по дефолту занять 8080, чекаем этот момент\\
 +
 +Далее в nginx редирект с 80 на 8080\\
 +<code bash>
 +server {
 +    listen 80;
 +    server_name zabbix.mydomain.ru;
 +    root /usr/share/nginx/html;
 +    index index.html index.htm;
 +        location / {
 +            proxy_pass http://127.0.0.1:8080;
 +            proxy_set_header Host $host;
 +            proxy_set_header Proxy-IP $remote_addr;
 +    }
 +}
 +</code>
 +
 +Обработка https, прием и редирект 443, редиректим на 8080\\
 +<code bash>
 +server {
 + listen 443 ssl http2;
 + server_name zabbix.mydomain.ru;
 + root /usr/share/nginx/html;
 + index index.html index.htm;
 +
 + ssl on;
 + ssl_certificate     /etc/zabbix/zabbix_ssl/Zabbix.crt;
 + ssl_certificate_key /etc/zabbix/zabbix_ssl/Zabbix.key;
 +
 + location / {
 + proxy_pass http://127.0.0.1:8080;
 +
 + proxy_set_header Host $host;
 + proxy_set_header Proxy-IP $remote_addr;
 + }
 +}
 +</code>
 +
 +
 +Далее меняем редирект с 80го, теперь не на 8080 а на 443, 8080 закрыт извне, т.к. заббикс слушает только локалхост\\
 +Перевод можно такой, перенаправляет вообще все запросы на защищенный порт\\
 +<code bash>
 +server {
 + listen 80 default_server;
 + server_name _;
 + return 301 https://$host$request_uri;
 +}
 +</code>
 +</details>
 +
 +
  
 ==== Связка с Apache ==== ==== Связка с Apache ====
Строка 201: Строка 267:
 Тут стоит уделить внимание расположению в сети общих ресурсов этих серверов, таких как DB, FTP и пр.\\ Тут стоит уделить внимание расположению в сети общих ресурсов этих серверов, таких как DB, FTP и пр.\\
  
-===== Управление ===== 
  
 +==== Context (блоки) ====
 +Конфиг содержит древовидную структуру, определен наборами фигурных скобок, эти области называются контекстами. Контексты вкладываются друг в друга, заданные директивы наследуют вложенными контекстами, могут переопределяться\\
 +
 +<details>
 +<summary>:!: Основные директивы</summary>
 +
 +**Main**\\
 +Контекст **Main** базовый, глобальный, по умолчанию присутствует всегда, директива вне контекстов, содержится в контексте main\\
 +
 +
 +**Events**\\
 +Находится в main, определяет глобальные параметры, влияющие на то как Nginx обрабатывает соединения. В конфете может быть только один контекст Events\\
 +Как правило метод для обработки соединения выбирается автоматически, платформа выбирает наиболее эффективный из доступных\\
 +
 +
 +**Http**\\
 +Содержит все директивы и другие контексты, необходимые для обработки соединений HTTP или HTTPS\\
 +Так же является дочерним от main, одноранговые с events, не вкладываются друг в друга\\
 +
 +Содержит значения по умолчанию для каждого виртуального сервера, определенного внутри\\
 +
 +
 +**Server**\\
 +Обычно объявляется внутри http, может быть объявлен несколько раз. Виртуальный хост, набор параметров для обработки запросов, разные хосты для разных запросов например\\
 +
 +Главные директивы для выбора вирт хоста:
 +  * "listen" - комбинация ip и порта, которую прослушивает данный блок
 +  * "server_name" - так же используется для выбора, если есть несколько блоков в одинаковыми "listen" то будет проверяться заголовок запроса "Host" и на основании этого делаться выбор
 +
 +
 +**Location**\\
 +Выбирается исходя из клиентского запроса, алгоритмом сопоставления\\
 +Так же, их может быть несколько, могут быть вложены друг в друга (что тоже может быть полезно). Определение находится в строке заголовка\\ 
 +
 +Блоки "location" дополнительно делят обработку запросов внутри блока "server", на основании "url" запроса\\
 +
 +
 +**upstream**\\
 +Используется для определения пула серверов для проксирования. Находится в блоке "http" (только ли ?)\\
 +
 +Затем контекст "Upstream" может ссылаться на имя в пределах блоков "server" или "location" для передачи запросов определенного типа в пул серверов. Внутри пула используется выбор хоста (round-robin), таким образом происходит балансировка нагрузки\\
 +
 +
 +**Другие**\\
 +**if** \\
 +Позволяет настроить условное ветвление\\
 +
 +**limit_exept** \\
 +Позволяет задать ограничения на использование HTTP-методов, можно разрешать определенным адресам например\\
 +
 +</details>
 +
 +
 +
 +===== Управление =====
 ==== Мониторинг ==== ==== Мониторинг ====
 Для настройки мониторинга необходимо внести изменения в конфиг **nginx.conf**.\\ Для настройки мониторинга необходимо внести изменения в конфиг **nginx.conf**.\\
Строка 233: Строка 353:
   * **Writing** - число соединений, в которых nginx в настоящий момент отвечает клиенту.   * **Writing** - число соединений, в которых nginx в настоящий момент отвечает клиенту.
   * **Waiting** - число бездействующих клиентских соединений в ожидании запроса.   * **Waiting** - число бездействующих клиентских соединений в ожидании запроса.
 +
  
 ==== Журналы ==== ==== Журналы ====
Строка 240: Строка 361:
 Даже рекомендуется делать отдельные файлы для каждого блока.\\ Даже рекомендуется делать отдельные файлы для каждого блока.\\
 По умолчанию располагаются в **/var/log/nginx/** По умолчанию располагаются в **/var/log/nginx/**
-=== Журнал доступа === 
  
 +
 +=== Журнал доступа ===
 В журнал доступа (**access_log**) регистрирует каждый запрос клиента.\\ В журнал доступа (**access_log**) регистрирует каждый запрос клиента.\\
 +<details>
 +<summary>:!: </summary>
 <code bash> <code bash>
 http  http 
Строка 255: Строка 379:
 } }
 </code> </code>
 +
 +Перенаправление логов в stdout\\
 +"AccessLog" обычно в хосте, errors в общем блоке\\
 +Даже при такой конфигурации, error почему то все равно создает файл в "/var/log/nginx", потому что при запуске используется дефолтный, иначе как сообщить если ошибка в конфигурации\\
 +<code bash>
 +(...)
 +error_log /dev/stdout error;
 +
 +    http {
 +      server {
 +        access_log /dev/stdout;
 +        (...)
 +      }
 +    }
 +</code>
 +</details>
 +
  
 Если формат не указан явно, используется формат по умолчанию: Если формат не указан явно, используется формат по умолчанию:
Строка 265: Строка 406:
 Журнал можно отключить: Журнал можно отключить:
 <code bash>access_log  off;</code> <code bash>access_log  off;</code>
 +
 +
  
 === Журнал ошибок === === Журнал ошибок ===
Строка 277: Строка 420:
   * **alert** – Оповещения. Действие должно быть принято немедленно.   * **alert** – Оповещения. Действие должно быть принято немедленно.
   * **emerg** – Чрезвычайная ситуация. Система находится в нерабочем состоянии.   * **emerg** – Чрезвычайная ситуация. Система находится в нерабочем состоянии.
 +
 +
 +
 +==== Параметры ====
 +
 +<details>
 +<summary>:!: Перечень</summary>
 +
 +**worker_processes** - 
 +
 +**worker_connections** - 
 +
 +**worker_cpu_affinity** - 
 +
 +**** - 
 +
 +
 +</details>
 +
 +
 +
 +
 +===== Примеры =====
 +
 +<details>
 +<summary>:!: Docker minimal</summary>
 +Dockerfile
 +<code bash>
 +FROM nginx
 +COPY index.html /usr/share/nginx/html/
 +COPY default.conf /etc/nginx/conf.d/
 +</code>
 +
 +
 +Штатный конфиг nginx (из контейнера, основной)
 +<code bash>
 +user  nginx;
 +worker_processes  auto;
 +
 +error_log  /var/log/nginx/error.log notice;
 +pid        /var/run/nginx.pid;
 +
 +
 +events {
 +    worker_connections  1024;
 +}
 +
 +
 +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"';
 +
 +    access_log  /var/log/nginx/access.log  main;
 +
 +    sendfile        on;
 +    #tcp_nopush     on;
 +
 +    keepalive_timeout  65;
 +
 +    #gzip  on;
 +
 +    include /etc/nginx/conf.d/*.conf;
 +}
 +</code>
 +
 +
 +Штатный конфиг в подключаемой папке (conf.d) 
 +<code bash>
 +server {
 +    listen       80;
 +    listen  [::]:80;
 +    server_name  localhost;
 +
 +    #access_log  /var/log/nginx/host.access.log  main;
 +
 +    location / {
 +        root   /usr/share/nginx/html;
 +        index  index.html index.htm;
 +    }
 +
 +    #error_page  404              /404.html;
 +
 +    # redirect server error pages to the static page /50x.html
 +    #
 +    error_page   500 502 503 504  /50x.html;
 +    location = /50x.html {
 +        root   /usr/share/nginx/html;
 +    }
 +
 +    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
 +    #
 +    #location ~ \.php$ {
 +    #    proxy_pass   http://127.0.0.1;
 +    #}
 +
 +    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
 +    #
 +    #location ~ \.php$ {
 +    #    root           html;
 +    #    fastcgi_pass   127.0.0.1:9000;
 +    #    fastcgi_index  index.php;
 +    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
 +    #    include        fastcgi_params;
 +    #}
 +
 +    # deny access to .htaccess files, if Apache's document root
 +    # concurs with nginx's one
 +    #
 +    #location ~ /\.ht {
 +    #    deny  all;
 +    #}
 +}
 +</code>
 +
 +
 +SSL конфиг
 +<code bash>
 +server{
 +        listen 443 ssl;
 +        server_name my-super-host;
 +
 +        ssl_certificate /etc/nginx/certs/test.pem;
 +        ssl_certificate_key /etc/nginx/certs/test.key;
 +
 +        location / {
 +                root /usr/share/nginx/html;
 +                index index.html;
 +        }
 +
 +        location = /50x.html {
 +                root   /usr/share/nginx/html;
 +        }
 +}
 +
 +</code>
 +
 +
 +Генерация самоподписанного серта
 +<code bash>
 +openssl req -x509 -newkey rsa:4096 -nodes -sha256 -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem -days 3650 -subj "/CN=<$PUBLIC_IP_ADDRESS>"
 +</code>
 +
 +</details>
 +
 +
 +
 +<details>
 +<summary>:!: Расположение tmp</summary>
 +
 +<code bash>
 +    http {
 +      server {
 +        (...)
 +        client_body_temp_path /deployments/nginx/tmp;
 +        proxy_temp_path /deployments/nginx/tmp;
 +        fastcgi_temp_path /deployments/nginx/tmp;
 +        uwsgi_temp_path /deployments/nginx/tmp;
 +        scgi_temp_path /deployments/nginx/tmp;
 +      }
 +    }
 +</code>
 +</details>
 +
 +
 +<details>
 +<summary>:!: </summary>
 +
 +<code bash>
 +</code>
 +</details>
 +
 +
 +
 +
 +
  
  
  
linux/nginx.1618912039.txt.gz · Последнее изменение: 2021/04/20 09:47 — admin