Nginx — это высокопроизводительный HTTP и обратный прокси-сервер, а также прокси-сервер IMAP/POP3/SMTP.
Общие сценарии:
- сервер статических ресурсов
- Динамическое сопоставление
- обратный прокси
- Gzip-сжатие
- Балансировка нагрузки
Давайте сначала взглянем на конфигурацию Nginx по умолчанию.
в каталоге установки Nginx
nginx.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
, который говорит браузеру отключить кеш, каждый раз получать его с сервера
Эффект следующий:
правила сопоставления
Обычная форма выглядит следующим образом
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
поле
- Убедитесь, что браузер поддерживает его, мы можем настроить его в 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
Балансировка нагрузки
Балансировка нагрузки — это часто используемая функция 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 гораздо больше функций, вот лишь несколько основных и часто используемых, которые каждый может изучить и использовать, быстро приступить к работе и создать удобную среду.