Учебный пакет Nginx-Package — Начало работы

Nginx

предисловие

Nginxв видеweb 服务器Небольшой объем памяти, высокий уровень расширения и простая автономная поддержка1-3w(Говорят, что одна машина может быть 10 Вт, но я не видел конкретной конфигурации машины) Характеристики одновременных ссылок широко распространены среди разработчиков.

рекомендуется вlinuxиспользовать в системеNginx, который в полной мере используетlinuxхарактеристики, соотношение производительности находится вwindowsбудет лучше.

Основное содержание этой статьи:

  • Простая конфигурация Nginx
  • Разница между корнем и псевдонимом
  • приоритет местоположения и проверка
  • Введение во встроенные переменные Nginx
  • if
  • переписать вперед
  • try_files
  • Настроить gzip
  • Введение и настройка кэша переговоров и сильного кэша

В последующих главах я буду использоватьabСтресс-тестирование для поэтапной оптимизацииNginxNginx знает принцип и понимает общую конфигурацию. Некоторые оптимизации производительности должны быть понятыlinux 内核,http,tcpЕсли вы не хотите знать о связанных вещах, вы можете записать свою собственную конфигурацию, не беспокоясь о том, почему.

Содержание этой статьи находится вnginx 1.16.1Контрольная работа,Centos 7Виртуальная машина с 4 ядрами и 8g RAM.

Установка Nginx

Этапы установки Nginx

в соответствии сЗеркало Ali CentOSнастроитьyumисточник для увеличения скорости загрузки.

Ali Epel зеркалоНастройте пакеты нашего часто используемого программного обеспечения,NginxТакже в нем.

# 运行一下命令,更新 yum 源
yum clean all
yum makecache

обновитьyumПосле информации о складе выполните следующую команду, чтобы найтиnginx

yum list | grep nginx

Установитьnginx

sudo yum install nginx

настроитьnginxботинок

sudo systemctl enable nginx

запускатьnginx

sudo systemctl start nginx

экзаменnginxстоит ли начинать

sudo systemctl status nginx

image-20200327220547818

Если вы хотите увидетьnginxКакие файлы устанавливаются пакетом, вы можете использовать

rpm -qvl nginx

image-20200327221058643

Команда Nginx

# 强制立即关闭,不建议做
nginx -s stop

# 正常关闭,会处理已经接到的请求,但不会接受新的请求
nginx -s quit

# 重新加载配置文件
nginx -s reload

#  重新打开日志文件
nginx -s reopen

# 检查配置文件是否有误
nginx -t

# 检查配置文件是否有误,会将配置文件内容打印
nginx -T

# 查看 nginx 版本
nginx -v

# 查看 nginx 版本和编译配置致残
nginx -V

Запуск системы, выключение, перезагрузка, просмотр команд nginx

sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl restart nginx
sudo systemctl stop nginx
sudo systemctl status nginx

Простая конфигурация Nginx

Введение в Nginx

развернутыйNginxиспользоватьmasterУправление процессами несколькоworkerпроцесс.masterПроцесс не обрабатывает запросы и предоставляет услуги управления, включая такие услуги, как запуск, остановка и перезагрузка файлов конфигурации, обычно в видеrootинициировано пользователем,workerПроцесс выполняет обработку запроса, которая обычно активируется учетной записью без прав администратора.workerКоличество процессов и настройки ядра процессора всегда одинаковы, что снижает стоимость переключения процессов.cpuвыключатель.

image-20200327222127446

httpКонфигурация в контексте — это то, что нам в основном нужно знать, а остальное понимание будет настроено.

Конфигурация сервера

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    server {
        listen 80 ;
        server_name _;
        root /usr/share/nginx/html;
        location / {
        }
    }
}

ServerОба настраивают службу.

listen 80Используется для настройки мониторинга80портовая служба.

rootУказывает место, где хранятся статические ресурсы.

место для сопоставления ресурсов.location / {}соответствовать всем ресурсам.

listenиserver_nameнастроить

Правила соответствия:

  • совпадать первымlistenматч-реваншserver_name
  • server_nameсоответствует заголовку запросаHost
  • Когда ни одно из совпадений не является успешным, настраиваетсяdefault_serverобработка
  • Ничего из вышеперечисленного не соответствует успешно и обрабатывается первой конфигурацией.
server {
    listen 9099 default_server;
    server_name "localhost";

    location / {
        return 200 "server_name 为 localhost";
    }
}
server {
    listen 9099;
    server_name 127.0.0.1;

    location / {
    	return 200 "server_name 为 127.0.0.1";
    }
}
server {
    listen 9099;
    server_name "localhost77";

    location / {
    	return 200 "server_name 为 localhost77";
    }
}

