10 сцен, вы можете играть в Nginx!

Nginx
10 сцен, вы можете играть в Nginx!
  • Обзор

  • Установить и использовать

  • Практическая сцена

    • веб хостинг

    • статический сайт

    • обратный прокси

    • балансировки нагрузки

    • Зашифрованная передача HTTPS

    • файловый сервер

    • Ограничение скорости

    • Ограничение

    • Черный и белый список

    • запрос на перехват

  • Подробная информация о конфигурации и переменных

  • Коды состояния HTTP

Обзор

What is Nginx?

Nginx (произносится как «engine x») — это высокопроизводительный обратный прокси-сервер и программное обеспечение веб-сервера. Благодаря низкому потреблению системных ресурсов, стабильной работе и высокопроизводительным возможностям параллельной обработки Nginx широко используется в интернет-компаниях.

Возможности Nginx

  • Высокая производительность и высокий параллелизм

  • Хорошая масштабируемость

  • Асинхронная неблокирующая модель, управляемая событиями

    Nginx Apache
    Один процесс обрабатывает несколько запросов Процесс обрабатывает запрос
    неблокирующий блокировка

Установить и использовать

Установить

установка окон

  • Загрузите официальную стабильную версию:https://nginx.org/download/nginx-1.20.0.zip
  • Разархивируйте его локально и запустите напрямуюnginx.exeПросто

установка линукс

  • установка пакета rpm

Страница загрузки пакета rpm:

Nginx.org/packages/… тогда…

$ rpm -ivh nginx-*.rpm
  • отключить брандмауэр
$ firewall-cmd --zone=public --add-port=80/tcp --permanent
$ firewall-cmd --reload

Пакет rpm уже содержит большое количество распространенных модулей, для его установки рекомендуется использовать пакет rpm, это просто и быстро.

использовать

Параметры команды значение
nginx запускать
nginx -V Просмотрите текущую версию и скомпилированную информацию о конфигурации
nginx -t Проверьте правильность синтаксиса файла конфигурации.
nginx -s stop Закрыть рабочий дочерний процесс напрямую
nginx -s quit Подождите, пока рабочий дочерний процесс правильно обработает запрос, а затем закройте
nginx -s reload Перечитайте файл конфигурации

Практическая сцена

веб хостинг

server {
    # 1: 基于多ip的虚拟主机:listen监听不同网卡的ip,端口可相同
    listen 8000;
    server_name 172.17.1.1;
    
    listen 8000;
    server_name 172.17.1.2;
    
    # 2: 基于多端口的虚拟主机:listen监听不同端口
    listen 8001;
    server_name localhost;
    
    listen 8002;
    server_name localhost;
    
    #3: 基于域名的虚拟主机:端口可相同,server_name为不同域名
    listen 8003;
    server_name www.test1.com;
    
    listen 8003;
    server_name www.test2.com;
}

статический сайт

Для ускорения парсинга веб-сайта динамические ресурсы могут быть переданы на back-end сервер, а чисто front-end статические страницы помещены в системную директорию и переданы Nginx для парсинга.

server {
    listen 80;
    server_name localhost;
    
    location / {
          root   /opt/nginx/html;
          index  index.html index.htm;
      }
}

обратный прокси

Обратный прокси — это режим прокси, в котором обратный прокси-сервер получает ресурсы ответа от одного или нескольких прокси-серверов в соответствии с определенными правилами и возвращает их клиенту после того, как пользовательский клиент обращается к прокси-серверу.Клиент знает только IP-адрес прокси-сервера. , IP внутреннего сервера не известен, потому что прокси-сервер скрывает информацию о прокси-сервере.

Обратный прокси-сервер уровня 7

В разделе http файла конфигурации nginx.conf напишите конфигурацию в следующем формате для проксирования локального порта 8088 в Baidu:

server {
    listen       8088;
    server_name	 localhost;
    
    location / {
        proxy_pass   https://www.baidu.com;
    }
}

Обратный прокси-сервер уровня 4

Помимо проксирования трафика HTTP уровня 7, Nginx также может проксировать трафик TCP/UDP уровня 4. Поток основного модуля необходимо скомпилировать, добавив параметр «--with-stream» при компиляции и настройке (включен в пакет rpm) .

Конфигурационный файл выглядит следующим образом (его нужно прописать в основной раздел):

stream {
    server {
        listen 3306;
        # 访问本机的3306,就被转发到了远程的3306
        proxy_pass 172.17.0.1:3306;
    }
}

