предисловие
Часто ли вы, фронтенд-разработчик, сталкиваетесь с руководителями, которые просят вас перейти на сервер для внесения изменений?Nginx
конфигурации, но вы будете увиливать от этого по причине «я передний край, я не буду этого делать»! Давайте сегодня попрощаемся с этим смущением и двинемся вперед к «настоящему» программисту! ! !
Если эта статья была вам полезна, нажмите 👍 👍 👍!
Обзор Nginx
Nginx
Открытый исходный код, высокая производительность, высокая надежностьWeb
И обратный прокси-сервер, и поддерживает горячее развертывание, почти 7*24 часа бесперебойной работы, даже если он работает несколько месяцев, его не нужно перезагружать, а версия ПО может быть обновлена в горячем режиме при условии бесперебойного обслуживания. производительностьNginx
Наиболее важным соображением является то, что он занимает меньше памяти, обладает мощными возможностями параллелизма и может поддерживать до 5 Вт одновременных подключений.Nginx
Это бесплатно и может быть коммерциализировано, а настройка и использование относительно просты.
Возможности Nginx
- Высокий параллелизм и высокая производительность;
- Модульная архитектура делает ее очень масштабируемой;
- Асинхронная неблокирующая модель, управляемая событиями, это и
Node.js
сходство; - По сравнению с другими серверами он может работать несколько месяцев или даже дольше без перезапуска сервера, что делает его очень надежным;
- Горячее развертывание и плавное обновление;
- Полностью открытый исходный код, экологическое процветание;
Роль Nginx
Наиболее важные сценарии использования Nginx:
- Служба статических ресурсов, предоставляющая услуги через локальную файловую систему;
- Служба обратного прокси, которая включает кэширование, балансировку нагрузки и т. д.;
-
API
Служить,OpenResty
;
Для передней частиNode.js
не чужой,Nginx
иNode.js
Многие идеи похожи,HTTP
серверные, управляемые событиями, асинхронные неблокирующие и т. д., а такжеNginx
Большинство функций используютNode.js
также может быть достигнуто, ноNginx
иNode.js
Конфликта нет, у всех свои области знаний.Nginx
Хорошо справляется с обработкой базовых ресурсов на стороне сервера (переадресация обработки статических ресурсов, обратный прокси-сервер, балансировка нагрузки и т. д.),Node.js
Он лучше обрабатывает конкретную бизнес-логику верхнего уровня, и их можно идеально комбинировать.
Используйте схему для представления:
Установка Nginx
Эта статья демонстрирует, чтоLinux
centOS 7.x
устанавливается на операционную системуNginx
, что касается установки на другие операционные системы, то можете поискать в сети самостоятельно, это очень просто.
использоватьyum
УстановитьNginx
:
yum install nginx -y
После завершения установки пройдитеrpm -ql nginx
вид командыNginx
Информация по установке для:
# Nginx配置文件
/etc/nginx/nginx.conf # nginx 主配置文件
/etc/nginx/nginx.conf.default
# 可执行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# nginx库文件
/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程
/usr/lib64/nginx/modules # Nginx模块目录
# 帮助文档
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 静态资源目录
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放Nginx日志文件
/var/log/nginx
Есть две папки, представляющие наибольший интерес:
-
/etc/nginx/conf.d/
место хранения элементов подконфигурации,/etc/nginx/nginx.conf
Основной файл конфигурации по умолчанию импортирует все элементы вложенной конфигурации в эту папку; -
/usr/share/nginx/html/
Статические файлы помещаются в эту папку, а также могут быть размещены в других местах в соответствии с вашими привычками;
Общие команды Nginx
systemctl
Системная команда:
# 开机配置
systemctl enable nginx # 开机自动启动
systemctl disable nginx # 关闭开机自动启动
# 启动Nginx
systemctl start nginx # 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认页面
# 停止Nginx
systemctl stop nginx
# 重启Nginx
systemctl restart nginx
# 重新加载Nginx
systemctl reload nginx
# 查看 Nginx 运行状态
systemctl status nginx
# 查看Nginx进程
ps -ef | grep nginx
# 杀死Nginx进程
kill -9 pid # 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程
Nginx
Команда приложения:
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen # 重启 Nginx
nginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看当前 Nginx 最终的配置
nginx -t # 检查配置是否有问题
Конфигурация ядра Nginx
Структура файла конфигурации
Nginx
Типичный пример конфигурации для:
# main段配置信息
user nginx; # 运行用户,默认即是nginx,可以不进行设置
worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
# events段配置信息
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 每个进程允许最大并发数
}
# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
# 设置日志模式
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; # Nginx访问日志存放位置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /etc/nginx/conf.d/*.conf; # 加载子配置项
# server段配置信息
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
-
main
Глобальная конфигурация, действующая глобально; -
events
Влияние конфигурацииNginx
сетевое соединение между сервером и пользователем; -
http
Настройка большинства функций, таких как прокси, кэш, определение журнала и настройка сторонних модулей; -
server
Настройте соответствующие параметры виртуального хоста,http
В блоке может быть больше одногоserver
кусок; -
location
для согласования конфигурацииuri
; -
upstream
Настройте конкретный адрес внутреннего сервера, что является неотъемлемой частью конфигурации балансировки нагрузки;
Используйте диаграмму, чтобы четко показать его иерархию:
Основные параметры основного раздела конфигурационного файла
user
указано для запускаNginx
изwoker
Владелец и группа дочернего процесса, где группу можно не указывать.
user USERNAME [GROUP]
user nginx lion; # 用户是nginx;组是lion
pid
указано для запускаNginx
master
основной процессpid
Путь хранения файла.
pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件
worker_rlimit_nofile_number
уточнитьworker
Максимальное количество файловых дескрипторов, которые может открыть дочерний процесс.
worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。
worker_rlimit_core
уточнитьworker
После аварийного завершения дочернего процессаcore
файл для документирования проблем анализа.
worker_rlimit_core 50M; # 存放大小限制
working_directory /opt/nginx/tmp; # 存放目录
worker_processes_number
уточнитьNginx
активированworker
Количество дочерних процессов.
worker_processes 4; # 指定具体子进程数量
worker_processes auto; # 与当前cpu物理核心数一致
worker_cpu_affinity
положить каждыйworker
дочерний процесс и нашcpu
Физическая привязка ядра.
worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程
положить каждыйworker
дочерний процесс и конкретныйCPU
Физическая привязка ядра, преимущество состоит в том, чтобы избежать того жеworker
дочерний процесс в другомCPU
Включите ядро, инвалидация кеша, снизьте производительность. Но на самом деле это не позволяет избежать переключения процессов.
worker_priority
уточнитьworker
дочерний процессnice
значение для регулировки пробегаNginx
Приоритет , обычно устанавливается на отрицательное значение, чтобы отдать приоритет вызову.Nginx
.
worker_priority -10; # 120-10=110,110就是最终的优先级
Linux
Значение приоритета процесса по умолчанию равно 120, чем меньше значение, тем выше приоритет;nice
Диапазон-20
прибыть+19
.
[Примечание] Значение приоритета приложения по умолчанию — 120 плюс.nice
Значение равно его конечному значению, чем меньше значение, тем выше приоритет.
worker_shutdown_timeout
уточнитьworker
Тайм-аут, когда дочерний процесс корректно завершает работу.
worker_shutdown_timeout 5s;
timer_resolution
worker
Для точности таймера, используемого внутри дочернего процесса, чем больше интервал настройки, тем меньше системных вызовов, что способствует повышению производительности, и, наоборот, чем больше системных вызовов, тем снижается производительность.
timer_resolution 100ms;
существуетLinux
В системе, когда пользователю нужно получить таймер, ему нужно отправить запрос к ядру операционной системы, если есть запрос, то будут накладные расходы, поэтому чем больше интервал, тем меньше накладные расходы.
daemon
уточнитьNginx
Режим работы , передний план или фон, передний план используется для отладки, а фон используется для производства.
daemon off; # 默认是on,后台运行模式
Основные параметры раздела событий конфигурационного файла
use
Nginx
Какую событийную модель использовать.
use method; # 不推荐配置它,让nginx自己选择
method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections
worker
Максимальное количество одновременных подключений, которые может обработать дочерний процесс.
worker_connections 1024 # 每个子进程的最大连接数为1024
accept_mutex
Открывать ли мьютекс балансировки нагрузки.
accept_mutex on # 默认是off关闭的,这里推荐打开
директива имя_сервера
Указывает доменное имя виртуального хоста.
server_name name1 name2 name3
# 示例:
server_name www.nginx.com;
Четыре способа записи соответствия доменных имен:
- Точное совпадение:
server_name www.nginx.com
; - Левый подстановочный знак:
server_name *.nginx.com
; - Конфигурация правой стороны:
server_name www.nginx.*
; - Регулярный матч:
server_name ~^www\.nginx\.*$
;
Приоритет соответствия:Точное соответствие > Совпадение с подстановочным знаком слева > Совпадение с подстановочным знаком справа > Совпадение с регулярным выражением
server_name
Пример конфигурации:
1. Настроить локальныйDNS
Разобратьvim /etc/hosts
(macOS
система)
# 添加如下内容,其中 121.42.11.34 是阿里云服务器IP地址
121.42.11.34 www.nginx-test.com
121.42.11.34 mail.nginx-test.com
121.42.11.34 www.nginx-test.org
121.42.11.34 doc.nginx-test.com
121.42.11.34 www.nginx-test.cn
121.42.11.34 fe.nginx-test.club
[Примечание] Имя виртуального домена используется здесь для тестирования, поэтому вам необходимо настроить локальный домен.DNS
Разрешение, если вы используете доменное имя, приобретенное в облаке Alibaba, вам необходимо настроить разрешение доменного имени в облаке Alibaba.
2. Настройте облако AlibabaNginx
,vim /etc/nginx/nginx.conf
# 这里只列举了http端中的sever端配置
# 左匹配
server {
listen 80;
server_name *.nginx-test.com;
root /usr/share/nginx/html/nginx-test/left-match/;
location / {
index index.html;
}
}
# 正则匹配
server {
listen 80;
server_name ~^.*\.nginx-test\..*$;
root /usr/share/nginx/html/nginx-test/reg-match/;
location / {
index index.html;
}
}
# 右匹配
server {
listen 80;
server_name www.nginx-test.*;
root /usr/share/nginx/html/nginx-test/right-match/;
location / {
index index.html;
}
}
# 完全匹配
server {
listen 80;
server_name www.nginx-test.com;
root /usr/share/nginx/html/nginx-test/all-match/;
location / {
index index.html;
}
}
3. Анализ доступа
- при посещении
www.nginx-test.com
, все можно сопоставить, поэтому выберите «точное совпадение» с наивысшим приоритетом; - при посещении
mail.nginx-test.com
Когда будет выполнено «левое сопоставление»; - при посещении
www.nginx-test.org
Когда будет выполнено «правильное совпадение»; - при посещении
doc.nginx-test.com
Когда будет выполнено «левое сопоставление»; - при посещении
www.nginx-test.cn
Когда будет выполнено «правильное совпадение»; - при посещении
fe.nginx-test.club
, будет выполнено «обычное сопоставление»;
root
Указывает местоположение каталога статических ресурсов, которое может быть записано вhttp
,server
,location
и т.п. конфигурация.
root path
例如:
location /image {
root /opt/nginx/static;
}
当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
[Уведомление]root
будет комбинировать путь определения сURI
наложенный,alias
Затем берется только путь определения.
alias
Он также указывает местоположение каталога статических ресурсов, его можно записать только вlocation
середина.
location /image {
alias /opt/nginx/static/image/;
}
当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
[Примечание] Обязательно добавьте в конце псевдоним/
, и он может находиться только вlocation
середина.
location
Путь конфигурации.
location [ = | ~ | ~* | ^~ ] uri {
...
}
Правила соответствия:
-
=
точное совпадение; -
~
Регулярное сопоставление с учетом регистра; -
~*
Регулярное сопоставление без учета регистра; -
^~
Остановить поиск при совпадении;
Приоритет соответствия:=
> ^~
> ~
> ~*
> без символов.
Пример:
server {
listen 80;
server_name www.nginx-test.com;
# 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html
location = /match_all/ {
root /usr/share/nginx/html
index index.html
}
# 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
location ~ \.(jpeg|jpg|png|svg)$ {
root /usr/share/nginx/images;
}
# 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html
location ^~ /bbs/ {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
обратная косая черта в месте
location /test {
...
}
location /test/ {
...
}
- Без
/
при посещенииwww.nginx-test.com/test
час,Nginx
Узнайте, есть лиtest
каталог, если он естьtest
в каталогеindex.html
; если нетtest
содержание,nginx
узнаем, есть лиtest
документ. - пояс
/
при посещенииwww.nginx-test.com/test
час,Nginx
Узнайте, есть лиtest
каталог, если он естьtest
в каталогеindex.html
, если его нет, он не будет искать существованиеtest
документ.
return
Остановить обработку запроса, вернуть код ответа напрямую или перенаправить на другойURL
;воплощать в жизньreturn
После команды,location
Последующие инструкции не будут выполняться.
return code [text];
return code URL;
return URL;
例如:
location / {
return 404; # 直接返回状态码
}
location / {
return 404 "pages not found"; # 返回状态码 + 一段文本
}
location / {
return 302 /bbs ; # 返回状态码 + 重定向地址
}
location / {
return https://www.baidu.com ; # 返回重定向地址
}
rewrite
Переписать в соответствии с указанными правилами сопоставления регулярных выраженийURL
.
语法:rewrite 正则表达式 要替换的内容 [flag];
上下文:server、location、if
示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
flag
Значение необязательных значений:
-
last
переписанныйURL
Инициируйте новый запрос и введите сноваserver
сегмент, попробуйте еще разlocation
совпадения в ; -
break
Используйте переписанный напрямуюURL
, больше не соответствует другимlocation
китайское предложение; -
redirect
Возвращает 302 Временное перенаправление; -
permanent
вернуть 301 постоянный редирект;
server{
listen 80;
server_name fe.lion.club; # 要在本地hosts文件进行配置
root html;
location /search {
rewrite ^/(.*) https://www.baidu.com redirect;
}
location /images {
rewrite /images/(.*) /pics/$1;
}
location /pics {
rewrite /pics/(.*) /photos/$1;
}
location /photos {
}
}
По этой конфигурации анализируем:
- при посещении
fe.lion.club/search
, он автоматически перенаправит нас наhttps://www.baidu.com
. - при посещении
fe.lion.club/images/1.jpg
, первый шаг переписываетURL
заfe.lion.club/pics/1.jpg
,оказатьсяpics
изlocation
, продолжайте переписыватьURL
заfe.lion.club/photos/1.jpg
,оказаться/photos
изlocation
Идти заhtml/photos
Найдите в каталоге1.jpg
статические ресурсы.
если директива
语法:if (condition) {...}
上下文:server、location
示例:
if($http_user_agent ~ Chrome){
rewrite /(.*)/browser/$1 break;
}
condition
Условия анализа:
-
$variable
Только для переменных пустое значение или строка, начинающаяся с 0, будет рассматриваться какfalse
иметь дело с; -
=
или!=
равные или неравные; -
~
Регулярный матч; -
! ~
нерегулярный матч; -
~*
Регулярное сопоставление без учета регистра; -
-f
или! -f
Обнаружение наличия или отсутствия файлов; -
-d
или! -d
Обнаружение существования или отсутствия каталога; -
-e
или! -e
Обнаружение наличия или отсутствия файлов, каталогов, символических ссылок и т. д.; -
-x
или! -x
Проверить, является ли файл исполняемым или нет;
Пример:
server {
listen 8080;
server_name localhost;
root html;
location / {
if ( $uri = "/images/" ){
rewrite (.*) /pics/ break;
}
}
}
при посещенииlocalhost:8080/images/
, войдетif
Казнить по приговоруrewrite
Заказ.
autoindex
Запросы пользователей на/
В конце указана структура каталогов, которую можно использовать для быстрого создания веб-сайта для загрузки статических ресурсов.
autoindex.conf
Информация о конфигурации:
server {
listen 80;
server_name fe.lion-test.club;
location /download/ {
root /opt/source;
autoindex on; # 打开 autoindex,,可选参数有 on | off
autoindex_exact_size on; # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩
autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml
autoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间
}
}
при посещенииfe.lion.com/download/
, сервер будет/opt/source/download/
Файлы по пути отображаются, как показано на следующем рисунке:
Переменная
Nginx
Пользователю предоставляется множество переменных, но, в конце концов, это данные, сгенерированные полным процессом запроса.Nginx
Эти данные предоставляются пользователю в виде переменных.
Вот некоторые переменные, которые обычно используются в проектах:
имя переменной | значение |
---|---|
remote_addr |
клиентIP адрес |
remote_port |
клиентский порт |
server_addr |
СерверIP адрес |
server_port |
порт сервера |
server_protocol |
протокол сервера |
binary_remote_addr |
Клиент в бинарном форматеIP адрес |
connection |
TCP порядковый номер соединения, увеличивающийся |
connection_request |
TCP Текущее количество запросов на подключение |
uri |
Запрошенный URL без параметров |
request_uri |
Запрошенный URL, включая параметры |
scheme |
имя протокола,http илиhttps |
request_method |
метод запроса |
request_length |
Длина всего запроса, включая строку запроса, заголовок запроса и тело запроса. |
args |
Все строки параметров |
arg_参数名 |
Получить конкретное значение параметра |
is_args |
URL Есть ли параметры в , если да, вернуть? , иначе вернуть пустое |
query_string |
иargs такой же |
host |
в запросеHost , если запрос неHost строку, найдите ее в заголовке запроса и, наконец, используйтеnginx установить вserver_name . |
http_user_agent |
Пользовательский браузер |
http_referer |
по каким ссылкам пришел запрос |
http_via |
После каждого уровня прокси-сервера будет добавлена соответствующая информация. |
http_cookie |
получить пользователейcookie |
request_time |
Время, затраченное на обработку запроса |
https |
Он включен?https , если да, вернутьon , иначе вернуть пустое |
request_filename |
Полный путь к файлу, к которому будет осуществляться доступ в файловой системе диска. |
document_root |
Зависит отURI иroot/alias Путь к папке, сгенерированный правилом |
limit_rate |
Верхнее предельное значение скорости при возврате ответа |
Пример демонстрацииvar.conf
:
server{
listen 8081;
server_name var.lion-test.club;
root /usr/share/nginx/html;
location / {
return 200 "
remote_addr: $remote_addr
remote_port: $remote_port
server_addr: $server_addr
server_port: $server_port
server_protocol: $server_protocol
binary_remote_addr: $binary_remote_addr
connection: $connection
uri: $uri
request_uri: $request_uri
scheme: $scheme
request_method: $request_method
request_length: $request_length
args: $args
arg_pid: $arg_pid
is_args: $is_args
query_string: $query_string
host: $host
http_user_agent: $http_user_agent
http_referer: $http_referer
http_via: $http_via
request_time: $request_time
https: $https
request_filename: $request_filename
document_root: $document_root
";
}
}
когда мы посещаемhttp://var.lion-test.club:8081/test?pid=121414&cid=sadasd
, из-заNginx
написано наreturn
метод, поэтомуchrome
Браузер по умолчанию загрузит для нас файл, и содержимое загруженного файла показано ниже:
remote_addr: 27.16.220.84
remote_port: 56838
server_addr: 172.17.0.2
server_port: 8081
server_protocol: HTTP/1.1
binary_remote_addr: 茉
connection: 126
uri: /test/
request_uri: /test/?pid=121414&cid=sadasd
scheme: http
request_method: GET
request_length: 518
args: pid=121414&cid=sadasd
arg_pid: 121414
is_args: ?
query_string: pid=121414&cid=sadasd
host: var.lion-test.club
http_user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
http_referer:
http_via:
request_time: 0.000
https:
request_filename: /usr/share/nginx/html/test/
document_root: /usr/share/nginx/html
Nginx
Конфигураций по-прежнему много.Выше приведен лишь список некоторых часто используемых конфигураций.В реальных проектах вам все равно нужно научиться обращаться к документации.
Основные понятия приложения Nginx
Прокси — это гипотетический уровень сервера между сервером и клиентом, прокси будет получать запрос клиента и пересылать его на сервер, а затем пересылать ответ сервера клиенту.
Будь то прямой прокси или обратный прокси, вышеперечисленные функции реализованы.
прямой прокси
Прокси-сервер вперед, то есть сервер между клиентом и сервером-источником, чтобы получить контент с сервера-источника, клиент отправляет запрос на прокси-сервер и указывает цель (сервер-источник), а затем прокси-сервер пересылает на источник сервер Запрос и возврат полученного контента клиенту.
Форвард-прокси для нас, то есть для клиента.Клиент может получить доступ к ресурсам сервера, к которым он не может получить доступ по форвард-прокси.
Форвард-прокси прозрачен для нас и непрозрачен для сервера, то есть сервер не знает, получает ли он доступ с прокси или с реального клиента.
обратный прокси
- Обратный прокси* (Reverse Proxy) означает, что прокси-сервер принимает запросы на подключение в Интернете, затем перенаправляет запрос на сервер во внутренней сети и возвращает результат, полученный от сервера, клиенту, запрашивающему подключение в Интернете. прокси-сервер ведет себя как обратный прокси-сервер для внешнего мира.
Обратный прокси-сервер обслуживает сторону сервера.Обратный прокси-сервер может помочь серверу получать запросы от клиента, помогать серверу выполнять переадресацию запросов, балансировку нагрузки и т. д.
Обратный прокси прозрачен для сервера и непрозрачен для нас, то есть мы не знаем, что обращаемся к прокси-серверу, а сервер знает, что его обслуживает обратный прокси.
Преимущества обратного прокси:
- скрыть настоящий сервер;
- Балансировка нагрузки облегчает горизонтальное расширение внутренних динамических сервисов;
- Динамическое и статическое разделение повышает надежность системы;
Так что же такое «движение и статическое разделение»? Что такое балансировка нагрузки?
Динамическое и статическое разделение
Разделение динамических и статических средств вweb
В серверной архитектуре - метод архитектурного проектирования, который отделяет статические страницы от динамических страниц или интерфейсов статического содержимого и интерфейсов динамического содержимого для доступа из разных систем, тем самым обеспечивая доступность и ремонтопригодность всей службы.
Вообще говоря, необходимо разделить динамические ресурсы и статические ресурсы, потому чтоNginx
Такие функции, как высокий параллелизм и кэширование статических ресурсов, статические ресурсы часто развертываются вNginx
начальство. Если запрос относится к статическим ресурсам, перейдите непосредственно в каталог статических ресурсов для получения ресурсов.Если запрос относится к динамическим ресурсам, используется принцип обратного прокси-сервера для пересылки запроса соответствующему фоновому приложению для обработки, тем самым реализуя динамические и статическое разделение.
После разделения внешнего и внутреннего интерфейса скорость доступа к статическим ресурсам может быть значительно улучшена.Даже если динамические сервисы недоступны, доступ к статическим ресурсам не пострадает.
балансировки нагрузки
Как правило, клиент отправляет несколько запросов на сервер, сервер обрабатывает запросы, и некоторым из них может потребоваться работа с некоторыми ресурсами, такими как базы данных, статические ресурсы и т. д. После завершения обработки сервером результаты возвращаются клиенту. .
Для ранних систем эта модель предъявляла несложные функциональные требования и могла работать с относительно небольшим числом одновременных запросов, а стоимость также была низкой. Поскольку объем информации продолжает расти, объем доступа и данных быстро растет, а сложность системного бизнеса продолжает расти, этот подход больше не может соответствовать требованиям.Когда параллелизм особенно велик, сервер подвержен краху .
Очевидно, это проблема, вызванная узким местом в производительности сервера.Помимо машины с кучей, самое главное - это балансировка нагрузки.
В случае взрывного роста запросов производительность одной машины не может удовлетворить требованиям, какой бы сильной она ни была.В это время возникла концепция кластеризации.Для задач, которые не могут быть решены одним сервером, серверы могут быть использованы, а затем запросы могут быть распределены по каждому серверу.Нагрузка распределяется по разным серверам, что является балансировкой нагрузки, а ядром является «распределение давления».Nginx
Реализация балансировки нагрузки обычно относится к переадресации запросов на кластеры серверов.
Чтобы привести конкретный пример, когда вы едете в метро в вечерний час пик, у входа на станцию часто будет громко говорить персонал метро: «Пожалуйста, идите.B
рот,B
Население мало, вагон пустой...", роль этого персонала - балансировка нагрузки.
Nginx
Стратегии реализации балансировки нагрузки:
- Стратегия опроса: стратегия, принятая по умолчанию, назначает серверу опрос всех клиентских запросов. Эта стратегия может работать нормально, но если один из серверов находится под слишком большой нагрузкой и возникает задержка, это повлияет на всех пользователей, назначенных этому серверу.
- Политика минимального количества подключений. Отдавайте приоритет запросам менее загруженным серверам, это может сбалансировать длину каждой очереди и избежать добавления дополнительных запросов к загруженным серверам.
- Политика самого быстрого времени отклика: отдавайте приоритет серверу с самым коротким временем отклика.
- клиент
ip
Стратегия связывания: из той жеip
Запрос всегда выделяется только одному серверу, что эффективно решает проблему существования динамических веб-страниц.session
Поделитесь проблемой.
Фактическая конфигурация Nginx
Перед настройкой таких функций, как обратный прокси-сервер и балансировка нагрузки, мы должны освоить два основных модуля.Nginx
Ядрами в конфигурации приложения являются:upstream
,proxy_pass
.
upstream
Он используется для определения соответствующей информации вышестоящего сервера (со ссылкой на сервер приложений, предоставляемый в фоновом режиме).
语法:upstream name {
...
}
上下文:http
示例:
upstream back_end_server{
server 192.168.100.33:8081
}
существуетupstream
Команды, которые можно использовать в:
-
server
Определить адрес вышестоящего сервера; -
zone
Определить общую память для использованияworker
дочерний процесс; -
keepalive
Включить постоянные соединения для восходящих служб; -
keepalive_requests
Максимальное количество запросов на длительное соединениеHTTP
номер; -
keepalive_timeout
В состоянии простоя период тайм-аута длительного соединения; -
hash
Алгоритм балансировки хеш-нагрузки; -
ip_hash
в соответствии сIP
Алгоритм балансировки нагрузки для расчета хэша; -
least_conn
Алгоритм балансировки нагрузки с наименьшим количеством подключений; -
least_time
Алгоритм балансировки нагрузки с кратчайшим временем отклика; -
random
алгоритм случайной балансировки нагрузки;
server
Определите адрес вышестоящего сервера.
语法:server address [parameters]
上下文:upstream
parameters
Необязательное значение:
-
weight=number
Значение веса, по умолчанию 1; -
max_conns=number
Максимальное количество одновременных подключений к вышестоящему серверу; -
fail_timeout=time
Время, когда сервер недоступен; -
max_fails=numer
количество проверок того, что сервер недоступен; -
backup
Резервный сервер, включается только тогда, когда другие серверы недоступны; -
down
Сервер тегов долгое время недоступен и поддерживается в автономном режиме;
keepalive
ограничить каждыйworker
Максимальное количество простаивающих длинных соединений между дочерними процессами и вышестоящими серверами.
keepalive connections;
上下文:upstream
示例:keepalive 16;
keepalive_requests
Одно длинное соединение может обрабатывать большинствоHTTP
количество запросов.
语法:keepalive_requests number;
默认值:keepalive_requests 100;
上下文:upstream
keepalive_timeout
Максимальное время удержания для незанятых длинных соединений.
语法:keepalive_timeout time;
默认值:keepalive_timeout 60s;
上下文:upstream
Экземпляр конфигурации
upstream back_end{
server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
keepalive 32;
keepalive_requests 50;
keepalive_timeout 30s;
}
proxy_pass
Используется для настройки прокси-сервера.
语法:proxy_pass URL;
上下文:location、if、limit_except
示例:
proxy_pass http://127.0.0.1:8081
proxy_pass http://127.0.0.1:8081/proxy
URL
Принцип параметра
-
URL
должно бытьhttp
илиhttps
Начало; -
URL
может содержать переменные; -
URL
ли принестиURI
, напрямую повлияет на запрос, отправленный восходящемуURL
;
Давайте рассмотрим два общихURL
Использование:
-
proxy_pass http://192.168.100.33:8081
proxy_pass http://192.168.100.33:8081/
Разница между двумя вариантами использования заключается в том, что/
и без/
, они сильно отличаются при настройке прокси:
- Без
/
означаетNginx
не будет изменять пользователяURL
, но напрямую на вышестоящий сервер приложений; - пояс
/
означаетNginx
изменит пользователяURL
, метод модификации заключается вlocation
ПослеURL
от пользователяURL
Удалить;
Без/
Использование:
location /bbs/{
proxy_pass http://127.0.0.1:8080;
}
анализировать:
- Запрос пользователя
URL
:/bbs/abc/test.html
- запрос поступает
Nginx
изURL
:/bbs/abc/test.html
- Запрос поступает на вышестоящий сервер приложений
URL
:/bbs/abc/test.html
пояс/
Использование:
location /bbs/{
proxy_pass http://127.0.0.1:8080/;
}
анализировать:
- Запрос пользователя
URL
:/bbs/abc/test.html
- запрос поступает
Nginx
изURL
:/bbs/abc/test.html
- Запрос поступает на вышестоящий сервер приложений
URL
:/abc/test.html
не сращенный/bbs
, это иroot
иalias
Разница между ними постоянна.
Настроить обратный прокси
Для того, чтобы продемонстрировать ближе к реальности, автор подготовил два облачных сервера, их публичная сетьIP
Они есть:121.42.11.34
и121.5.180.193
.
мы кладем121.42.11.34
Сервер используется в качестве вышестоящего сервера и настроен следующим образом:
# /etc/nginx/conf.d/proxy.conf
server{
listen 8080;
server_name localhost;
location /proxy/ {
root /usr/share/nginx/html/proxy;
index index.html;
}
}
# /usr/share/nginx/html/proxy/index.html
<h1> 121.42.11.34 proxy html </h1>
Перезагрузка после завершения настройкиNginx
серверnginx -s reload
.
Пучок121.5.180.193
В качестве прокси-сервера сервер настроен следующим образом:
# /etc/nginx/conf.d/proxy.conf
upstream back_end {
server 121.42.11.34:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
keepalive 32;
keepalive_requests 80;
keepalive_timeout 20s;
}
server {
listen 80;
server_name proxy.lion.club;
location /proxy {
proxy_pass http://back_end/proxy;
}
}
локальная машина для доступаproxy.lion.club
доменное имя, поэтому вам нужно настроить локальныйhosts
, через команду:vim /etc/hosts
Войдите в файл конфигурации и добавьте следующее:
121.5.180.193 proxy.lion.club
анализировать:
- при посещении
proxy.lion.club/proxy
прошел, когдаupstream
конфигурация найдена121.42.11.34:8080
; - Таким образом, адрес доступа становится
http://121.42.11.34:8080/proxy
; - Подключен к
121.42.11.34
сервер, нашел8080
порт предоставляетсяserver
; - пройти через
server
оказаться/usr/share/nginx/html/proxy/index.html
ресурсы и, наконец, отображается.
Настроить балансировку нагрузки
Настройка балансировки нагрузки в основном предназначена для использованияupstream
инструкция.
мы кладем121.42.11.34
Сервер используется в качестве вышестоящего сервера и настроен следующим образом (/etc/nginx/conf.d/balance.conf
):
server{
listen 8020;
location / {
return 200 'return 8020 \n';
}
}
server{
listen 8030;
location / {
return 200 'return 8030 \n';
}
}
server{
listen 8040;
location / {
return 200 'return 8040 \n';
}
}
После завершения настройки:
-
nginx -t
Проверьте правильность конфигурации; -
nginx -s reload
перезагружатьNginx
сервер; - воплощать в жизнь
ss -nlt
Команда для проверки того, занят ли порт, чтобы судитьNginx
Правильно ли запущена служба.
Пучок121.5.180.193
В качестве прокси-сервера сервер настроен следующим образом (/etc/nginx/conf.d/balance.conf
):
upstream demo_server {
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
Перезагрузка после завершения настройкиNginx
сервер. И он настроен на клиенте, к которому нужно получить доступip
Связь сопоставления с доменным именем.
# /etc/hosts
121.5.180.193 balance.lion.club
Выполнить на клиентской машинеcurl http://balance.lion.club/balance/
Заказ:
Нетрудно заметить, что конфигурация балансировки нагрузки вступила в силу, и выдаваемые нам вышестоящие серверы каждый раз разные. Это распределение вышестоящего сервера с помощью простой стратегии опроса.
Далее узнаемNginx
другие стратегии распределения.
хеш-алгоритм
формулируя ключевые слова какhash key
, на основеhash
Алгоритмы сопоставляются с конкретными вышестоящими серверами. Ключевые слова могут содержать переменные и строки.
upstream demo_server {
hash $request_uri;
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
hash $request_uri
указать использованиеrequest_uri
переменная какhash
изkey
значение, если доступURI
Если он останется прежним, он всегда будет распространяться на один и тот же сервер.
ip_hash
По запросу клиентаip
выносить суждения, покаip
Если адрес не меняется, он всегда будет назначен одному и тому же хосту. Он может эффективно решить фоновый серверsession
сохранить проблему.
upstream demo_server {
ip_hash;
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
Алгоритм наименьших соединений
каждыйworker
Дочерний процесс получает информацию о внутреннем сервере, считывая данные из общей памяти. выбрать сервер с наименьшим количеством установленных соединений для распределения запроса.
语法:least_conn;
上下文:upstream;
Пример:
upstream demo_server {
zone test 10M; # zone可以设置共享内存空间的名字和大小
least_conn;
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
В итоге вы обнаружите, что настройка балансировки нагрузки совсем не сложна.
Настроить кеш
Кэширование может очень эффективно повысить производительность, поэтому, будь то клиент (браузер) или прокси-сервер (Nginx
), и даже вышестоящие серверы в некоторой степени участвуют в кэшировании. Видно, что кеширование очень важно в каждой ссылке. Давай учитьNginx
Как установить стратегию кэширования в .
proxy_cache
Храните некоторые ресурсы, к которым уже обращались раньше и к которым можно будет обращаться снова, чтобы пользователи могли получить их напрямую с прокси-сервера, тем самым снизив нагрузку на вышестоящий сервер и ускорив общую скорость доступа.
语法:proxy_cache zone | off ; # zone 是共享内存的名称
默认值:proxy_cache off;
上下文:http、server、location
proxy_cache_path
Установите путь хранения файлов кеша.
语法:proxy_cache_path path [level=levels] ...可选参数省略,下面会详细列举
默认值:proxy_cache_path off
上下文:http
Значение параметра:
-
path
Путь хранения файла кеша; -
level path
Уровень каталога ; -
keys_zone
установить общую память; -
inactive
Если к нему не обратиться в течение указанного времени, кеш будет очищен, по умолчанию 10 минут;
proxy_cache_key
установить кеш-файлkey
.
语法:proxy_cache_key
默认值:proxy_cache_key $scheme$proxy_host$request_uri;
上下文:http、server、location
proxy_cache_valid
Настройте, какие коды состояния можно кэшировать и как долго.
语法:proxy_cache_valid [code...] time;
上下文:http、server、location
配置示例:proxy_cache_valid 200 304 2m;; # 说明对于状态为200和304的缓存文件的缓存时间是2分钟
proxy_no_cache
Определяет соответствующие условия сохранения в кеш, если хотя бы одно значение строкового параметра не пусто и не равно "0", то ответ не будет сохранен в кеш.
语法:proxy_no_cache string;
上下文:http、server、location
示例:proxy_no_cache $http_pragma $http_authorization;
proxy_cache_bypass
Определяет условие, при котором ответ не будет извлечен из кэша.
语法:proxy_cache_bypass string;
上下文:http、server、location
示例:proxy_cache_bypass $http_pragma $http_authorization;
переменная upstream_cache_status
Он хранит информацию о том, попал ли кеш или нет, и будет установлен в информации заголовка ответа, что очень полезно при отладке.
MISS: 未命中缓存
HIT: 命中缓存
EXPIRED: 缓存过期
STALE: 命中了陈旧缓存
REVALIDDATED: Nginx验证陈旧缓存依然有效
UPDATING: 内容陈旧,但正在更新
BYPASS: X响应从原始服务器获取
Экземпляр конфигурации
мы кладем121.42.11.34
Сервер используется в качестве вышестоящего сервера и настроен следующим образом (/etc/nginx/conf.d/cache.conf
):
server {
listen 1010;
root /usr/share/nginx/html/1010;
location / {
index index.html;
}
}
server {
listen 1020;
root /usr/share/nginx/html/1020;
location / {
index index.html;
}
}
Пучок121.5.180.193
В качестве прокси-сервера сервер настроен следующим образом (/etc/nginx/conf.d/cache.conf
):
proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off;
upstream cache_server{
server 121.42.11.34:1010;
server 121.42.11.34:1020;
}
server {
listen 80;
server_name cache.lion.club;
location / {
proxy_cache cache_zone; # 设置缓存内存,上面配置中已经定义好的
proxy_cache_valid 200 5m; # 缓存状态为200的请求,缓存时长为5分钟
proxy_cache_key $request_uri; # 缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status # 把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; # 代理转发
}
}
Кэш настроен так, мы можем/etc/nginx/cache_temp
Найдите соответствующий файл кеша по пути.
Для некоторых страниц или данных с очень высокими требованиями к реальному времени не стоит устанавливать кеш.Давайте посмотрим, как настроить контент, который не кешируется.
...
server {
listen 80;
server_name cache.lion.club;
# URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
if ($request_uri ~ \.(txt|text)$) {
set $cache_name "no cache"
}
location / {
proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
proxy_cache cache_zone; # 设置缓存内存
proxy_cache_valid 200 5m; # 缓存状态为200的请求,缓存时长为5分钟
proxy_cache_key $request_uri; # 缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status # 把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; # 代理转发
}
}
HTTPS
учимся настраиватьHTTPS
Перед этим давайте кратко рассмотримHTTPS
Каков рабочий процесс? Как он зашифрован и защищен?
Рабочий процесс HTTPS
- Клиентский (браузерный) доступ
https://www.baidu.com
веб-сайт Байду; - Сервер Baidu возвращается
HTTPS
в использованииCA
сертификат; - Браузерная аутентификация
CA
Является ли сертификат юридическим сертификатом; - Если проверка пройдена, сертификат действителен, генерируется строка случайных чисел и шифруется с помощью открытого ключа (предоставляется в сертификате);
- Отправить случайное число, зашифрованное открытым ключом, на сервер Baidu;
- Сервер Baidu получает зашифрованный текст, расшифровывает его с помощью закрытого ключа и получает случайное число (шифрование с открытым ключом, дешифрование с закрытым ключом и наоборот);
- Сервер Baidu шифрует отправляемый в браузер контент случайными числами и передает его в браузер;
- В это время браузер может использовать случайное число для расшифровки и получения реального содержимого передачи сервера;
ЭтоHTTPS
Основной принцип работы использует симметричное шифрование и асимметричные секреты для обеспечения безопасности передаваемого контента.
Дополнительные сведения о HTTPS можно найти в другой статье автора «Изучение протокола HTTP»..
Настроить сертификаты
Загрузите сжатый файл сертификата, который имеетNginx
папка, положитьxxx.crt
иxxx.key
Скопируйте файл в каталог сервера и настройте его следующим образом:
server {
listen 443 ssl http2 default_server; # SSL 访问端口号为 443
server_name lion.club; # 填写绑定证书的域名(我这里是随便写的)
ssl_certificate /etc/nginx/https/lion.club_bundle.crt; # 证书地址
ssl_certificate_key /etc/nginx/https/lion.club.key; # 私钥地址
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 支持ssl协议版本,默认为后三个,主流版本是[TLSv1.2]
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
После этой конфигурации вы можете получить к ней обычный доступHTTPS
версия сайта.
Настройка междоменного CORS
Давайте кратко рассмотрим, что происходит в разных доменах.
Определение перекрестного домена
Политика того же источника ограничивает взаимодействие документов или сценариев, загруженных из одного источника, с ресурсами из другого источника. Это важный механизм безопасности для изоляции потенциально вредоносных файлов. Операции чтения между разными источниками обычно не допускаются.
Определение гомологии
Две страницы имеют один и тот же источник, если их протокол, порт (если указан) и доменное имя совпадают.
приведенный ниже совпадает с URL-адресомhttp://store.company.com/dir/page.html
Пример исходника для сравнения:
http://store.company.com/dir2/other.html 同源
https://store.company.com/secure.html 不同源,协议不同
http://store.company.com:81/dir/etc.html 不同源,端口不同
http://news.company.com/dir/other.html 不同源,主机不同
Различные источники имеют следующие ограничения:
-
Web
На уровне данных политика одного и того же источника запрещает сайтам из разных источников читать данные текущего сайта.Cookie
,IndexDB
,LocalStorage
данные. -
DOM
уровне, политика того же происхождения ограничиваетJavaScript
скрипт на текущийDOM
Операции чтения и записи объекта. - На сетевом уровне политика одного и того же источника ограничивает
XMLHttpRequest
Отправляйте данные сайта на сайты из разных источников.
Nginx решает принцип кроссдоменности
Например:
- внешний интерфейс
server
Доменное имя:fe.server.com
- Доменное имя серверной службы:
dev.server.com
я сейчас вfe.server.com
правильноdev.server.com
При оформлении запроса должен быть междоменный.
Теперь нам просто нужно начатьNginx
сервер, будетserver_name
Установить какfe.server.com
Затем установите соответствующийlocation
Чтобы перехватить внешние запросы, требующие междоменного доступа, и, наконец, проксировать запрос обратно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
Запросы, пересылаемые сервером, не запускают политику браузера с тем же источником.
Настройте, чтобы включить сжатие 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
компрессионный метод.
существует /etc/nginx/conf.d/
Создайте новый файл конфигурации в папкеgzip.conf
:
# # 默认off,是否开启gzip
gzip on;
# 要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# ---- 以上两个参数开启就可以支持Gzip压缩了 ---- #
# 默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容;
gzip_static on;
# 默认 off,nginx做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩;
gzip_proxied any;
# 用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
gzip_vary on;
# gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
gzip_comp_level 6;
# 获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得;
gzip_buffers 16 8k;
# 允许压缩的页面最小字节数,页面字节数从header头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;
# gzip_min_length 1k;
# 默认 1.1,启用 gzip 所需的 HTTP 最低版本;
gzip_http_version 1.1;
На самом деле, вы также можете использовать такие инструменты сборки интерфейса, какwebpack
,rollup
Сделайте это, когда производственный пакет сделанGzip
сжать, затем положитьNginx
На сервере это может снизить нагрузку на сервер и увеличить скорость доступа.
оNginx
Здесь изучается практическое применение, я считаю, что, освоивNginx
Базовая конфигурация и фактическая боевая конфигурация, мы можем легко справиться с любыми потребностями, которые возникнут позже. Далее давайте изучим немного глубжеNginx
архитектура.
Архитектура Nginx
Структура процесса
многопроцессная структураNginx
Схема модели процесса:
в нескольких процессахNginx
Архитектура процесса показана на рисунке ниже, и там будет родительский процесс (Master Process
), у него будет много дочерних процессов (Child Processes
).
-
Master Process
Используется для управления дочерними процессами, но сам по себе не обрабатывает запросы пользователей.- дочерний процесс
down
Если уронить, тоMaster
Процесс отправляет сообщение о том, что в данный момент он недоступен.Master
Процесс запустит новый дочерний процесс. - Файл конфигурации был изменен
Master
Процесс уведомитwork
Процесс получает новую информацию о конфигурации, что мы называем горячим развертыванием.
- дочерний процесс
- Дочерние процессы взаимодействуют через разделяемую память.
Принцип перегрузки конфигурационного файла
reload
Процесс перезагрузки файла конфигурации:
- В направлении
master
процесс отправкиHUP
Сигнал(reload
Заказ); -
master
Процесс проверяет правильность синтаксиса конфигурации; -
master
Процесс открывает прослушивающий порт; -
master
Процесс начинается заново с новым файлом конфигурацииworker
дочерний процесс; -
master
процесс до старогоworker
дочерний процесс отправитьQUIT
Сигнал; - Старый
worker
Процесс закрывает дескриптор прослушивания и закрывает процесс после обработки текущего соединения; - весь процесс
Nginx
Он всегда работает бесперебойно, реализуя плавное обновление, и пользователи не знают об этом;
Модульный механизм управления Nginx
Nginx
Внутренняя структура состоит из основных частей и ряда функциональных модулей. Это разделение должно сделать функцию каждого модуля относительно простой, легкой в разработке, а также легко расширить функцию системы.Nginx
Модули независимы друг от друга, с низкой связанностью и высокой связностью.
Суммировать
Я считаю, что благодаря изучению этой статьи вы должны ознакомиться сNginx
иметь более полное представление.
Чтобы увидеть все это здесь, просто нажмите 👍👍👍.