Что интерфейс хочет знать о Nginx

Nginx

Nginx — это высокопроизводительный HTTP и обратный прокси-сервер, а также прокси-сервер IMAP/POP3/SMTP.

Общие сценарии:

  • сервер статических ресурсов
  • Динамическое сопоставление
  • обратный прокси
  • Gzip-сжатие
  • Балансировка нагрузки

Давайте сначала взглянем на конфигурацию Nginx по умолчанию.

в каталоге установки Nginxnginx.confЭто глобальный файл конфигурации Nginx, в основном мы изменяем его содержимое.nginx.conf.defaultв качестве резервной копии файла конфигурации.

# 设置工作进程的数量
worker_processes  1;
# 处理连接
events {
    # 设置连接数
    worker_connections  1024;
}

http {
    # 文件拓展名查找集合
    include       mime.types;
    # 当查找不到对应类型的时候默认值
    default_type  application/octet-stream;

    # 日志格式,定义别名为 main
    #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  logs/access.log  main;

    # 调用 sendfile 系统传输文件
    sendfile        on;
    #tcp_nopush     on;

    # 客户端与服务器连接超时时间,超时自动断开
    #keepalive_timeout  0;
    keepalive_timeout  65;

    # 开启gizip 压缩
    #gzip  on;

    # 虚拟主机
    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        # 路由
        location / {
                root   html;
                index  index.html index.htm;
            }
    }

    # 引入其他的配置文件
    include servers/*;
}

Создайте статический сайт

# 虚拟主机server块
server {
    # 端口
    listen   8080;
    # 匹配请求中的host值
    server_name  localhost;
    
    # 监听请求路径
    location / {
        # 查找目录
        root /source;
        # 默认查找
        index index.html index.htm;
    }
}

Вот соответствующие поля

  • serverНастройте соответствующие параметры виртуального хоста, их может быть несколько.
  • server_nameНайдите конфигурацию соответствующего виртуального хоста через значение хоста в запросе
  • locationНастройте маршрутизацию запросов для обработки ситуаций, связанных со страницей.
  • rootПуть к поиску ресурса

Выполнить после завершения настройкиnginx -tПосмотрите, есть ли какие-либо ошибки, если вы видите следующее, это успешно

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

затем выполнитьnginx -s reloadОбновите файл конфигурации Nginx

В это время откройте браузер и введите localhost:8080, и вы сможете увидеть свою страницу.

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

Динамическое сопоставление (фильтрация запросов)

Обычно в среде разработки или тестовой среде мы модифицируем код, потому что кэш браузера может не вступить в силу, и нам нужно вручную очистить кеш, чтобы увидеть измененный эффект.Здесь мы делаем конфигурацию, чтобы браузер не кэшировал связанные предметы, ресурс.

location ~* \.(js|css|png|jpg|gif)$ {
    add_header Cache-Control no-store;
}

~* \.(js|css|png|jpg|gif)$сопоставляется с соответствующими типами файлов, а затем обрабатывается индивидуально.add_headerэто добавить заголовок к ответу на запросCache-Control no-store, который говорит браузеру отключить кеш, каждый раз получать его с сервера Эффект следующий:

Cache-Contro

правила сопоставления

Обычная форма выглядит следующим образом

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  • =Указывает на точное совпадение. Он сработает только в том случае, если запрошенный URL-адрес точно равен следующей строке (наивысший приоритет).
  • ^~Указывает, что если символ, следующий за символом, является наиболее подходящим, то правило принимается, и последующие поиски не выполняются.
  • ~Указывает, что правило определено с использованием регулярных выражений и учитывает регистр.
  • ~*Указывает, что правило определено с использованием регулярных выражений и не чувствительно к регистру.

Конечно, мы также можем фильтровать запросы по коду состояния, как это

# 通过状态码,返回指定的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /source/error_page;
}

Обратный прокси для решения междоменной проблемы

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

location /api {   
    # 请求host传给后端
    proxy_set_header Host $http_host;
    # 请求ip 传给后端
    proxy_set_header X-Real-IP $remote_addr;
    # 请求协议传给后端
    proxy_set_header X-Scheme $scheme;
    # 路径重写
    rewrite  /api/(.*)  /$1  break;
    # 代理服务器
    proxy_pass http://localhost:9000;
}
  • путь перехвата/api, которым можно сопоставить регулярные выражения.
  • proxy_set_headerПозволяет переопределять или добавлять поля в заголовки запросов, передаваемых на прокси-сервер.
  • $http_host,$remote_addr,$schemeВстроенная переменная для Nginx.
  • rewriteПерепишите путь в соответствии с переписанным URI запроса, например: путь к интерфейсу/user, мы можем запросить/api/user. (Зачем переписывать uri? Потому что при использовании Nginx в качестве обратного прокси нужно сопоставлять междоменный интерфейс перед форвардом. Для удобства сопоставления путь (или метка, как в примере) будет добавлен в исходный интерфейс.api), поэтому добавленный сегмент необходимо удалить после сопоставления и перед пересылкой, поэтому требуется перезапись. )
  • breakПродолжить обработку после этого запроса и прекратить сопоставление следующихlocation. Следует отметить, что аналогичноlastПроцесс выполнения заключается в остановке текущего запроса и повторной инициации запроса в соответствии с правилами, соответствующими перезаписи, совпадающими сверху вниз.locationболее поздние правила.
  • proxy_passпрокси-сервер.

Принцип: Nginx перехватывает соответствующие правила сопоставления, и Nginx перенаправляет запросhttp://localhost:9000, Nginx получает запрос, а затем отвечает на внешний интерфейс, вы можете запросить напрямую/api/userЗавершите запрос.

Настроить Gzip

В процессе разработки неизбежно использование некоторых зрелых фреймворков или подключаемых модулей. Эти внешние зависимости иногда имеют большой размер, что приводит к медленному отклику страницы. Мы можем использовать инструменты упаковки (веб-пакет, накопительный пакет) для сжатия кода, чтобы уменьшить код. размер. . Включите сжатие Nginx Gzip. Следует отметить, что функция сжатия Gzip должна поддерживаться как браузером, так и сервером, то есть серверное сжатие и парсинг браузера.

  • Проверьте поддержку браузера и подтвердитезаголовок запросасерединаAccept-Encodingполе

gzip浏览器支持

  • Убедитесь, что браузер поддерживает его, мы можем настроить его в Nginx.
server {
    # 开启gzip 压缩
    gzip on;
    # 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0)
    gzip_http_version 1.1;
    # 设置压缩级别,压缩级别越高压缩时间越长  (1-9)
    gzip_comp_level 4;
    # 设置压缩的最小字节数, 页面Content-Length获取
    gzip_min_length 1000;
    # 设置压缩文件的类型  (text/html)
    gzip_types text/plain application/javascript text/css;
}
  • Проверьте, вступила ли конфигурация в силу, проверьтезаголовок ответасерединаContent-Encodingполе, значениеgzip

gzip生效

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

Балансировка нагрузки — это часто используемая функция Nginx, которая может оптимизировать использование ресурсов, максимизировать пропускную способность, уменьшить задержку, обеспечить отказоустойчивую конфигурацию и распределить трафик на несколько внутренних серверов.

Syntax:	upstream name { ... }
Default: —
Context: stream

Вот несколько распространенных стратегий

  • Опрос (по умолчанию), после прихода запроса Nginx случайным образом распределяет трафик на любой сервер
upstream backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}
  • weight=numberУстановите вес сервера, по умолчанию 1, весу будет отдан приоритет
upstream backend {
    server 127.0.0.1:3000 weight=2;
    server 127.0.0.1:3001 weight=1;
}
  • backupОтметить как резервный сервер. Когда основной сервер недоступен, соединение с резервным сервером пропускается.
upstream backend {
    server 127.0.0.1:3000 backup;
    server 127.0.0.1:3001;
}
  • ip_hashСеансы поддерживаются, гарантируя, что один и тот же клиент всегда обращается к одному серверу.
upstream backend {
    ip_hash;  
    server 127.0.0.1:3000 backup;
    server 127.0.0.1:3001;
}
  • least_connОтдавайте приоритет серверу с наименьшим количеством подключений, чтобы не перегружать сервер слишком большим количеством запросов.
upstream backend {
    least_conn;
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

Когда нам нужно проксировать кластер, мы можем сделать это следующим образом

http {

    upstream backend {
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
    }

    ...
    server {
        listen      9000;
        server_name localhost;
        
        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            
            proxy_pass backend; 
        }
    }
}

наконец

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

Ссылка на ссылку

Обратитесь к официальной документации NGINX