балансировки нагрузки

Когда возникает бизнес-сценарий с высокой степенью параллелизма и большим трафиком, один внутренний сервер больше не может поддерживать нормальную работу бизнеса, и трафик запросов необходимо распределять по нескольким узлам обслуживания в соответствии с определенными правилами. узел не работает, система по-прежнему может нормально функционировать извне. Предоставление услуг для повышения производительности и стабильности системы.

Диаграмма соглашения о поддержке

восходящий модуль

  • Определить вышестоящий сервер
инструкция значение
upstream Имя сегмента, которое определяет URL-адрес вышестоящей службы в середине.
server Определить адрес вышестоящей службы
zone Определите общую память для совместного использования данных между рабочими подпроцессами.
keepalive Включите постоянные подключения к вышестоящим службам, каждый рабочий подпроцесс подключен к вышестоящему серверу.простоя долгое соединениеМаксимальное количество (keepalive 16; при одновременном поступлении 5000 запросов, после обработки будет зарезервировано 16 подключений, а все остальные будут закрыты)
keepalive_requests Максимальное количество запросов, которые может обработать постоянное соединение
keepalive_timeout В состоянии простоя период тайм-аута длинного соединения, после которого длинное соединение будет уничтожено.
hash Алгоритм балансировки нагрузки: Хэш
ip_hash Алгоритм балансировки нагрузки: расчет хэша на основе ip
least_conn Алгоритм балансировки нагрузки: наименьшее количество подключений
least_time Алгоритм балансировки нагрузки: минимальное время отклика
random Алгоритм балансировки нагрузки: случайный

необязательный параметр сервера

параметр значение
weight=number Значение веса, по умолчанию 1
max_conns=number Максимальное количество одновременных подключений к вышестоящему серверу
fail_timeout=time Время, когда сервер недоступен
max_fails=number Количество проверок, что сервер недоступен
backup Резервный сервер, только если другие серверы недоступны
down Марк сервер недоступен в течение длительного времени, автономное техническое обслуживание

алгоритм балансировки нагрузки

  • опрос (по умолчанию)

    • Каждый запрос распределяется по разным внутренним серверам один за другим в хронологическом порядке.
upstream backend {
    # 默认所有服务器权重为 1
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;
}
  • вес - опрос веса

    • Указывает вероятность опроса, которая используется, когда производительность внутреннего сервера неравномерна.
upstream backend {
    server 192.168.1.1:8080	weight=3;
    server 192.168.1.2:8080	weight=2;
    # default weight=1
    server 192.168.1.3:8080;		
}
  • хэш - хэш

    • Алгоритм хэширования заключается в преобразовании двоичного значения любой длины в более короткое двоичное значение фиксированной длины.Это маленькое двоичное значение называется хеш-значением, и это преобразование является необратимым.
    • hash $request_uri: загрузить в соответствии с хеш-значением этой переменной
upstream backend {
    hash $request_uri;
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;	
}
  • ip_hash

    • Каждый запрос распределяется в соответствии с результатом хеширования IP-адреса доступа, чтобы каждый посетитель мог получить доступ к внутреннему серверу, что является одним из решений проблемы совместного использования сеансов.
upstream backend {
    ip_hash;
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;	
}
  • Алгоритм наименьших соединений

    • Выберите запрос на выделение от вышестоящего сервера с наименьшим количеством установленных соединений.
    • В крайних случаях он выродится в алгоритм опроса.
    • наименьшее_соединение:
      • Когда несколько рабочих подпроцессов обрабатывают запросы одновременно, состояние подключения внутреннего сервера не может быть общим.В этом случае необходимо открыть пространство общей памяти для обмена информацией между несколькими рабочими подпроцессами.
      • zone zone_name 1M, открыть разделяемую память
upstream backend {
    least_conn;
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;	
}

Обработка, когда исключение возвращается на вышестоящий сервер

Не удается переслать в этих случаях

грамматика:proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent| off

По умолчанию: время ожидания ошибки proxy_next_upstream

Контекст: http, сервер, местоположение


Период тайм-аута, по истечении которого больше не будет предприниматься неудачных попыток переадресации.

грамматика:proxy_next_upstream_timeout time

По умолчанию: proxy_next_upstream_timeout 0 (не ждать)

Контекст: http, сервер, местоположение


Время пересылки

грамматика:proxy_next_upstream_tries number

По умолчанию: proxy_next_upstream_tries 0 (всегда вперед)

Контекст: http, сервер, местоположение