существуетPostmanустановить заголовки запроса вHostИмитация доступа.

http://localhost:9099 Host:127.0.0.1возвращениеserver_name 为 127.0.0.1

http://localhost:9099 Host:localhostвозвращениеserver_name 为 localhost

http://localhost:9099 Host:localhost77возвращениеserver_name 为 localhost77

http://localhost:9099 Host:localhost779возвращениеserver_name 为 localhost

добавить другую конфигурацию

server {
    listen localhost:9099 default_server;
    server_name "localhost";

    location / {
        return 200 "server_name 为 localhost:9099";
    }
}

когдаlistenдоступlocalhost:9099, возвращениеserver_name 为 localhost:9099, потому что подходит только этот.

Если вы хотите запретитьHostДоступ к заголовкам запросов.

server {
    listen      80;
    server_name "";
    # 表示 nginx 会关闭连接
    return 444; 
}

returnнастроить

returnИспользуется для определения возвращаемого кода состояния или содержимого.

вводитьreturnВ основном для лучшего описанияlocationнастроить

- инструкция
грамматика return code [text];
return code URL;
return URL ;
дефолт -
контекст сервер, местоположение, если

codeэто код состояния.textкак строка.

location /a {
    default_type application/json;
    return 200 "访问 9088/a";
}
# 重定向
location = /b {
    return 301 http://www.baidu.com;
}

locationнастроить

locationИспользуется для сопоставления ресурсов.

Чем меньше число, тем выше приоритет.

Символы правил описывать приоритет
location = /a{} Точное точное совпадение после сопоставления 1
location ^~ /a{} Сопоставление префикса после сопоставления 2
location ~ /a.*{} Обычное сопоставление, с учетом регистра, после проверки также проверит, есть ли более высокий приоритет 3
location ~* /a.* Обычное сопоставление, без учета регистра, после проверки также проверит, есть ли более высокий приоритет 4
location /a {} Также означает сопоставление префиксов, но имеет более низкий приоритет, чем обычное сопоставление./aи^~/aконфликт, ошибка 5
location / {} Все, что не совпадает успешно, будет сопоставлено и обработано здесь. 6
server {
        listen 9088 default_server;
        server_name _ ;

        location = /a {
            default_type application/json;
            return 200 "= /a,优先级第一";
        }
        location ^~ /a {
            default_type application/json;
            return 200 "^~ /a 匹配 /a 开头的路径,优先级第二";
        }

        location ~ /a\.* {
            default_type application/json;
            return 200 " /a\.* 匹配 /a...路径,优先级第三";
        }
        location ~* /a\.* {
            default_type application/json;
            return 200 "~* /a\.* 匹配 /a...路径,优先级第四";
        }
    	# /a 会和 ^~ /a 冲突
        location /a/ {
            default_type application/json;
            return 200 "/a/ 匹配 /a/...路径,优先级第五";
        }
    }

доступhttp://localhost:9088/a, и, в свою очередь, аннотируйте те, которые имеют более высокий приоритет, чтобы проверить это правило.

Существует также спец.locationиспользуется для настройки перехода к@начало

location @pass {
    
}

add_header добавляет заголовки ответа

- инструкция
грамматика add_header name value [always];
дефолт -
контекст если в http, сервер, местоположение, местоположение

Если код ответа равен 200, 201, 204, 206, 301, 302, 303, 304, 307 или 308, добавьте указанное поле в заголовок ответа.

плюсalwaysДобавьте любой код состояния.

location ~ /a\.* {
    default_type application/json;
    add_header test1 "asdfasdf" always;
    return 200 " /a\.* 匹配 /a...路径,优先级第三";
}

error_page

- инструкция
грамматика error_page code …[=[response code]] uri;
дефолт -
контекст если в http, сервер, местоположение, местоположение

Настройте код состояния ошибки для перехода на страницу.

error_page 404 /404.html; 
error_page 500 502 503 504 /50x.html;

Вышеприведенное не меняет код состояния ответа.

# 改变响应状态吗。
error_page 404 =200 /404.html;
server {
    location / {
       error_page 404 =  @ops-coffee;
    }

    location @ops-coffee {
       rewrite  .*  / permanent;
    }
}

Разница между корнем и псевдонимом

aliasПод ним понимается: замена пути, расположение с/конец, псевдоним должен заканчиваться/конец. Строго совпадают.aliasзаменятьlocationдорожка.

