Роль nginx в приложении
- разрешать междоменные
- фильтрация запросов
- настроить gzip
- Балансировка нагрузки
- сервер статических ресурсов
- ...
nginx — это высокопроизводительный HTTP и обратный прокси-сервер, а также универсальный прокси-сервер TCP/UDP, изначально написанный русским Игорем Сысоевым.
Nginx сейчас является почти обязательной технологией для многих крупных сайтов, в большинстве случаев нам не нужно настраивать его самостоятельно, но необходимо понимать, какую роль он играет в приложении и как решать эти проблемы.
Ниже я объясню роль nginx в приложении из реального применения nginx на предприятии.
Чтобы облегчить понимание, давайте сначала разберемся с некоторыми базовыми знаниями.nginx是一个高性能的反向代理服务器
Так что же такое обратный прокси?
Прямой прокси и обратный прокси
играет рольэто предполагаемый уровень сервера между сервером и клиентом,играет рольПолучит запрос клиента и перенаправит его на сервер, а затем перенаправит ответ сервера клиенту.
Будь то прямой прокси или обратный прокси, реализованы вышеуказанные функции.
прямой прокси
прямой прокси, что означает сервер между клиентом и исходным сервером.Чтобы получить контент с исходного сервера, клиент отправляет запрос на прокси и указывает цель (исходный сервер), а затем прокси пересылает запрос на исходный сервер. исходный сервер и отправляет его на исходный сервер, а полученный контент возвращается клиенту.
прямой проксиЭто для нас, то есть для клиента.Клиент может получить доступ к ресурсам сервера, к которым он не может получить доступ сам по форвард прокси.
прямой проксиОн прозрачен для нас и непрозрачен для сервера, то есть сервер не знает, получает ли он доступ с прокси или с реального клиента.
обратный прокси
**Обратный прокси** (Reverse Proxy) означает, что прокси-сервер принимает запросы на подключение в Интернете, затем перенаправляет запрос на сервер во внутренней сети и возвращает результат, полученный от сервера, на запрос подключения в Интернете. В это время прокси-сервер ведет себя как обратный прокси-сервер для внешнего мира.
обратный проксиОн предназначен для сервера, а обратный прокси-сервер может помочь серверу получать запросы от клиента, помогать серверу выполнять переадресацию запросов, балансировку нагрузки и т. д.
обратный проксиОно прозрачно для сервера и непрозрачно для нас, то есть мы не знаем, что обращаемся к прокси-серверу, а сервер знает, что его обслуживает обратный прокси.
базовая конфигурация
Структура конфигурации
Ниже приведена базовая структура файла конфигурации nginx:
events {
}
http
{
server
{
location path
{
...
}
location path
{
...
}
}
server
{
...
}
}
-
main
: глобальная конфигурация nginx, которая действует глобально. -
events
: конфигурация влияет на сервер nginx или сетевое подключение к пользователю. -
http
: Вы можете вкладывать несколько серверов, настраивать прокси, кэши, определения журналов и другие функции и конфигурации сторонних модулей. -
server
: Настройте соответствующие параметры виртуального хоста.В одном http может быть несколько серверов. -
location
: настроить маршрутизацию запросов и обработку различных страниц. -
upstream
: Настройте конкретный адрес внутреннего сервера, что является неотъемлемой частью конфигурации балансировки нагрузки.
встроенная переменная
Нижеnginx
Некоторые встроенные глобальные переменные обычно используются в конфигурации, вы можете использовать их в любом месте конфигурации.
имя переменной | Функция |
---|---|
$host |
в запросеHost , если запрос неHost строка, она равна заданному имени сервера |
$request_method |
тип запроса клиента, напримерGET ,POST
|
$remote_addr |
клиентаIP адрес |
$args |
параметры в запросе |
$content_length |
в заголовке запросаContent-length поле |
$http_user_agent |
Информация об агенте клиента |
$http_cookie |
Информация о файлах cookie клиента |
$remote_port |
клиентский порт |
$server_protocol |
Протокол, используемый запросом, напримерHTTP/1.0 , HTTP/1.1` |
$server_addr |
адрес сервера |
$server_name |
псевдоним сервера |
$server_port |
номер порта сервера |
разрешать междоменные
Давайте сначала проследим источник, что именно происходит в разных доменах.
Определение перекрестного домена
Политика того же источника ограничивает взаимодействие документов или сценариев, загруженных из одного источника, с ресурсами из другого источника. Это важный механизм безопасности для изоляции потенциально вредоносных файлов. Операции чтения между разными источниками обычно не допускаются.
Определение гомологии
Две страницы имеют один и тот же источник, если их протокол, порт (если указан) и доменное имя совпадают.
Принцип решения междоменных задач nginx
Например:
- Доменное имя внешнего сервера:
fe.server.com
- Доменное имя серверной службы:
dev.server.com
я сейчас вfe.server.com
правильноdev.server.com
Инициирование запроса обязательно будет междоменным.
Теперь нам просто нужно запустить сервер nginx, который будетserver_name
Установить какfe.server.com
, а затем установите соответствующее расположение для перехвата внешних запросов, требующих междоменного доступа, и, наконец, обратного прокси-запроса.dev.server.com
. Например, следующая конфигурация:
server {
listen 80;
server_name fe.server.com;
location / {
proxy_pass dev.server.com;
}
}
Это прекрасно обходит политику браузера с одинаковым происхождением:fe.server.com
доступnginx
изfe.server.com
относится к доступу того же происхождения, в то время какnginx
Запросы, пересылаемые на сервер, не активируют политику браузера с тем же источником.
фильтрация запросов
Фильтровать по коду состояния
error_page 500 501 502 503 504 506 /50x.html;
location = /50x.html {
#将跟路径改编为存放html的路径。
root /root/static/html;
}
Отфильтруйте по имени URL, точно сопоставьте URL-адрес и перенаправьте все несопоставленные URL-адреса на домашнюю страницу.
location / {
rewrite ^.*$ /index.html redirect;
}
Фильтр по типу запроса.
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
return 403;
}
настроить gzip
GZIP
Является одним из трех указанных стандартных форматов сжатия HTTP. В настоящее время большинство веб-сайтов используютGZIP
коробка передачHTML
,CSS
,JavaScript
и другие файлы ресурсов.
Для текстовых файлов,GZip
Эффект очень очевиден, после открытия желаемой скорости потока до простой передачи1/4 ~ 1/3
.
Не каждый браузер поддерживаетgzip
, как узнать, поддерживает ли клиентgzip
Ну и в шапке запросаAccept-Encoding
для определения поддержки сжатия.
включитьgzip
Требуется поддержка как клиента, так и сервера, если клиент поддерживаетgzip
, то до тех пор, пока сервер может вернутьgzip
файл для включенияgzip
, мы можем пройтиnginx
конфигурация, позволяющая серверу поддерживатьgzip
. последующийrespone
серединаcontent-encoding:gzip
, что означает, что сервер включенgzip
компрессионный метод.
gzip on;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_min_length 1000;
gzip_types text/csv text/xml text/css text/plain text/javascript application/javascript application/x-javascript application/json application/xml;
gzip
- включено или выключено
gzip
модуль - По умолчанию
off
- Настраивается как
on / off
gzip_http_version
- включить
GZip
нужныйHTTP
Минимальная версия - По умолчанию
HTTP/1.1
Вот почему версия по умолчанию не1.0
Шерстяная ткань?
HTTP
действующий TCP
Помимо соединения, есть еще и естественный TCP
То же трехстороннее рукопожатие, медленный старт и другие возможности.
При включенных постоянных соединениях сервер отправляет ответ наTCP
Соединение остается открытым. Последующие запросы и ответы между одной и той же парой клиент/сервер могут быть отправлены через это соединение.
Чтобы максимально улучшитьHTTP
Производительность, использование постоянных соединений особенно важно.
HTTP/1.1
Поддержка по умолчаниюTCP
постоянное соединение,HTTP/1.0
Также можно явно указатьConnection: keep-alive
для включения постоянных соединений. заTCP
при постоянном соединении HTTP
сообщение, клиенту нужен механизм для точного определения конечного положения, а вHTTP/1.0
, этот механизм только Content-Length
. пока вHTTP/1.1
добавлено вTransfer-Encoding: chunked
Соответствующий блочный передаточный механизм отлично может решить такие задачи.
nginx
Та же конфигурацияchunked的
Атрибутыchunked_transfer_encoding
, это свойство включено по умолчанию.
Nginx
включенGZip
В случае, не будет ждать файлGZip
Завершите, а затем верните ответ и вместо этого ответьте при сжатии, что может значительно улучшитьTTFB
(Time To First Byte
, время первого байта, важный показатель для оптимизации производительности WEB). Единственная проблема с этим,Nginx
Начиная возвращать ответ, он не может знать, насколько большим будет файл, который будет передан, т.е. он не может датьContent-Length
Этот заголовок ответа.
Итак, вHTTP1.0
при использованииNginx
включеноGZip
, не доступенContent-Length
, что привело к открытию постоянных ссылок в HTTP 1.0 и использованиюGZip
Есть только один выбор, так что вот онgzip_http_version
По умолчанию установлено значение1.1
.
gzip_comp_level
- Уровень сжатия: чем выше уровень, тем больше степень сжатия и, конечно, больше время сжатия (быстрее передача, но больше потребление ЦП).
- По умолчанию
1
- Значение уровня сжатия
1-9
gzip_min_length
- Устанавливает минимальное количество байтов на странице, которое разрешено сжимать,
Content-Length
Запросы меньше этого значения не будут сжаты. - По умолчанию:
0
- Когда заданное значение мало, длина сжатого файла может быть больше, чем исходный файл, рекомендуется установить
1000
над
gzip_types
- Тип файла, который нужно сжать с помощью gzip (
MIME
Типы) - По умолчанию:
text/html
(без сжатия по умолчаниюjs
/css
)
Балансировка нагрузки
Что такое балансировка нагрузки
Как показано на рисунке выше, впереди много служебных окон, а внизу есть много пользователей, которым нужны службы.Нам нужен инструмент или стратегия, которые помогут нам выделить столько пользователей для каждого окна, чтобы добиться полного использования ресурсов и меньшего количества очередей. , время.
Думайте о переднем окне службы как о нашем внутреннем сервере, а люди за терминалом — о бесчисленных клиентах, делающих запросы. Балансировка нагрузки используется, чтобы помочь нам разумно распределить многочисленные клиентские запросы на каждый сервер, чтобы добиться полного использования ресурсов сервера и сократить время обработки запросов.
Как nginx реализует балансировку нагрузки
Upstream указывает список адресов внутренних серверов.
upstream balanceServer {
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
Перехватите запрос ответа на сервере и перенаправьте запрос на список серверов, настроенный в Upstream.
server {
server_name fe.server.com;
listen 80;
location /api {
proxy_pass http://balanceServer;
}
}
Вышеуказанная конфигурация указывает только список серверов, которые nginx должен пересылать, и не определяет стратегию распределения.
nginx реализует стратегию балансировки нагрузки
стратегия голосования
Стратегия, принятая по умолчанию, назначает серверу все опросы клиентских запросов. Эта стратегия может работать нормально, но если один из серверов находится под слишком большой нагрузкой и возникает задержка, это повлияет на всех пользователей, назначенных этому серверу.
upstream balanceServer {
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
Политика минимального количества подключений
Приоритизация запросов к менее загруженным серверам уравновешивает длину каждой очереди и позволяет избежать добавления дополнительных запросов к загруженным серверам.
upstream balanceServer {
least_conn;
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
Политика максимального времени отклика
При использовании NGINX Plus приоритет отдается серверу с наименьшим временем отклика.
upstream balanceServer {
fair;
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
привязка ip клиента
Для запросов с одного ip всегда выделяется только один сервер, что эффективно решает проблему разделения сессий в динамических веб-страницах.
upstream balanceServer {
ip_hash;
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
сервер статических ресурсов
location ~* \.(png|gif|jpg|jpeg)$ {
root /root/static/;
autoindex on;
access_log off;
expires 10h;# 设置过期时间为10小时
}
совпадает сpng|gif|jpg|jpeg
для завершения запроса и перенаправьте запрос на локальный путь,root
Путь, указанный в, является локальным путем nginx. В то же время вы также можете выполнить некоторые настройки кэша.
резюме
Функции nginx очень мощные, и еще многое предстоит изучить.Некоторые из приведенных выше конфигураций являются реальными приложениями конфигурации компании (упрощенной).Если у вас есть какие-либо комментарии или предложения, оставьте сообщение ниже...
Если вы хотите прочитать больше качественных статей или вам нужен исходный файл ментальной карты в статье, вы можете подписаться на меня.блог на гитхабе, добро пожаловать звезда✨.
Рекомендую обратить внимание на мой публичный аккаунт WeChat [code secret garden], будем общаться и расти вместе.