необязательный параметр значение
error Передайте запрос на внутренний сервер или прочитайте заголовки ответа.ошибкавремя (время простоя сервера будет перенесено на следующий)
timeout Передайте запрос на внутренний сервер или прочитайте заголовки ответа.тайм-аут(Если тело ответа не получено в течение времени, установленного proxy_read_timeout, оно будет перенаправлено на следующий сервер; но если сервер не работает, будет возвращено 502, и следующий сервер не будет перенаправлен)
invalid_header Когда бэкенд возвращает неверный ответ
http_500, 502, 503, 504, 403, 404, 429 Когда статус ответа http xxx
non_idempotent В случае сбоя неидемпотентного запроса следует ли пересылать следующий внутренний сервер (если не задано, он не будет переадресовываться. Например, при попадании запроса на публикацию, если получено 404, 404 будет возвращено напрямую. Лучше всего не устанавливать его легко для операций записи)
off Отключить переадресацию отказа запроса

Пример конфигурации

upstream backend {
    zone upstream_backend 64k;
    
    server 127.0.0.1:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=5;
    server test.nginx.com weight=1;
    
    keepalive 16;
    keepalive_requests 100;
    keepalive_timeout 30s;
}

server {
    location /test {
        proxy_pass http://backend/test;
        # 如果不配置proxy_next_upstream,当遇到上游返回http错误状态码时,nginx会直接返回给客户端
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 http_429; 
    }
}

Зашифрованная передача HTTPS

HTTPS защищает передачу данных между клиентом и сервером по зашифрованному каналу и стал обязательной конфигурацией для текущего развертывания веб-сайта. На HTTPS-сайте, развернутом с прокси-кластером Nginx, SSL-сертификат обычно развертывается на сервере Nginx, а затем запрос передается через прокси на вышестоящий сервер в бэкэнде. В этом методе развертывания сервер Nginx отвечает за работу запроса SSL, что относительно снижает нагрузку на ЦП внутреннего восходящего сервера.

  • Создать самозаверяющий сертификат HTTPS
  # 配置https签名证书
  # 1、创建https证书存放目录:
  cd /usr/local/nginx/conf/
  mkdir ssl
  # 2、创建私钥:
  openssl genrsa -des3 -out https.key 1024
  # 3、创建签名请求证书:
  openssl req -new -key https.key -out https.csr
  # 4、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
  cp https.key https.key.org
  openssl rsa -in https.key.org -out https.key
  # 5、最后标记证书使用上述私钥和CSR和有效期:
  openssl x509 -req -days 365 -in https.csr -signkey https.key -out https.crt
  • конфигурация сервера
server {
    listen       443 ssl;
    server_name  localhost;

    # 证书部分
    ssl_certificate     /usr/local/nginx/conf/ssl/https.crt; #RSA证书
    ssl_certificate_key  /usr/local/nginx/conf/ssl/https.key; #RSA密钥
    
    # TLS 握手优化
    # 会话缓存的存储大小为1MB
    ssl_session_cache    shared:SSL:1m;
    # 会话缓存的超时时间为5分钟
    ssl_session_timeout  5m;
    keepalive_timeout    75s;
    keepalive_requests   100;
    location / {
        root   html;
        index  index.html index.htm;
    }
}

файловый сервер

Для архивирования некоторых данных или материалов необходим файловый сервер. Используя Nginx, можно очень быстро и удобно создать простую файловую службу.

  • Эффект

  • настроить
server {
    listen 8004;
    server_name localhost;
    
    # 正常显示中文,windows服务器下中文目录无法下钻,目前无解
    charset gbk,utf-8;

    # 打开autoindex功能,以/结尾的请求
    autoindex on;
    
    # 显示文件的大小,
    # on:以字节显示
    # off:人性化显示,文件过大会显示为mb或gb
    autoindex_exact_size off;
    
    # 以哪种格式返回:html | xml | json | jsonp
    # 默认值: autoindex_format html
    autoindex_format html;
    
    # 显示时间格式
    # on: 12-Jul-2019 10:11(当前时区)
    # off: 12-Jul-2019 02:11(0时区,GMT)
    autoindex_localtime on;

    location / {
        root /data/files/;
        # 如果a.html文件存在,则会返回a.html内容,否则才会返回目录内容
        index a.html;
    }	
}

Ограничение скорости

