От принципа к реальному бою, досконально изучите Nginx (Advanced)

Nginx

Экземпляр конфигурации

пойматьОт принципа к реальному бою, досконально изучите Nginx, эта статья представляет собой продвинутую практическую работу с Nginx. Путем настройки конфигурационного файла Nginx реализуются 6 функций прямого прокси, обратного прокси, балансировки нагрузки, кеша Nginx, динамического и статического разделения и высокой доступности Nginx, а также анализируется принцип работы Nginx. Когда вам нужно использовать конфигурационный файл Nginx, вы можете обратиться к примеру в этой статье, его рекомендуется собрать.

1. Прокси вперед

  Прокси-объектом прямого прокси-сервера является клиент. Прямой прокси — это прокси-сервер для доступа к целевому серверу от имени клиента.

1.1 Фактический боевой

Осознайте эффект:
   введите в браузереwww.google.com, браузер переходит кwww.google.com.
Конкретная конфигурация:

server{
    resolver 8.8.8.8;
    listen 80;

    location / {
        proxy_pass http://$http_host$request_uri;
    }
}

Выполните одну из следующих операций на клиенте, которому требуется доступ к внешней сети:

1. 方法1(推荐)
export http_proxy=http://你的正向代理服务器地址:代理端口   

2. 方法2
vim ~/.bashrc
export http_proxy=http://你的正向代理服务器地址:代理端口   

2. Обратный прокси

  Обратный прокси-сервер относится к промежуточному серверу, который действует как внутренний прокси-сервер для ответа на запросы клиентов, а прокси-объект — это сервер.

2.1 Фактический боевой

Осознайте эффект:
   введите в браузереwww.abc.com, Перейти с сервера nginx на главную страницу tomcat системы linux.
Конкретная конфигурация:

    server {
        listen       80;   
        server_name  192.168.4.32;   #监听地址
   
        location  / {       
           root html;  #/html目录
           proxy_pass http://127.0.0.1:8080;  #请求转向
           index  index.html index.htm;      #设置默认页       
        } 
    }

2.2 Фактический бой II

Осознайте эффект:
   В соответствии с разными путями, введенными в браузере, переходить к службам разных портов.
Конкретная конфигурация:

    server {
        listen       9000;   
        server_name  192.168.4.32;   #监听地址       
        
        location  ~ /example1/ {  
           proxy_pass http://127.0.0.1:5000;         
        } 

        location  ~ /example2/ {  
           proxy_pass http://127.0.0.1:8080;         
        } 
    }

locationОписание инструкции:

  • ~ :Указывает, что uri содержит регулярное выражение и учитывает регистр.
  • ~* :Указывает, что uri содержит регулярное выражение и не чувствителен к регистру.
  • = :Указывает, что uri не содержит регулярных выражений и требует строгого соответствия.

3 Балансировка нагрузки

3.1 Фактический боевой

Осознайте эффект:
   введите в адресной строке браузераhttp://192.168.4.32/example/a.html, в среднем до 5000 и 8080 портов для достижения эффекта балансировки нагрузки.
Конкретная конфигурация:

    upstream myserver {   
      server 192.167.4.32:5000;
      server 192.168.4.32:8080;
    }
    

    server {
        listen       80;   #监听端口
        server_name  192.168.4.32;   #监听地址
   
        location  / {       
           root html;  #html目录
           index index.html index.htm;  #设置默认页
           proxy_pass  http://myserver;  #请求转向 myserver 定义的服务器列表      
        } 
    }

Политика сервера размещения nginx

  • голосование(дефолт)
       распределяются по одному в соответствии с хронологическим порядком запроса, если сервер выходит из строя, он может быть автоматически устранен.

  • Веса
    Чем выше вес   , тем больше клиентов выделено, по умолчанию 1. Например:

          upstream myserver {   
            server 192.167.4.32:5000 weight=10;
            server 192.168.4.32:8080 weight=5;
          }
    
  • ip
       выделяется в соответствии с хеш-значением ip запроса, и каждый посетитель имеет фиксированный доступ к внутреннему серверу. Например:

          upstream myserver { 
            ip_hash;  
            server 192.167.4.32:5000;
            server 192.168.4.32:8080;
          }
    
  • fair
       распределяется в соответствии со временем отклика внутреннего сервера, и запрос с наименьшим временем отклика будет выделен первым. Например:

          upstream myserver { 
            fair;  
            server 192.168.4.32:5000;
            server 192.168.4.32:8080;
          }
    