# /bieming/     替换  /usr/local/var/www/alias2/
# 访问 /bieming/1.jpg 去寻找 /usr/local/var/www/alias2/1.jpg
location /bieming/ {
    alias /usr/local/var/www/alias2/;
}

rootПонимается как: корневой путь плюс +locationдорожка. два или более/сжато в одно.

# 当 location 和 root 路径的最后一部分匹配时,更好的方式是使用 root
## 以下配置都可以。 
# 访问 /data2/1.jpg   去寻找  /usr/local/var/www/data2/1.jpg
location /data2/ {
    root /usr/local/var/www;
}
location /data2/ {
    root /usr/local/var/www/;
}
location /data2 {
    root /usr/local/var/www;
}
location /data2 {
    root /usr/local/var/www/;
}
location /data2/ {
    root /usr/local/var/www////;
}

встроенная переменная

Через встроенные переменные мы можем судить о заголовке запроса,query stringЭквивалентно пересылке или отказу в доступе.

$arg_nameПолучить параметры запроса

получить запросquery stringсерединаnameпараметр.

location /arg/ {
    default_type application/json;
    return 200 "$arg_q1";
}

/arg/a?q1=334Возвращаемый контент334.

$argsполучить запросquery_stringпараметр

location /arg/ {
    default_type application/json;
    return 200 "$arg_q1 _ $args";
}

доступ через браузер/arg/a?q1=3334&aa=2&bb=33Возвращаемый контент3334 _ q1=3334&aa=2&bb=33

$cookie_nameПолучить значение куки

Имя в запросе на получениеnameпеченье.

$http_nameполучить заголовки запроса

nameДля имени поля в заголовке запроса все имя заголовка запроса пишется строчными буквами, а тире-заменить на подчеркивание_

$http_user_agentполучить заголовок запросаUser-Agentполе.

$uriполучить путь запросаpath

pathпуть после порта, исключаяquery string. Оптимизированные пути, специальный перевод символов и/сжатие.

http://localhost:8888/arg/a?q1=q1canshu&bb=2323серединаpathза/arg/a

$hostполучить запросip

Сначала получите заголовок запросаHost, если его нет в заголовке запросаHostзаголовок запроса, то получаетсяurlсерединаip.

$request_uriПолучатьpathиquery string

доступhttp://localhost:8888/arg/a/?q1=q1canshu&bb=2323

$request_uriза/arg/a/?q1=q1canshu&bb=2323

$schemeполучить протокол запроса

значениеhttpилиhttps

$request_methodполучить метод запроса

Полученное значение состоит из всех букв верхнего регистра. ПОЛУЧИТЬ, ПОСТАВИТЬ, УДАЛИТЬ, ПОСТАВИТЬ и т. д.

другие переменные

- описывать
$content_length ПолучатьContent-LengthПоля заголовка запроса.
$content_type ПолучатьContent-Typeполя заголовка запроса
$https горит, если соединение работает в режиме SSL, иначе пустая строка
$is_args — если в строке запроса есть параметры, иначе пустая строка
$pid Получить текущий запросworker pid
$nginx_version Получить версию nginx

if

- инструкция
грамматика if (condition){}
дефолт -
контекст сервер, местоположение

После оценки указанного условия, если оно истинно, выполняется директива модуля, указанная в фигурных скобках, и присваивается конфигурация запросу в директиве if. Конфигурация внутри директивы if наследуется от предыдущего уровня конфигурации.

условие может быть любым из следующих:

  • имя переменной или false, если значение переменной является пустой строкой или 0

  • Используйте операторы = и != для сравнения переменных и строк.

  • Переменные сопоставляются с регулярными выражениями с помощью операторов ~ (с учетом регистра) и ~* (с учетом регистра). Регулярные выражения могут содержать$1..$9Захваты повторно используются в переменных.

  • Также доступны обратные операторы !~ и !~*. Если регулярное выражение содержит символы } или ;, все выражение должно быть заключено в одинарные или двойные кавычки.

  • Проверить наличие файла с помощью операторов -f и !-f

  • Используйте операторы -d и !-d, чтобы проверить, существует ли каталог

  • Используйте операторы -e и !-e для проверки существования файла, каталога или символической ссылки.

  • Проверить наличие исполняемого файла с помощью операторов -x и !-x

ifПробел между скобками обязателен

location = /a {
    default_type application/json;
    if ($request_uri ~* "/(a).*") {
        return 200 "正则表达式捕获的值:$1";
    }
    return 200 "= /a,优先级第一";
}