location /rate {
	# 定义响应数据的传输速度,默认bytes/s
    limit_rate 20;

    # 这些是Nginx处理请求时相关变量,加大返回数据量更好地看到限速效果
	return 200 'request_time		$request_time
request_id			$request_id
server_name			$server_name
request_filename	$request_filename
document_root		$document_root
realpath_root		$realpath_root
request_completion	$request_completion
';
}

Ограничение

limit_conn

  • Используется для ограничения количества одновременных клиентских подключений.
  • Использовать общую память, эффективную для всех рабочих дочерних процессов (необходимо сохранить количество клиентских подключений)

limit_req

  • Используется для ограничения клиентской обработки запросовСредняя оценка
  • Использовать общую память, эффективную для всех рабочих дочерних процессов
  • Алгоритм ограничения тока:leaky_bucket(дырявое ведро)
    • Временно заблокируйте нисходящий поток воды наверху и подождите, пока часть воды из ведра вытечет, прежде чем выпустить воду наверху.
    • Вода выше перелива выбрасывается напрямую.
http {
    include       mime.types;
    default_type  application/json;
    
    # limit_conn_zone key zone=name:size
    # key:用于定义客户端的唯一标识来限速,如remote_addr
    # name:任意名称
    # size:共享内存大小空间,m为单位
    # binary_remote_addr 使用4个字节空间,高效;remote_addr 使用7-15个字节空间
    limit_conn_zone $binary_remote_addr zone=limit_addr:10m;
    
    # limit_req_zone key zone=name:size rate=rate;
    # 上下文:http
    # rate:表示允许相同标识的客户端的访问频次,12r/m的,即限制每5秒访问一次,每5秒才处理一个请求。
    limit_req_zone  $binary_remote_addr zone=limit_req:15m rate=12r/m;

    server {
        listen       80;
        server_name  localhost;

        location / {
           root   html;
        	  index  index.html index.htm;
            
            # 触发限速后,返回状态码,默认503
            # 上下文:http, server, location
            limit_conn_status 503;
            
            # 当触发限速后,错误日志出记录一条日志, 这里用于定义日志等级
            # info|notice|warn|error
            # 上下文:http, server, location
            # 默认值:error
            limit_conn_log_level warn;
            
            # limit_conn zone number;
            # zone:用limit_conn_zone中定义的zone名称
            # number:以zone为标识的客户端被允许的同时最大连接数
            limit_conn limit_addr 2;
            
            # 定义响应数据的传输速度,bytes/s
            # 本指令属于ngx_http_core_module,不属于ngx_http_limit_conn_module
            limit_rate 50;

            # limit_req_status code(http的状态码) 
            # 默认值:503
            # 上下文:http, server, location
            limit_req_status 504;
            
            # 触发限速后,日志记录的等级 
            # info|notice|warn|error
            # 默认值:error
            # 上下文:http, server, location
            limit_req_log_level notice;
            
            # limit_req zone=name [burst=number] [nodelay | delay=number];
            # burst:桶大小,设置一个大小为x的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
            # nodelay:如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。
            # 上下文:http, server, location
            # limit_req zone=limit_req burst=7 nodelay;
            limit_req zone=limit_req;
        }
    }
}

Черный и белый список

access

  • Ограничить доступ к определенному IP или сегменту сети

  • allow

  • deny

server {
    listen       80;
    server_name  localhost;
    location / {
        # allow address | CIDR | UNIX | all
        # 默认值
        # 上下文:http, server, location, limit_except
        allow 192.168.0.1/24;
        
        # deny address | CIDR | UNIX | all
        # 默认值
        # 上下文:http, server, location, limit_except
        deny all;  
    }
}

пример правила

location / {
    # 规则从上到下
    
    # 拒绝
    deny   192.168.1.1;
    
    # 放行192.168.1.0网段,子网掩码24位(255.255.255.0),但是除了192.168.1.1
    allow  192.168.1.0/24;
    
    # 放行10.1.1.0网段,子网掩码16位(255.255.0.0)
    allow  10.1.1.0/16;
    
    # 放行ipv6
    allow  2001:0db8::/32;
    
    # 除了上面放行的,其他全部拒绝
    deny   all;
}

запрос на перехват

auth_request

  • Контроль доступа на основе кода ответа HTTP, полученного подзапросом
    • Например: перехватить все запросы, сначала сделать запрос аутентификации, а затем отпустить его после прохождения
location /private {
    # 默认值:off
    # 上下文:http, server, location;
    # 鉴权成功对会返回后面实际内容,鉴权失败会返回鉴权服务的返回内容
    auth_request /auth;
    ...
}
location /auth {
    proxy_pass http://localhost:8080/auth;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
    
}