4. Кэш Nginx

4.1 Фактический бой 1

Осознайте эффект:
   В течение 3 дней доступ через адресную строку браузераhttp://192.168.4.32/a.jpg, ресурс не будет захвачен с сервера, а будет повторно загружен с сервера через 3 дня (истечение).
Конкретная конфигурация:

# http 区域下添加缓存区配置
proxy_cache_path /tmp/nginx_proxy_cache levels=1 keys_zone=cache_one:512m inactive=60s max_size=1000m;

# server 区域下添加缓存配置
location ~ \.(gif|jpg|png|htm|html|css|js)(.*) {
     proxy_pass http://192.168.4.32:5000;#如果没有缓存则转向请求
     proxy_redirect off;
     proxy_cache cache_one;
     proxy_cache_valid 200 1h;            #对不同的 HTTP 状态码设置不同的缓存时间
     proxy_cache_valid 500 1d;
     proxy_cache_valid any 1m;
     expires 3d;
}

expiresЭто установка времени истечения срока действия ресурса.Установив параметр expires, браузер может кэшировать содержимое до истечения срока действия, уменьшая запросы и трафик с сервером. То есть нет необходимости идти на сервер для проверки, и вы можете напрямую подтвердить, истек ли срок его действия, через сам браузер, поэтому дополнительный трафик не будет генерироваться. Этот подход идеален для ресурсов, которые изменяются нечасто.

5. Динамическое и статическое разделение

5.1 Фактический бой 1

Осознайте эффект:
   Доступ через адресную строку браузераwww.abc.com/a.html, чтобы получить доступ к содержимому статических ресурсов сервера статических ресурсов. Доступ через адресную строку браузераwww.abc.com/a.jsp, чтобы получить доступ к содержимому динамических ресурсов сервера динамических ресурсов.
Конкретная конфигурация:

upstream static {   
    server 192.167.4.31:80;
}

upstream dynamic {   
    server 192.167.4.32:8080;
}

server {
    listen       80;   #监听端口
    server_name  www.abc.com; 监听地址

    # 拦截动态资源
    location ~ .*\.(php|jsp)$ {
       proxy_pass http://dynamic;
    }
   
    # 拦截静态资源
    location ~ .*\.(jpg|png|htm|html|css|js)$ {       
       root /data/;  #html目录
       proxy_pass http://static;
       autoindex on;;  #自动打开文件列表
    }  
}

6. Высокая доступность

В нормальных условиях доступ к фоновому целевому сервисному кластеру осуществляется через основной сервер nginx. Когда основной сервер зависает, он автоматически переключается на резервный сервер. В это время резервный сервер действует как основной сервер и обращается к резервному серверу. конечный целевой сервер.

6.1 Фактический бой 1

Осознайте эффект:
   Подготовьте два сервера nginx, получите доступ к виртуальному IP-адресу через адресную строку браузера, остановите nginx основного сервера и снова получите доступ к виртуальному IP-адресу.
Конкретная конфигурация:
(1) Установите keepalived на два сервера nginx.
  keepalived эквивалентен маршруту, он использует скрипт для определения того, жив ли текущий сервер, если он еще жив, продолжить доступ, в противном случае переключиться на другой резервный сервер.

# 安装 keepalived
yum install keepalived -y

# 检查版本
rpm -q -a keepalived
keepalived-1.3.5-16.el7.x86_64

(2) Измените файл конфигурации /etc/keepalived/keepalivec.conf активного и резервного серверов (которые можно заменить напрямую), чтобы завершить настройку высокой доступности ведущий-ведомый.
  keepalived привязывает сервер nginx к виртуальному ip, а кластер высокой доступности nginx выставляет этот виртуальный ip во внешний мир, клиенты получают доступ к серверу nginx, обращаясь к этому виртуальному ip.

