Как бэкенд-разработчику, сколько знаний о Nginx вам нужно знать?

Nginx

Я слышал, что поиск в WeChat для «Java Fish Aberdeen» станет сильнее!

Эта статья включена вJavaStarter, который содержит мою полную серию статей по Java, вы можете прочитать его для изучения или интервью.

(I. Обзор

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

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

(2) Начало работы с Nginx

Nginx — это высокопроизводительный веб-сервер, который может реализовывать прямой прокси, обратный прокси, балансировку нагрузки и другие функции. Например, проект, над которым я сейчас работаю, имеет 11 серверов приложений, которые представляют собой обратный прокси-сервер, созданный с помощью nginx.

Что касается прямого прокси-сервера и обратного прокси-сервера, между ними есть концептуальная разница, но нет никакой разницы в технической реализации.

прямой прокси: Прокси-сервер размещается там, где могут подключиться и клиент, и служба.Мы получаем доступ к целевой службе, обращаясь к прокси-серверу.

обратный прокси: обращаясь к прокси-серверу, прокси-сервер распределяет запросы к другим службам, что является обратным прокси.

Но технически нужно только настроить proxy_pass в локации.

2.1 Установка

Все установки здесь выполняются в среде Linux.Хотя nginx также имеет версию для Windows, я не видел ни одного проекта, который помещает nginx на сервер Windows.

Для запуска nginx требуется некоторая среда, которую необходимо установить в первую очередь:

yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel

Затем скачайте сжатый пакет nginx, версия зависит от ситуации, вот 1.14.2:

wget http://nginx.org/download/nginx-1.14.2.tar.gz

Установить по умолчанию:

./configure
make
make install

После завершения выполнения рабочий файл nginx будет установлен в /usr/local/nginx.

Проверьте успешность с помощью следующего кода:

/usr/local/nginx/sbin/nginx -V

2.2 Основные команды

#配置文件启动
./sbin/nginx -c /conf/nginx.conf

#指定nginx程序目录启动
./sbin/nginx -p /usr/local/nginx

#停止:第二种更加优雅
./sbin/nginx -s stop
./sbin/nginx -s quit

#重载配置文件
./sbin/nginx -s reload

2.3 Параметры, связанные с прокси

proxy_pass            #代理服务
proxy_redirect off;   #是否允许重定向
proxy_set_header Host $host;   #转发时传header参数
proxy_set_header X-Forwarded-For $remote_addr;  #设置请求的ip地址
proxy_connect_timeout 90;  #连接代理服务超时时间
proxy_send_timeout 90;  #请求发送最大时间
proxy_read_timeout 90;  #读取最大时间
#缓存相关
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

2.4 Настройка прокси

location /javayz/ {
    proxy_pass http://127.0.0.1:8080;
}

После настройки при доступе к /javayz он будет проксировать порт 8080 этой машины.

URL-адрес после proxy_pass плюс / также обратите внимание, если увеличение / представляет собой абсолютный корневой путь, без корневого пути является относительным, например, я посетилhttp://127.0.0.1/Java имеет /index.HTML,В соответствии с приведенной выше конфигурацией он будет перенаправлен на:HTTP://127.0.0.1:8080/Java имеет /index.HTML.Если конфигурация изменена на эту:

location /javayz/ {
    proxy_pass http://127.0.0.1:8080/;
}

Пересылаемый адрес становится:http://127.0.0.1:8080/index.html

(3) балансировка нагрузки nginx

Чаще всего nginx использует балансировку нагрузки, а балансировка нагрузки может быть достигнута через восходящий поток.

Сначала я развернул на сервере два очень простых проекта SpringBoot, один из которых возвращает 8081 при доступе к порту 8081, а другой возвращает 8082 при доступе к порту 8082.

@RestController
public class IndexController {
    @RequestMapping(value = "/",method = RequestMethod.GET)
    public String index(){
        return "8081";
    }
}

Затем настройте балансировку нагрузки nginx:

#配置集群,这段代码写在http块中
upstream backend {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}
#配置在server块中
location / {
    proxy_pass http://backend/;
}

Затем получите к нему доступ с помощью команды curl:

在这里插入图片描述

8081 и 8082 работают в режиме опроса.Если вы столкнулись с сервером с лучшей конфигурацией и надеетесь, что на этот сервер будет отправлено больше запросов, когда он находится под нагрузкой, вы можете увеличить долю различных служб:

upstream backend {
    server 127.0.0.1:8081 weight=2;
    server 127.0.0.1:8082 weight=1;
}

Выполните команду curl еще раз:

在这里插入图片描述

Соответствующие параметры восходящего потока следующие:

server 服务ip:端口
weight 权重
max_fails  最多失败连接的次数,超过就认为主机挂掉了
fail_timeout  重新连接的时间
backup  备用服务
max_conns  允许的最大连接数
slow_start  节点恢复后,等待多少秒后再加入

(4) Алгоритм балансировки нагрузки Nginx

Алгоритм балансировки нагрузки по умолчанию, используемый Nginx:опрос + вес, то есть опрос по одному согласно заданному весу. В дополнение к этому существует множество других алгоритмов балансировки нагрузки.

алгоритм ip_hash: для доступного IP-адреса он выполнит хеш-операцию и выполнит оставшуюся операцию для текущего номера приложения загрузки.Этот алгоритм может гарантировать, что один и тот же IP-адрес обращается к одному и тому же серверу приложений.

upstream backend {
    ip_hash;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

алгоритм url_hash: операция хеширования выполняется для запрошенного URL-адреса. Этот алгоритм может гарантировать, что один и тот же URL-адрес обращается к одному и тому же серверу приложений.

upstream backend {
    url_hash;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

алгоритм наименьшего_конна: Распределяйте запросы на узлы с наименьшим количеством подключений.

алгоритм наименьшего_времени: Распределите запрос на узел с самым быстрым ответом.

(5) Кэш Nginx

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

5.1 Добавьте объявление кеша в элемент http

Оператор размещается под элементом http

proxy_cache_path /www/javayz/cache levels=1:2 keys_zone=cache_javayz:500m inactive=20d max_size=1g;

#proxy_cache_path  缓存存放的路径 
#levels  缓存层级及目录的位数,1:2表示两级目录,第一级目录用1位16进制表示,第二级目录用2位16进制表示
#keys_zone 缓存区内存大小
#inactive 有效期,如果缓存有效期内未使用,则删除
#max_size 存储缓存的硬盘大小

5.2 Установите политику кэширования в местоположении

Оператор помещается в элемент местоположения

#指定缓存区,就是上面设置的key_zone
proxy_cache cache_javayz;

#缓存的key,这里用请求的全路径md5做为key
proxy_cache_key $host$uri$is_args$args;

#对不通的http状态码设置不同的缓存时间,下面的配置表示200时才进行缓存,缓存时间12小时
proxy_cache_valid 200 12h;

5.3 Доступ к сгенерированному кешу

Могут быть случаи, когда кеш не может быть сгенерирован, в это время переключите пользователя на root在这里插入图片描述

После одного посещения файл кеша создается по указанному выше пути.

5.4 Очистка кеша

Скачать модуль:

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

распаковать

tar -zxvf ngx_cache_purge-2.3.tar.gz

Настройте в каталоге установки nginx

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_cache_purge-2.3

Перекомпилировать:

make

После компиляции в каталоге установки nginx появится дополнительный каталог /objs, в котором находится файл nginx, замените этот файл на /usr/local/nginx/sbin/.

Проверьте, прошла ли установка успешно

在这里插入图片描述

После повторного запуска просто нужно посетитьhttp://ip:80/clear/ для очистки кеша

在这里插入图片描述

(6) Резюме

Если обязанности в вашей компании строго разделены, то для back-end разработки достаточно знать эти понятия nginx, чтобы понять работающий процесс всей архитектуры. Если вы занимаетесь как разработкой, так и эксплуатацией, этого недостаточно. Обучение всегда нужно продолжать двигаться вперед, увидимся в следующий раз.