Подробная информация о конфигурации и переменных

Основной раздел глобальной конфигурации

核心参数(其他参数大部分情况下用不到)

# user USERNAME [GROUP]
# 解释:指定运行nginx的worker子进程的属主和属组,其中属组可以不指定
user  nginx;

# worker_processes NUMBER | auto
# 解释:指定nginx启动的worker子进程数量
# 【*auto:自动设置为物理CPU核心数】
worker_processes  auto;

# pid DIR
# 解释:指定运行nginx的master主进程的pid文件存放路径
pid /opt/nginx/logs/nginx.pid;

# worker_rlimit_nofile NUMBER
# 解释:指定worker子进程可以打开的最大文件句柄数
# 【系统最大打开65535,每个子进程打开数乘子进程数,实际也不会超过65535】
# 这个值需要调大
worker_rlimit_nofile 20480;

# worker_rlimit_core SIZE
# 指定worker子进程异常终止后的core文件,用于记录分析问题
worker_rlimit_core 50M;
working_directory /opt/nginx/tmp;#【必须对子进程用户赋写权限】

# 解释:将每个worker子进程与CPU物理核心绑定
# 【master负责调度,worker负责处理请求】
# 【假设CPU有4个核心,某一时刻worker1获取到了CPU1的工作调度时间片,时间片过后worker1从CPU1上面撤下来,CPU1去处理其他事件,下一时刻可能是CPU2、CPU3的时间片调度到了worker1上面,那么worker1就会在其他CPU上面工作,进程与CPU的调度切换是有损耗的,worker1如果绑定了CPU1,worker1将永远等待CPU1的调度,充分利用CPU缓存】
# 【【主要作用:将每个worker子进程与特定CPU物理核心绑定,优势在于:避免同一个worker子进程在不同的CPU核心上切换,缓存失效,降低性能;其并不能真正避免进程切换(进程切换是CPU工作特性)】】
# -- worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;# 8核心,8个worker
# -- worker_cpu_affinity 01 10 01 10;# 2核心,4个worker
worker_cpu_affinity 0001 0010 0100 1000;# 4核心,4个worker

# 解释:指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为“负值”,以优先调用nginx
# 【Linux默认进程的优先级值是120,值越小越优先;nice设定范围为-20到+19】
# 【对Linux来说,优先级值则是100到139】
worker_priority -20;

# 指定worker子进程优雅退出时的超时时间,不管5秒内是否处理完,都强制退出
worker_shutdown_timeout 5s;

# worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降
# 比如某些计时的操作,worker需要去获取内核时间,频繁跟内核打交道会降低性能
timer_resolution 100ms;

# daemon on | off
# 设定nginx的运行方式,前台还是后台,前台用户调试,后台用于生产
daemon on;

# 负载均衡互斥锁文件存放路径
lock_file logs/nginx.lock;

сегмент событий

events {
    # Nginx使用何种事件驱动模型,一般不指定这个参数
    # use epoll;
    
    # worker子进程能够处理的最大并发连接数,多核情况最大其实达不到65535,
    worker_connections  65535;
    
    # 是否打开负载均衡互斥锁,默认off(当master接收到请求时,会给每个worker发送消息去唤醒,状态为on时,则会有一个负载均衡锁,master会轮流发给每一个)
    accept_mutex on;
    
    # 新连接分配给worker子进程的超时时间,默认500ms,超时后会转给下一个worker处理请求
    accept_mutex_delay 100ms;
    
    # worker子进程可以接收的新连接个数(这个参数对性能影响不太大)
    multi_accept on;
}

http-сегмент

  • серверный сегмент
server {
	listen 80;
    server_name www.test.com; 
    location /picture {
	    root /opt/nginx/html/picture;
        # 客户端请求 www.test.com/picture/1.jpg;
        # 对应磁盘映射路径为:/opt/nginx/html/picture/picture/1.jpg
        
	}
	location /picture {
	    alias /opt/nginx/html/picture/;
        # 客户端请求 www.test.com/picture/1.jpg;
        # 对应磁盘映射路径为:/opt/nginx/html/picture/1.jpg
        # 【末尾一定要加/】
	}
}
  • правила сопоставления для server_name
# 精确匹配,优先级最高,1
server_name www.test.com;

# 左通配,优先级2
server_name *.test.com;

# 右通配,优先级3
server_name www.test.*;

# 正则通配,优先级最低,4
server_name ~^w\.test\..*$;