rewrite

- инструкция
грамматика rewrite regex replacement [flag];
дефолт -
контекст сервер, местоположение, если

flagДополнительные параметры:

  • last

Остановить сопоставление и отправить новый запрос на сопоставлениеlocation.

  • break

остановить сопоставление, в текущемlocationдля поиска ресурсов.

  • redirect

Временная переадресация. вернуть код состояния302.

  • permanent

Постоянный редирект. вернуть код состояния301.

назначенныйregexможет совпасть, uri будет основан наreplacementобрабатывать.

Подтвердить перерыв и последний

Следующие три изображения все существуют, но содержание отличается.

/Users/zhangpanqin/stduy_app/break2/test/1.jpg

/Users/zhangpanqin/stduy_app/last2/test/1.jpg

/Users/zhangpanqin/stduy_app/test/1.jpg

location /break2 {
    root /Users/zhangpanqin/stduy_app/break2;
    rewrite /break2/(.*) /test/$1 break;
}

location /last2 {
    root /Users/zhangpanqin/stduy_app/last2;
    rewrite /last2/(.*) /test/$1 last;
}

location /test/ {
    root /Users/zhangpanqin/stduy_app;
}

при посещении/break2/1.jpgна самом деле соответствует первомуlocation, а затем обработать в текущем контексте.

/break2/1.jpgзаменяется на/test/1.jpgразобраться, а потомrootв сочетании с указанными путями возвращает/Users/zhangpanqin/stduy_app/break2/test/1.jpgданные.

при посещении/last2/1.jpg, uri заменяется на/test/1.jpgчтобы соответствовать новому местоположению для обработки.

возвращение/Users/zhangpanqin/stduy_app/test/1.jpgСодержание.

проверятьredirectиpermanent

location /redirect2 {
    rewrite ^/redirect2 http://www.baidu.com redirect;
}

location /permanent2 {
    rewrite ^/permanent2 http://www.baidu.com permanent;
}

После того, как два успешно сопоставлены, адрес адреса браузера будет изменен. Браузер отвечает заголовкамиLocationПерейти к соответствующему адресу.

Разница между ними в том, что постоянные перенаправления (permanent), браузер сохранит запись при повторном посещенииhttp://localhost:9088/permanent2без вопросовnginxПрыгай прямо.

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

image-20200328181255172

try_files

- инструкция
грамматика try_files file … uri;
try_files file … =code;
дефолт -
контекст сервер, местоположение

Проверяет наличие файлов в указанном порядке и использует первый найденный файл для обработки запроса. Если содержимое не найдено внутри, перейдите к последнему параметруuri.文件位置为root + file.

location /try/ {
    root /usr/local/var/www/data2/data2/;
    try_files $uri $uri/ @pass2;
}
location @pass2 {
    default_type application/json ;
    return 200 "没到到页面代理的数据" ;
}

доступ/try/1.jpgчас,$uriза/try/1.jpg.

root + $uriза/usr/local/var/www/data2/data2/try/1.jpgВернуть, если найдено, и продолжить поиск, если не найдено. Ни один не соответствует внутренней переадресации на@pass2.

Если вы хотите проверить прыжок, используйте/try/testд., не используйте имя суффикса, потому что если вы используете имя суффикса, браузер вернетcontent-type, что приводит к несоответствию содержимого и синтаксического анализа, и изображение не может быть выведено.

Настроить gzip

# 开启 gzip
gzip on;

# 在响应头中增加,Vary: Accept-Encoding
gzip_vary on;

# gzip压缩级别1-9,数字越大压缩效果越好,压缩所用时间也就越长,占用CPU越高
gzip_comp_level 6;

# 申请内存时大小,如果源文件 9k,超过了 8K,那会申请 16*8K。
gzip_buffers 16 8k;

gzip_min_length 2K;
gzip_proxied any;
gzip_disable "msie6";

gzip_http_version 1.1;

# 文本(js、text、css、xml、json)压缩比较好,图片已经进行过压缩,在压缩,效果不是很明显,还浪费 cpu
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss application/rss+xml application/atom+xml image/svg+xml;

Сжатие Gzip лучше для текста, и рекомендуется сжимать только текст и тому подобное.

Настроить кеш

Чтобы уменьшить нагрузку на сервер, сэкономить пропускную способность, вы можете настроить кеш.

image-20200328185715962

memory cache: кэширует файлы ресурсов в память, кэш эффективно загружается непосредственно из памяти.