global_defs {
    notification_email {
        acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from_Alexandre.Cassen@firewall.loc
    smtp_server 192.168.4.32
    smtp_connect_timeout 30
    router_id LVS_DEVEL  # 在 /etc/hosts 文件中配置,通过它能访问到我们的主机
}

vrrp_script_chk_http_port {   
    script "/usr/local/src/nginx_check.sh"

    interval 2      # 检测脚本执行的时间间隔

    weight 2        # 权重每次加2
}

vrrp_instance VI_1 {
    interface ens7f0 # 网卡,需根据情况修改
    state MASTER    # 备份服务器上将 MASTER 改为 BACKUP
    virtual_router_id 51 # 主备机的 virtual_router_id 必须相同
    priority 100   # 主备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1  # 每隔多长时间(默认1s)发送一次心跳,检测服务器是否还活着
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100 # VRRP H 虚拟地址,可以绑定多个
    }
}

Поле Описание

  • router_id: настроен в файле /etc/hosts, через который мы можем получить доступ к нашему хосту.

      127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
      ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
      127.0.0.1   LVS_DEVEL   
    
  • interval: установите интервал времени для выполнения скрипта

  • вес: когда скрипт не выполняется, то есть зависает keepalived или nginx, значение веса увеличивается (может быть отрицательным).

  • интерфейс: входifconfigКоманда, чтобы узнать, какое имя текущей сетевой карты.

      ens7f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 192.168.4.32  netmask 255.255.252.0  broadcast 192.168.7.255
              inet6 fe80::e273:9c3c:e675:7c60  prefixlen 64  scopeid 0x20<link>
              ... ...
    

(3) Добавьте скрипт обнаружения nginx_check.sh в каталог /usr/local/src.

#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ ps -C nginx -no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

(4) Запустите nginx и продолжайте поддерживать активность на двух серверах.

# 启动 nginx
./nginx

# 启动 keepalived
systemctl start keepalived.service

(5) Просмотр виртуального IP-адресаip a. Остановите основной сервер 192.168.4.32 nginx и keepalived, а затем посетите виртуальный IP-адрес, чтобы увидеть эффект высокой доступности.

6. Принципиальный анализ

После запуска   Nginx в системе Linux есть два процесса, один из которых является ведущим, а другой — рабочим. Как администратор, мастер не участвует ни в какой работе, а отвечает только за назначение различных задач нескольким работникам (обычно их несколько).

ps -ef |grep nginx
root     20473     1  0  2019 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     4628 20473  0 Jan06 ?        00:00:00 nginx: worker process
nginx     4629 20473  0 Jan06 ?        00:00:00 nginx: worker process

Как работают рабочие?
   Когда клиент отправляет запрос, он должен сначала пройти через мастер.После получения запроса администратор уведомит worker о запросе.карабкатьсяWorker, который получает задачу, будет пересылать запрос, использовать обратный прокси, обращаться к базе данных и т. д. через tomcat и т. д. (сам nginx напрямую не поддерживает java).

Преимущества одного мастера и нескольких рабочих?

  • можно использоватьnginx -s reloadВыполните горячее развертывание.
  • Каждый воркер является независимым процессом.Если возникает проблема с одним из воркеров, другие воркеры будут работать независимо и будут продолжать конкурировать за задачи для реализации процесса запроса клиента, не вызывая прерывания службы.

Сколько рабочих уместно установить?
Подобно Redis, Nginx использует механизм мультиплексирования ввода-вывода. Каждый рабочий процесс является независимым процессом. В каждом процессе есть только один основной поток. Запросы обрабатываются асинхронно и без блокировки. Поток каждого рабочего процесса может максимизировать производительность. процессора, следовательно,Наиболее целесообразно, чтобы количество рабочих и количество ЦП сервера были равны.

считать:
(1) Сколько подключений воркера будет занято отправкой запроса?
(2) Есть мастер и 4 рабочих, и максимальное количество подключений, поддерживаемых каждым рабочим, равно 1024. Какое максимальное количество одновременных подключений поддерживает система?

Поздравляем! На данный момент вы освоили методы настройки 6 функций Nginx и далее обсудите со мной принципы работы Nginx. Мыслительные вопросы, которые могут быть заданы в последних двух интервью, приветствуются для активного обсуждения в области комментариев. Если эта статья была вам полезна, ставьте лайки и подбадривайте друг друга~