Nginx
Эта статья знакомит с установкой Nginx, прокси, балансировкой нагрузки, регулярной настройкой локации, динамическим и статическим разделением, кэшированием, сжатием, защитой от пиявки, междоменной обработкой.
1. Определение:
Nginx — это HTTP и обратный прокси-сервер, почтовый прокси-сервер и общий прокси-сервер TCP/UDP.
2. Введение
-
Nginx — это высокопроизводительный веб-сервер и обратный прокси-сервер со многими очень полезными функциями:
-
В качестве веб-сервера: по сравнению с Apache, Nginx использует меньше ресурсов, поддерживает больше одновременных подключений и демонстрирует более высокую эффективность, что делает Nginx особенно популярным среди провайдеров веб-хостинга. Возможность поддержки ответов до 50 000 одновременных подключений благодаря Nginx за выбор epoll и kqueue в качестве нашей модели разработки.
-
В качестве сервера балансировки нагрузки: Nginx либо напрямую поддерживает Rails и PHP внутри, либо может поддерживать HTTP-прокси-сервер во внешней службе. Nginx написан на C, независимо от системы или эффективности потребления ресурсов процессора намного лучше, чем Perlbal.
-
В качестве почтового прокси-сервера: Nginx также является очень хорошим почтовым прокси-сервером (одна из первых целей разработки этого продукта была также в качестве почтового прокси-сервера), Last.fm описывает успешный и замечательный опыт его использования.
-
Установка Nginx очень проста, файл конфигурации очень лаконичен (он также может поддерживать синтаксис Perl), сервер с очень небольшим количеством ошибок: Nginx очень легко запустить, и он может работать почти 7 часов в сутки без перерывов, даже если он работает в течение несколько месяцев, его не нужно перезапускать при запуске. Вы также можете выполнять обновления версий программного обеспечения без прерывания обслуживания.
3. Установка
Установка Windows:
-
Скачать Nginxnginx.org/download/это…
-
Дважды щелкните, чтобы запустить программу nginx
Установка линукс:
В Linux есть два способа установки:
- Скомпилируйте и установите
- ням установить
установка ням[Yum] только для centOs7:
- Источник Nginx, если он не установлен, исходники Nginx необходимо установить.
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[1] Yum устанавливает Nginx
yum install nginx
[2] Команда Nginx для запуска службы Nginx
nginx
[3] Путь nginx следующий
(1) Nginx配置路径:/etc/nginx/
(2) PID目录:/var/run/nginx.pid
(3) 错误日志:/var/log/nginx/error.log
(4) 访问日志:/var/log/nginx/access.log
(5) 默认站点目录:/usr/share/nginx/html
Скомпилируйте и установите:
- Скачать Nginx
wget http://nginx.org/download/nginx-1.15.12.tar.gz
- Плагин, который нужно скомпилировать
Gcc: yum install gcc c++ (для компиляции кода c, c++)
Pcre: yum install -y pcre pcre-devel (библиотека регулярных выражений, написанная на языке c))
Zlib: yum install -y zlib zlib-devel (библиотека для сжатия данных))
OpenSSL: yum install -y openssl openssl-devel (библиотека шифрования уровня защищенных сокетов))
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
- Скомпилируйте Nginx
tar -zxvf nginx-1.15.tar.gz
cd nginx-1.15
./configure
make
make install
- Начать nginx.
cd /usr/local/nginx/
cd sbin/
./nginx
3. Актерское мастерство
Прямой прокси: прямой прокси-сервер — это пользователь.
Обратный прокси: прокси-сервер направления — это сервер
4. Подготовка
Мы хотим продемонстрировать, что для соответствующей конфигурации Nginx требуется 3 сервера, на которых используется Tomcat. Для того, чтобы мы могли различать локальный Ip, мы прописываем index.jsp в каждом Tomcat. Запустите Tomcat, и появятся следующие эффекты.
Мы случайным образом выбираем один из них и модифицируем nginx.conf внутри
# http://10.18.3.197/ 代理
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://127.0.0.1:8080;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Затем прокси данные порта 8080
Далее используем родной виндовс от Host hijacking
进入 C:\Windows\System32\drivers\etc 这个文件
修改 hosts 文件
在里面添加 10.18.3.197 test.com
Наш браузерный доступ показан на рисунке:
Мы подготовили среду и связанные с ней конфигурации, поэтому давайте рассмотрим некоторые конфигурации Nginx.
5. конфигурация местоположения
location = /uri точное совпадение
местонахождение ^~ /uri соответствует префиксу
location ~ /uri
Расположение / общие совпадения
Например:
1 location = /
2 location = /index
3 location ^~ /article/
4 location ^~ /article/files/
5 location ~ .(gif|png|js|css)$
6 location /
http://10.18.3.197/
http://10.18.3.197/index ->2
http://10.18.3.197/article/files/1.txt ->4
http://10.18.3.197/mic.png ->5
6. Использование плагинов Nginx
# 使用编译安装的时候插件的安装按时
./configure --prefix=/安装目录 --add-module = /第三方模块的目录 <br/>
./configure --prefix=/data/program/nginx --with-http_stub_status_module --withhttp_random_index_module
cp objs/nginx $nginx_home/sbin/nginx
Например
Установить http_stub_status_module
# 查看nginx的状态
location /status {
stub_status;
}
Active: подключения: текущее состояние, количество подключений в активном состоянии
accepts: общая статистика, общее количество принятых клиентских запросов
обработано: общее количество статистики, общее количество клиентских запросов, которые были обработаны
Запросы: Количество статистики, общее количество запросов от клиента
Чтение: текущее состояние, количество подключений, которые читают заголовок сообщения запроса клиента.
Запись: Текущее состояние, количество подключений в процессе отправки ответного сообщения клиенту
Ожидание: текущее состояние, количество простаивающих подключений, ожидающих запроса от клиента.
7. Балансировка нагрузки Nginx
1. Опрос
Каждый запрос распределяется по разным внутренним серверам один за другим в хронологическом порядке.Если внутренний сервер выходит из строя, он может быть автоматически устранен.
# 负载均衡默认的轮询算法
upstream webserver {
server 10.18.14.59:8080;
server 10.18.14.109:8080;
server 10.18.3.197:8080;
}
server {
...
location / {
# proxy_pass http://127.0.0.1:8080;
proxy_pass http://webserver;
}
}
...
}
При каждом обновлении адреса в браузере для обучения ротации получается IP нового сервера.
Если мы отключим один из серверов, а затем посетим его, мы обнаружим, что доступ к отключенному серверу невозможен. Если мы снова перезапустим отключенный сервер и обновим IP-адрес браузера, мы обнаружим, что можем снова сбалансировать нагрузку на этот сервер.
2. Взвешивание опроса
# 负载均轮询加权算法
upstream webserver {
server 10.18.14.59:8080 weight=2;
server 10.18.14.109:8080 weight=3;
server 10.18.3.197:8080 weight=5;
}
Количество запросов, обрабатываемых каждым сервером, пропорционально весу. То есть чем больше вес, тем больше количество обрабатываемых запросов.
3. ip_hash
Если клиент получил доступ к серверу, когда пользователь снова будет доступен, запрос будет автоматически помещен на сервер с помощью алгоритма хеширования. Каждый запрос назначается результатами HASH Accession, так что каждый посетитель фиксируется на внутреннем сервере. Мы отправляем нам каждое обновление, которое не было назначено другим машинам, но всегда на одной машине, если время простоя переназначено, оно не изменяется.
# 负载均衡ip_hash算法
upstream webserver {
ip_hash; #保证每个访客固定访问一个后端服务器
server 10.18.14.59:8080;
server 10.18.14.109:8080;
server 10.18.3.197:8080;
}
В-четвертых, наименьшее_conn минимальное количество подключений
Перенаправлять запросы на внутренние серверы с меньшим количеством подключений. Алгоритм циклического перебора заключается в том, чтобы пересылать запросы к каждому бэкэнду одинаково, чтобы их нагрузка была примерно одинаковой; однако некоторые запросы выполняются долго, что приводит к высокой нагрузке на бэкэнд, на котором они расположены. В этом случае метод наименьший_конн может добиться лучшего эффекта балансировки нагрузки.
# 负载均衡最小连接数算法
upstream webserver {
least_conn; #把请求转发给连接数较少的后端服务器
server 10.18.14.59:8080;
server 10.18.14.109:8080;
server 10.18.3.197:8080;
}
Эта стратегия балансировки нагрузки подходит для ситуаций, когда сервер перегружен из-за разного времени обработки запросов.
5. У Fair самое короткое время отклика
Запросы распределяются в соответствии со временем ответа на стороне сервера, и приоритет отдается тем, у которых время ответа меньше.
# 负载均衡响应时间最短算法
upstream webserver {
server 10.18.14.59:8080;
server 10.18.14.109:8080;
server 10.18.3.197:8080;
fair; #实现响应时间短的优先分配
}
6. URL_HASH.
Выделите запросы в соответствии с хеш-результатом доступа к URL-адресу, так что каждый URL направлен на тот же бэкэндский сервер, который должен использоваться в сочетании с хитами кеша. Несколько запросов на тот же ресурс могут прийти на разные серверы, что привело к ненужным нескольким загрузочным, низким уровнем удара кэша и отходы некоторого времени ресурса. Используя URL_HASH, тот же URL (то есть тот же запрос ресурса) может достигать одного и того же сервера. После того, как ресурс кэшируется, а затем получен запрос, его можно прочитать из кэша.
# 负载均衡url_hash算法
upstream webserver {
hash $request_uri; #实现每个url定向到同一个后端服务器
server 10.18.14.59:8080;
server 10.18.14.109:8080;
server 10.18.3.197:8080;
}
8. Сопутствующая информация о конфигурации
- proxy_next_upstream
proxy_next_upstream
Синтаксис: proxy_next_upstream [ошибка | тайм-аут | неверный_заголовок | http_500 | http_502 | http_503 | http_504 | http_404 | off];
По умолчанию: время ожидания ошибки proxy_next_upstream;
Блоки конфигурации: http, server, location
Эта конфигурация означает, что при возникновении ошибки при пересылке запроса на существующий сервер продолжите переход на другой сервер для обработки запроса. По умолчанию, как только вышестоящий сервер начинает отправлять данные ответа, обратный прокси-сервер Nginx немедленно пересылает ответный пакет клиенту. Следовательно, Как только Nginx начинает отправлять ответные пакеты клиенту, если в середине возникает ошибка, он не может переключиться на следующий, где сервер продолжает обработку. цель сделать это Ключевым моментом является обеспечение того, чтобы клиент получал ответы только от одного и того же вышестоящего сервера.
- proxy_connect_timeout
proxy_connect_timeout
Синтаксис: proxy_connect_timeout time;
По умолчанию: Proxy_Connect_Timeout 60s;
Блоки конфигурации: http, server, location
Используется для установки таймаута соединения между nginx и вышестоящим сервером, например, мы устанавливаем proxy_connect_timeout прямо в локации 1мс, 1мс очень мало, если соединение не может быть установлено за указанное время, будет сообщено об ошибке.
- proxy_send_timeout
Тайм-аут для записи данных на бэкэнд.Если интервал времени между двумя операциями записи больше этого значения, то есть бэкенд не получил данные по истечении указанного времени. Самовывоз закрыт
- proxy_read_timeout
Тайм-аут чтения данных с бэкенда, если интервал времени между двумя операциями чтения больше этого значения, связь между nginx и бэкендом будет закрыта. Время обработки запроса относительно велико, вы можете увеличить это значение.
-
proxy_upstream_fail
-
proxy_upstream_fail_timeout
После настройки вышестоящего бэкенда на отказ указанное количество раз (max_fails) он не будет запрашиваться в течение времени fail_timeout, по умолчанию это 10 секунд. Адрес сервера синтаксиса [fail_timeout=30s]
upstream backend { #服务器集群名字
server 192.168.218.129:8080 weight=1 max_fails=2 fail_timeout=600s;
server 192.168.218.131:8080 weight=1 max_fails=2 fail_timeout=600s;
}
9. Решайте междоменные проблемы
Что такое междоменный домен? Если протокол, имя домена, порт и имя поддомена двух узлов различаются, выполняемые операции являются междоменными, и браузер запрашивает контрольные вопросы. Проблема заключается в ограничении междоменного доступа, поэтому междоменный доступ на самом деле является ограничением самого браузера.
location / {
proxy_pass http://webserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout http_500 http_503;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
add_header 'Access-Control-Allow-Origin' '*'; // #允许来自所有的访问地址
add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS'; //支持的请求方式
add_header 'Access-Control-Allow-Header' 'Content-Type,*'; //支持的媒体类型
}
10. Динамическое и статическое разделение
Тех, кто должен зависеть от сервера, чтобы выжить, называют динамизмом. Те, которым не нужно полагаться на контейнеры, такие как css/js или изображения, называются статическими.
静态资源类型
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
В каталоге conf Nginx естьmime.types
Пользователь файла посещает веб-сайт, а затем получает соответствующие ресурсы с сервера, анализирует и отображает их через браузер и, наконец, отображает их пользователю, и сервер может возвращать различные типы контента, такие как xml, jpg, png , gif, flash, MP4, html , css и т. д., то браузер решает, в какой форме отображать ресурс, возвращаемый сервером, на основе mime-типа. Когда ресурс, возвращаемый сервером, передается браузеру, он информировать браузер о типе мультимедиа. Уведомленный идентификатор — Content-Type, например ContentType :text/html.
location ~ .*\.(js|css|png|svg|ico|jpg) {
root /.(路径)./static-resource; # 指定访问的目录
}
Например:
Настраиваем на перехват статических ресурсов, а затем удаляем статические ресурсы в нативном коте, и получаем следующее:
Поместите статические ресурсы tomcat, которые мы удалили, в соответствующую папку.
Преимущества статического и динамического разделения
Во-первых, Nginx сам по себе является высокопроизводительным статическим веб-сервером;
Во-вторых, на самом деле особенность статических файлов в том, что они в принципе мало изменяются, поэтому после разделения статических и динамических мы можем кэшировать или сжимать статические файлы. Сжатие повышает производительность сайта. Сейчас популярнее разделять фронт и бэкенд, что может сильно снизить нагрузку на сервер
12. Конфигурация кэша
Когда клиент запрашивает веб-сервер, запрошенный контент может быть получен из нескольких мест: сервер, кэш браузера или сервера кеша. Это зависит от вывода информации о странице с помощью сервера. Кэш браузера сохраняет файл на стороне клиента. Хорошая стратегия кэширования может уменьшить занимательную пропускную способность кэширования, улучшить скорость доступа, улучшить пользовательский опыт и уменьшить нагрузку на сервер. Конфигурация кэша Nginx
Конфигурация кеша Nginx
Nginx может установить кеш через истечение срока действия, Например, мы можем кэшировать изображения, потому что такая информация, как изображения, в основном не изменится. Набор истекает в местоположении
格式: expires 30s|m|h|d
location ~ .*\.(jpg|jpeg|gif|bmp|png|js|css|ico) {
root static;
expires 1d; # 设置过期时间为1天
}
13. Сжатие
Наш веб-сайт обязательно будет содержать много статических файлов, таких как картинки, скрипты, стили и т. д., и эти css/js сами по себе могут быть относительно большими, то в Передача по сети будет медленнее, что приведет к увеличению скорости рендеринга веб-сайта. Поэтому Nginx предоставляет метод оптимизации сжатия Gzip, который может Файл в конце сжимается и передается.Преимущество сжатия заключается в том, что оно может уменьшить размер файла и повысить эффективность передачи.
информация о конфигурации
Gzip on|off Включить ли сжатие gzip
Gzip_buffers 4 16k #Установить размер памяти, запрошенный gzip Функция состоит в том, чтобы подать заявку на пространство памяти, кратное указанному размеру. 4 16к представляют по исходным данным Размер в 4 раза превышает выделенную память в единицах 16 КБ.
GZIP_COMP_LEVEL [1-9] Уровень сжатия, тем выше уровень, тем меньше сжатие, но он займет ресурсы ЦП
Gzip_disable #Обычный соответствующий UA указывает, какой браузер не выполняет gzip
Gzip_min_length #Минимальная длина для начала сжатия (без сжатия, если она меньше), вы можете указать единицу измерения, например 1k
Gzip_http_version 1.0|1.1 Указывает версию протокола http для начала сжатия.
Gzip_proxied (Включите эту опцию, когда nginx является внешним прокси, что означает, что независимо от того, какая информация возвращается заголовками внутреннего сервера, она будет включена безоговорочно. сжатие)
Gzip_type text/pliain,application/xml сжимает эти типы файлов (conf/mime.conf)
GZIP_VARY ON | OFF GZIP сжатие идентифицирует ли передача; включить заголовок ответа «VARY: ACCY-encoding»; использовать прокси-сервер, а некоторую поддержку браузера Удерживание сжатия, некоторые не поддерживают, поэтому избегайте отходов также не поддерживают сжатие, поэтому главный судья в соответствии с клиентом HTTP, необходимость сжатия
http {
gzip on;
gzip_min_length 5k;
gzip_comp_level 3;
gzip_types application/javascript image/jpeg image/svg+xml;
gzip_buffers 4 32k;
gzip_vary on;
}
14. Противоугонная цепочка
В протоколе http, если вы переходите с одной веб-страницы на другую, в поле заголовка http будет Referer. Сервер изображений выполняет защиту от пиявки, определяя, исходит ли реферер из указанного доменного имени.
Синтаксис: действительные_рефереры нет | заблокированные | имена_серверов | строка ...;
По умолчанию: -
контекст: сервер, местоположение
Когда заголовок запроса «Referer» имеет указанное значение, встроенная переменная $invalid_referer устанавливается в пустую строку, в противном случае эта переменная будет установлена в «1». найти совпадение Он не чувствителен к регистру, где none означает, что заголовок запроса реферера отсутствует, а Blocked означает, что заголовок запроса существует, но его значение обслуживается брандмауэром или прокси-сервером. Удаление сервера, server_names указывает, что заголовок запроса реферера содержит указанное имя виртуального хоста
配置如下
server {
...
server_name test.com;
...
location ~ .*\.(gif|jpg|ico|png|css|svg|js) {
valid_referers none blocked test.com 10.18.3.197;
if ($invalid_referer) {
return 404;
}
root static;
}
...
}
Обратите внимание, что довольно легко подделать действительный заголовок «Referer», поэтому предполагаемая цель этого модуля состоит не в том, чтобы напрямую блокировать эти незаконные запросы, а в том, заключается в том, чтобы блокировать такие крупномасштабные запросы, сделанные обычными браузерами. Также важно отметить, что даже законные запросы, отправленные обычными браузерами, могут не Имеется заголовок запроса «Referer».
Так же есть множество конфигураций и кряков антиворовой цепочки, которые я здесь описывать не буду, потому что нет стопроцентной безопасности страницы, то есть фронтенда.
Ниже приведены статьи об антиличе nginx и защите и взломе антилича.Блог Woohoo.cn на.com/Li Meng951/Afraid…
блог woo woo woo.cn на.com/saysno/afraid/86…
В этой рассказывается о том, как запретить использовать F12 для просмотра исходного кода и щелкать правой кнопкой мыши для просмотра элементов.
Woohoo.3lian.com/quota/2013/10…
Но они все равно не могут просмотреть исходный код.Если я открою режим F12 перед входом на ваш сайт, как вы можете его защитить? Таким образом, нет абсолютной безопасности и конфиденциальности для внешнего интерфейса.