# 多个
server_name www.test.com *.test.com www.test.* ~^w\.test\..*$;
  • сегмент местоположения
правила сопоставления значение Пример приоритет (1 наивысший)
= точное совпадение location = /pic/ 1
^~ Остановить поиск, когда он совпадет location ^~ /pic/ 2
~ Регулярное сопоставление с учетом регистра location ~ \.(Jpg|gif)# 3
~* Обычное сопоставление, без учета регистра location ~ \.(Jpg|gif)$ 4
неподписанный location / 5
@ внутренний прыжок location @errorpage
# 测试样例
location ~ /test/8005/t/$ {
		return 200 'first regular expressions match!';
}
location ~* /test/8005/t/(\w+)$ {
		return 200 'longest regular expressions match!';
}
location ^~ /test/8005/t/ {
		return 200 'stop regular expressions match!';
}
location /test/8005/t/Test2 {
		return 200 'longest prefix string match!';
}
location /test/8005/t {
		return 200 'prefix string match!';
}
location = /test/8005/t {
		return 200 'exact match!';
}
Разница между корнем и псевдонимом root alias
грамматика root path alias path
контекст http, server, location, if location
разница Путь определения наложения с URI Возьмите только путь определения, обязательно добавьте / в конце
Разница между расположением с/без/в конце
Без/ location /test Попробуйте использовать тест в качестве каталога, и если вы не можете его найти, найдите тестовый файл.
пояс/ location /test/ Используйте тест как каталог и возвращайте 404 напрямую, если он не существует.
location /status {
	# 监控模块
    stub_status;
}
# ------页面结果------
Active connections: 2 
server accepts handled requests
 16 16 26 
Reading: 0 Writing: 1 Waiting: 1 
Пункт статуса значение
Active connections Текущее количество TCP-соединений между клиентом и Nginx равно сумме следующих операций чтения, записи и ожидания.
accepts Общее количество подключений к клиентам с момента запуска Nginx.
handled Общее количество клиентских подключений, обработанных с момента запуска Nginx. Если конфигурация worker_connections не превышена, значение такое же, как и accepts
requests Общее количество клиентских запросов, обработанных с момента запуска Nginx. Поскольку существует запрос HTTP Keep-Alive, значение запросов будет больше, чем обработанное значение.
Reading Общее количество подключений, которые читают заголовки HTTP-запросов.
Writing Общее количество подключений, которые отправляют ответные данные клиенту.
Waiting Общее количество простаивающих в настоящее время соединений HTTP Keep-Alive
Встроенные переменные
имя переменной значение
$connections_active То же, что и значение активных подключений
$connections_reading То же, что и значение чтения
$connections_writing То же, что и запись значения
$connections_waiting То же, что и значение ожидания
  • команда перезаписи и команда возврата
    • return
      • Остановить обработку запроса, вернуть код ответа напрямую или перенаправить на другой URL-адрес.
      • После выполнения инструкции возврата последующие инструкции в локации выполняться не будут.
    • rewrite
      • Переписать URL-адреса в соответствии с указанными правилами сопоставления регулярных выражений.
location / {
    
    # 上下文:server, location, if
    # return code [text];
    # text:响应体内容(如果code是200)
    # return 200 "return 200 HTTP Code";
    # return code URL;
    # URL:重定向
    # return 302 /test;
    # return URL;
    # URL:直接跟URL的话必须是http/https开头的完整路径
    # text:响应体内容
    return http://localhost:8000/test;
}

location /test {
    index test.html;
}

location /search {
    
    # rewrite regex replacement [flag]
    # 上下文:server, location, if
    # flag: 
    #     last: 重写后的url发起新请求,再次进入server段,重试location中的匹配
    #     break: 直接使用重写后的url,不再匹配其他location中的语句
    #     redirect: 返回302临时重定向
    #     permanent: 返回301永久重定向
    rewrite /(.*) https://www.baidu.com permanent;
}

location /test1 {
    # 继续匹配location,
    rewrite /images/(.*) /test2/$1 last;
    return 200 "return 200 in /test1";
}

location /test2 {
    # 不会再匹配,直接找test3下面的文件
    rewrite /pics/(.*) /test3/$1 break;
    return 200 "return 200 in /test2";
}

location /test3 {
    # 请求:/test3/index.html,
    # 结果:直接返回"return 200 in /test3",不会再去找index.html文件
    return 200 "return 200 in /test3";
}

