1. Введение
Наш настоящий сервер не должен быть напрямую открыт для общедоступной сети, в противном случае он с большей вероятностью приведет к утечке информации о сервере и будет более уязвим для атак. Более «гражданским» решением является использованиеNginxОбратный прокси это. Давайте поговорим об использовании этого сегодняNginxНекоторые возможности обратного прокси,NginxПрокси могут помочь нам достичь многих очень эффективныхAPIфункция контроля. Это также объясняет, почему я всегда рекомендую использоватьNginxпредставлять насSpring Bootзаявление.
2. Какие возможности может предоставить Nginx
NginxЕго не нужно слишком много хвалить, он получил широкое признание в отрасли. Давайте поговорим о том, что он может сделать.
2.1 Возможности агентства
Это наиболее часто используемая функция для серверной части, общедоступной сети.NginxСервер может прокси-сервер к реальному серверу, с которым он может общаться в интрасети. Пусть наш сервер не будет напрямую подвержен внешнему миру и повысит его антирисковую способность.
еслиNginxсервер192.168.1.8могут быть подключены к одному и тому же сегменту интрасети192.168.1.9обмениваться данными с сервером приложений во времяNginxСервер имеет возможность работы в общедоступной сети и привязывает общедоступную сеть к доменному имени.felord.cnначальство. тогда мыNginxСоответствующая конфигурация агента (nginx.conf) такова, что:
server {
listen 80;
server_name felord.cn;
# ^~ 表示uri以某个常规字符串开头,如果匹配到,则不继续往下匹配。不是正则匹配
location ^~ /api/v1 {
proxy_set_header Host $host;
proxy_pass http://192.168.1.9:8080/;
}
}
После приведенной выше конфигурации реальный адрес интерфейса нашего сервера будетhttp://192.168.1.9:8080/foo/getты можешь пройтиhttp://felord.cn/api/v1/foo/getдоступ.
proxy_passЕсли с
/В конце он эквивалентен абсолютному корневому пути, тогдаNginxНетlocationИдет часть пути, совпадающая в прокси, если она не начинается с/В конце совпадающая часть пути также проксируется.
2.2 Функция перезаписи
Nginxтакже обеспечиваетrewriteфункция позволяет нам переписать, когда запрос поступает на серверURI, чем-то похож наServlet Filterозначает, что по запросу выполняется некоторая предварительная обработка.
существует2.1В примере, если мы хотим реализовать, если запрос сужденияPOSTзатем вернуться405, просто измените конфигурацию на:
location ^~ /api/v1 {
proxy_set_header Host $host;
if ($request_method = POST){
return 405;
}
proxy_pass http://192.168.1.9:8080/;
}
ты можешь использоватьNginxПредоставлены глобальные переменные (как в конфигурации выше$request_method) или переменная, заданная вами как условие, в сочетании с регулярными выражениями и флагами (last,break,redirect,permanent)выполнитьURIПереписать и перенаправить.
2.3 Настройка HTTPS
Раньше многие студенты спрашивали в группе, какSpring Bootконфигурация в проектеHTTPS, я рекомендую использоватьNginxсделать это.NginxСравниватьSpring BootСредняя конфигурацияSSLЭто гораздо удобнее и не влияет на наше локальное развитие.NginxсерединаHTTPSСоответствующую конфигурацию можно использовать в соответствии со следующими изменениями:
http{
#http节点中可以添加多个server节点
server{
#ssl 需要监听443端口
listen 443;
# CA证书对应的域名
server_name felord.cn;
# 开启ssl
ssl on;
# 服务器证书绝对路径
ssl_certificate /etc/ssl/cert_felord.cn.crt;
# 服务器端证书key绝对路径
ssl_certificate_key /etc/ssl/cert_felord.cn.key;
ssl_session_timeout 5m;
# 协议类型
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl算法列表
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 是否 服务器决定使用哪种算法 on/off TLSv1.1 的话需要开启
ssl_prefer_server_ciphers on;
location ^~ /api/v1 {
proxy_set_header Host $host;
proxy_pass http://192.168.1.9:8080/;
}
}
# 如果用户通过 http 访问 直接重写 跳转到 https 这个是一个很有必要的操作
server{
listen 80;
server_name felord.cn;
rewrite ^/(.*)$ https://felord.cn:443/$1 permanent;
}
}
используется здесьrewriteдля улучшения пользовательского опыта.
2.4 Балансировка нагрузки
Как правило, проекты растут от малого к большому.Достаточно развернуть сервер при запуске.Если у вас больше пользователей в вашем проекте, в первую очередь поздравляю, это означает, что ваш проект движется в правильном направлении. Тем не менее, существует также нагрузка на сервер.Вы не должны хотеть различных потерь, вызванных простоем сервера.Вам необходимо быстро повысить устойчивость сервера к давлению или вы хотите поддерживать непрерывное техническое обслуживание, чтобы избежать прерывания бизнеса.Это можно сделать черезNginxБалансировка нагрузки реализована, и очень просто. еслиfelord.cnМы развернули три узла:
Простейшая стратегия опроса
Эта конфигурация является самой простой для отправки запросов по очереди:
http {
upstream app {
# 节点1
server 192.168.1.9:8080;
# 节点2
server 192.168.1.10:8081;
# 节点3
server 192.168.1.11:8082;
}
server {
listen 80;
server_name felord.cn;
# ^~ 表示uri以某个常规字符串开头,如果匹配到,则不继续往下匹配。不是正则匹配
location ^~ /api/v1 {
proxy_set_header Host $host;
# 负载均衡
proxy_pass http://app/;
}
}
}
Взвешенная круговая стратегия
указать вероятность опроса,weightОн пропорционален коэффициенту доступа и используется при неравномерной производительности внутреннего сервера:
upstream app {
# 节点1
server 192.168.1.9:8080 weight = 6;
# 节点2
server 192.168.1.10:8081 weight = 3;
# 节点3
server 192.168.1.11:8082 weight = 1;
}
Окончательное количество обработанных запросов будет разделено 6:3:1. На самом деле простой опрос можно увидеть, так как все веса делятся на 1. Время простоя опроса может быть автоматически устранено.
IP HASH
По IP доступаHash, чтобы у каждого клиента был фиксированный доступ к серверу, а если сервер упал, его нужно удалить вручную.
upstream app {
ip_hash;
# 节点1
server 192.168.1.9:8080 weight = 6;
# 节点2
server 192.168.1.10:8081 weight = 3;
# 节点3
server 192.168.1.11:8082 weight = 1;
}
наименее подключенный
Запросы будут перенаправляться на серверы с меньшим количеством подключений, что позволит полностью использовать ресурсы сервера:
upstream app {
least_conn;
# 节点1
server 192.168.1.9:8080 weight = 6;
# 节点2
server 192.168.1.10:8081 weight = 3;
# 节点3
server 192.168.1.11:8082 weight = 1;
}
другой путь
Мы можем использовать некоторые плагины для достижения балансировки нагрузки в других режимах, таких какnginx-upsync-moduleРеализовать динамическую балансировку нагрузки. Можем ли мы использовать это для разработки функции публикации в оттенках серого?
2.5 Ограничение тока
через паруNginxконфигурации мы можем реализовать алгоритм дырявого ведра и алгоритм ведра с токеном, а также ограничить скорость доступа, ограничив количество запросов в единицу времени и количество подключений одновременно. Я не изучал этот вопрос подробно, поэтому я упомяну его здесь.Вы можете проверить соответствующую информацию и исследования.
3. Резюме
NginxОчень мощный, рекомендуется использовать его для проксирования наших серверных приложений, мы можем реализовать множество полезных функций с помощью конфигурации, без необходимости выполнять какое-либо кодирование, не связанное с бизнес-логикой, если вы находитесь вSpring BootРеализуйте ограничение тока и конфигурацию вSSLЕсли это так, пожалуйста, не говорите об этом, это также повлияет на местное развитие, используйтеNginxПозволяет нам сосредоточиться на бизнесе. Можно сказатьNginxЗдесь он выступает в роли небольшого шлюза, фактически нижний слой многих известных шлюзов — этоNginx,НапримерKong,Orange,Apache APISIXподождите, если вам интересно, вы можете игратьNginxрасширенная формаOpenresty. А еще у меня есть очень хорошийNginxВам даются ознакомительные материалы, можете обратить внимание на:Код Фермер Маленький Толстый БратОтвечатьnginxПолучать.
关注公众号:Felordcn获取更多资讯
Личный блог: https://felord.cn