disk cache: кэширует файлы ресурсов на жесткий диск, и кэш эффективно загружается непосредственно с жесткого диска.

начать сmemory cacheнайти, не могу найти изdisk cacheНайти, снова найти, запросить сетевые ресурсы.

Кэш делится на协商缓存и强缓存.

协商缓存Каждый раз, когда вам нужно обращаться к серверу, чтобы спросить, истек ли срок действия кеша, используйте локальный кеш, если он не истек.

强缓存Будет время истечения срока действия кеша, в течение которого сервер не будет обращаться к серверу для проверки кеша, а локальный кеш будет использоваться напрямую.

настоящее времяwebpackсудя по содержимому файлаhashпроизводство аналогичноеapp.asdfa21342.jsтакой файл. На самом деле я хочу использовать сильный кеш, при обновлении сайта новая страница будет парсить и загружать разные ресурсы, тем самым уменьшать потери производительности сервера из-за проверки кеша.

Согласовать кеш

Кэши согласования:ETag/if-None-MatchиLast-Modified/if-Modify-Sinceдва вида.

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

ETag/if-None-Match

- инструкция
грамматика etag on|off;
дефолт etag on;
контекст http, сервер, местоположение

nginxСуществует свойство конфигурации etag, которое будет создано для каждого статического ресурса.EtagЗаголовок ответа, значением является содержимое файлаhash.

Когда браузер обращается к ресурсу в первый раз, возвращаемый заголовок ответа содержитEtag.

Последующий нормальный доступ (без принудительного обновления кеша) к тому же ресурсу приведет к тому, что заголовок запросаif-None-Match, значениеEtagидти сnginxПроверьте, совпадает ли оно, то же самое означает, что срок действия кеша не истек, и возвращается код состояния.304, получить прямой доступ к кешу в браузере, в противном случае вернуть ресурс из браузера с кодом состояния 200.

Last-Modified/if-Modify-Since

- инструкция
грамматика if_modified_since off|exact|before;
дефолт if_modified_since точно;
контекст http, сервер, местоположение

Указывает, как сравнивать время модификации файла с заголовками запроса.If-Modified-SinceСравнивать:

  • off

пренебрегатьIf-Modified-SinceПоля заголовка запроса (0.7.34)

  • exact

точное совпадение

  • before

Время модификации ресурса меньше или равноIf-Modified-Sinceвремя в поле заголовка запроса

Когда браузер обращается к ресурсу в первый раз, заголовок ответаLast-ModifiedВозвращает время последней модификации идентифицированного файла.

Когда браузер снова обращается к тому же ресурсу в обычном режиме (без принудительного обновления ресурса), заголовок запроса будет добавленIf-Modified-Since, которое является значением, возвращенным ранееLast-Modified.nginxПолучатьIf-Modified-SinceПосле этого согласно конфигурацииif_modified_sinceСвойство сравнивает время последнего изменения ресурса (Last-Modified) и значениеIf-Modified-SinceЕсли совпадение успешно, кеш попадает и возвращается 304; в противном случае возвращается ресурс, код состояния 200 и время кеша обновляется.

Принудительно кэшировать

Expires

Expiresдаhttp1.0Спецификация, значение которой представляет собой строку времени в формате GMT ​​для абсолютного времени. Это время представляет собой время истечения срока действия ресурса. Если он будет запрошен до этого времени, он будет прочитан из кеша. Если часовые пояса сервера и клиента не совпадают, решение будет неточным.

Cache-Control

Cache-Controlдаhttp1.1спецификация, это использование этого поляmax-ageценность оценивается. Значение представляет собой относительное время, напримерCache-Control: max-age=3600Представляет период действия ресурса 3600 секунд. В дополнение к этому полю у нас также есть следующие поля для установки:

no-cache:Нужно согласовать кеш, отправить запрос на сервер, чтобы подтвердить, использовать ли кеш.

**no-store:** использование кеша запрещено, и данные необходимо каждый раз запрашивать заново.

**public:** может кэшироваться всеми пользователями, включая конечных пользователей и промежуточные прокси-серверы, такие как CDN.

**private:** может кэшироваться только браузером конечного пользователя и не может кэшироваться серверами кэширования ретрансляции, такими как CDN.

Настроить кеш

location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|mp3|ogg|ogv|webm|htc|xml|woff)$ {
    # 关闭访问日志记录
    access_log off;
    # 强缓存,时间为一年,浏览器和 cdn 中间件可以缓存 
    add_header Cache-Control "max-age=31536000";
}

Рекомендуемая информация

nginx перевод на китайский язык