location /test4/ {
    if ( $remote_addr = "192.168.1.1" ) {
        return 200 "test if OK in URL /test4/";
    } 
}

location /test5 {
    if ( $uri = "/images/" ) {
        rewrite (.*) /test2/ break;
    }
    # 执行了上面rewrite后,这里的return还会执行,通常不会联合一起写
    return 200 "test5 if failed\n";
}

Классификация переменных Nginx

1、TCP连接相关变量
		    
	#客户端地址,例如192.168.1.1
	remote_addr					
	
	#客户端端口,例如58473
	remote_port					
	
	#客户端地址的整型格式
	binary_remote_addr			
	
	#已处理连接,是一个递增的序号
	connection					
	
	#当前连接上执行的请求数,对于keepalive连接有意义
	connection_request			
	
	#如果使用proxy_protocol协议,则返回原始用户的地址,否则为空
	proxy_protocol_addr			
	
	#如果使用proxy_protocol协议,则返回原始用户的端口,否则为空
	proxy_protocol_port			
	
	#服务器地址,例如192.168.184.240
	server_addr					
	
	#服务器端口,例如80
	server_port					
	
	#服务端协议,例如HTTP/1.1
	server_protocol		
	                            
		                                
2、HTTP请求相关变量             
			
	#请求包体头部长度
	conten_length				
	
	#请求包体类型
	content_type				
	
	#URL中某个参数
	arg_参数名					
	
	#所有URL参数
	args						
	
	#URL中有参数,则返回?;否则返回空
	is_args						
	
	#与args完全相同
	query_string				
	
	#请求的URL,不包含参数
	uri							
	
	#请求的URL,包含参数
	request_uri					
	
	#协议名,http或者https
	scheme						
	
	#请求的方法,GET、HEAD、POST等
	request_method				
	
	#所有请求内容的大小,包含请求行,头部,请求体
	request_length				
	
	#由HTTP Basic Authentication协议传入的用户名
	remote_user					
	
	#客户端请求主体信息的临时文件名
	request_body_file			
	
	#包含请求的主要信息,在使用proxy_pass或fastcgi_pass指令的location中比较有意义
	request_body	

	#先看请求行,再看请求头,最后找server_name
	host

	#用户浏览器标识
	http_user_agent

	#从哪些链接过来的请求
	http_referer

	#经过一层代表服务器,添加对应代理服务器的信息
	http_via

	#获取用户真实IP
	http_x_forwarded_for

	#用户cookie
	http_cookie


		                                
3、Nginx处理请求时相关变量      
		                                
	#请求处理到现在所耗费的时间,单位为秒,例如0.03代表30毫秒
	request_time				
	
	#请求处理完成,则返回OK,否则为空
	request_completion			
	
	#16进制显示的请求id,随机生成的
	request_id					
	
	#匹配上请求的server_name值
	server_name					
	
	#若开启https,则值为on,否则为空
	https						
	
	#待访问文件的完整路径
	request_filename			
	
	#由URI和root/alias规则生成的文件夹路径
	document_root				
	
	#将document_root中的软链接换成真实路径
	realpath_root				
	
	#返回响应时的速度上限值
	limit_rate					
		                                
4、Nginx返回响应时相关变量      
			
	#响应体中真实内容的大小	
	body_bytes_sent				
	
	#全部响应体大小
	body_sent					
	
	#HTTP返回状态码
	status						
			
		
5、系统变量

	#nginx系统版本
	nginx_version

	#服务器时间
	time_local

пространственно-временная единица

единица времени

  • мс: миллисекунды
  • с: секунды
  • м: минуты
  • ч: часы
  • д: дни
  • ж: неделя
  • М: месяц
  • г: год

космическая единица

  • к/к: КБ
  • м/м: МБ
  • г/г: ГБ

Коды состояния HTTP

Классификация описывать
1** Информация, сервер получил запрос и запрашивающей стороне необходимо продолжить операцию
2** Success, операция успешно получена и обработана
3** Перенаправление, дальнейшие действия, необходимые для выполнения запроса
4** Ошибка клиента, запрос содержит синтаксическую ошибку или запрос не может быть выполнен
5** Ошибка сервера, сервер обнаружил ошибку при обработке запроса
код состояния описывать
100 Продолжать. Клиент должен продолжить свой запрос
101 Переключение протоколов. Сервер переключает протоколы по запросу клиента. Переключитесь только на протокол более высокого уровня, например, на более новую версию HTTP.
200 Запрос выполнен успешно. Обычно используется для запросов GET и POST.
201 созданный. Успешно запрошен и создан новый ресурс
202 принятый. Заявка принята, но не выполнена
203 Несанкционированная информация. Запрос выполнен успешно. Но возвращенная метаинформация находится не на исходном сервере, а на копии
204 Без содержания. Сервер успешно обработал, но не вернул содержимого. Гарантирует, что браузер продолжает отображать текущий документ без обновления веб-страницы.
205 Сбросить содержимое. Серверный процесс выполнен успешно, и пользовательский терминал (например, браузер) должен сбросить представление документа. Поля формы браузера можно очистить с помощью этого кода возврата.
206 Часть. Сервер успешно обработал часть запроса GET
300 множественный выбор. Запрошенный ресурс может включать несколько местоположений, и, соответственно, список характеристик и адресов ресурса может быть возвращен для выбора пользовательского терминала (например, браузера).
301 Переехать навсегда. Запрошенный ресурс был окончательно перемещен на новый URI, возвращаемая информация будет включать новый URI, и браузер будет автоматически перенаправлен на новый URI. Любые новые запросы в будущем должны использовать вместо этого новый URI.
302 Временный переезд. Похоже на 301. Но ресурс перемещается только временно. Клиенты должны продолжать использовать исходный URI.
303 Посмотрите другие адреса. Похоже на 301. Просмотр с использованием запросов GET и POST
304 Без изменений. Запрошенный ресурс не был изменен, и ресурс не будет возвращен, когда сервер вернет этот код состояния. Клиенты обычно кэшируют посещенные ресурсы, предоставляя заголовок, указывающий, что клиент хочет вернуть только ресурсы, измененные после указанной даты.
305 Используйте прокси. Запрошенный ресурс должен быть доступен через прокси
306 Устаревшие коды состояния HTTP
307 Временная переадресация. Похоже на 302. Перенаправление с помощью GET-запроса
400 В клиентском запросе есть синтаксическая ошибка, которую сервер не может понять.
401 Запрос требует аутентификации пользователя
402 зарезервировано для использования в будущем
403 Сервер понимает запрос запрашивающего клиента, но отказывается выполнять запрос
404 Сервер не смог найти ресурс (веб-страницу) по запросу клиента. С помощью этого кода веб-дизайнеры могут настроить персонализированную страницу с надписью «запрошенный вами ресурс не найден».
405 метод в клиентском запросе запрещен
406 Сервер не может выполнить запрос на основе характеристик содержимого запроса клиента.
407 Запрос требует проверки подлинности прокси-сервера, аналогичной 401, но запрашивающая сторона должна использовать прокси-сервер для авторизации.
408 Сервер слишком долго ждет запроса, отправленного клиентом, и истекает время ожидания.
409 Сервер может вернуть этот код, когда он завершает запрос клиента PUT, и у сервера возникает конфликт при обработке запроса.
410 Ресурс, запрошенный клиентом, больше не существует. 410 отличается от 404. Если ресурс ранее был удален безвозвратно, можно использовать код 410, а дизайнер сайта может указать новое местоположение ресурса через код 301.
411 Сервер не может обработать информацию запроса, отправленную клиентом без Content-Length
412 Ошибка в предварительных требованиях к информации запроса клиента
413 Запрос был отклонен, так как запрошенный объект был слишком большим для обработки сервером. Чтобы предотвратить непрерывные запросы от клиентов, сервер может закрыть соединение. Если сервер не может временно его обработать, он будет содержать ответное сообщение Retry-After.
414 Запрошенный URI (обычно URL) слишком длинный для обработки сервером.
415 Сервер не может обработать формат мультимедиа, прикрепленный к запросу.
416 Недопустимая область действия, запрошенная клиентом
417 Сервер не может удовлетворить информацию заголовка запроса Expect
500 Внутренняя ошибка сервера, невозможно выполнить запрос
501 Сервер не поддерживает запрошенную функцию и не может выполнить запрос
502 Сервер, работающий в качестве шлюза или прокси, получил неверный ответ от удаленного сервера при попытке выполнить запрос
503 Из-за перегрузки или обслуживания системы сервер временно не может обработать запрос клиента. Продолжительность задержки может быть включена в заголовок сервера Retry-After.
504 Сервер, выступающий в роли шлюза или прокси, не получил вовремя запрос от удаленного сервера.
505 Сервер не поддерживает запрошенную версию протокола HTTP и не может завершить обработку

Вышесказанное является моим личным мнением, приглашаю всех к обсуждению и совместному обучению!