Серия статей:
- [Младший брат, ты хочешь знать о кросс-доменном] JSONP
- [Брат, ты хочешь знать о кросс-доменном] Основы CORS
- [Брат, ты хочешь узнать о междоменных ресурсах] Расширенные статьи CORS
- [Брат, ты хочешь знать о кросс-доменном] обратном прокси NGINX
- [Брат, ты хочешь знать о кросс-доменном] ServerProxy
Изначально в этой серии статей не было намерения подробно писать об обратном прокси NGINX, а почему я не хочу писать, конечно, потому что я не очень в этом разбираюсь~~
Однако недавно это блюдо заказывал большой парень, так что, конечно, его нужно подавать 😄
Что такое агент
Поскольку мы хотим поговорить об обратном прокси, мы должны сначала узнать, что такое прокси?
прямой прокси
Например, вы покупаете букет цветов и хотите признаться Сяоли, соседке-испытательнице, но боитесь быть отвергнутым другими, поэтому вы доверяете цветы Сяохуну, испытательному другу, который обычно с Сяоли. Она помогла отправить цветы Сяоли. Это простой агентский процесс. Сяохун выступает в качестве агента, чтобы помочь вам подарить цветы Сяоли. Конечно, в реальности такая ситуация не рекомендуется, потому что трудно избежать посредников, зарабатывающих разницу в цене. 😂.
В приведенном выше примере, как клиент (реквестер), вы хотите инициировать запрос к серверу (Сяо Ли), но вы активно нашли третье лицо (Сяохун) для отправки запроса на сервер в качестве агента. , о котором часто говорят, что正向代理
. Использование прямого прокси в Интернете в основном для научного доступа в Интернет. Вы хотите получить доступ к Google, но вы можете получить к нему доступ только через VPN-сервер в качестве прокси-сервера из-за брандмауэра. В настоящее время вам также следует найти надежный VPN производитель, чтобы избежать посредников, которые имеют значение 😄.
обратный прокси
Примеров обратного прокси много, например, вы один в постели и не можете спать по ночам, поэтому достаньте мобильник, зажгите экран и позвоните.10086
, China Mobile случайным образом назначит незадействованного в данный момент MM службы поддержки клиентов, вы можете пообщаться с MM службы поддержки, спросить ее, где она живет, есть ли у нее парень, ее идентификатор WeChat, номер ее мобильного телефона, созвездие, гороскоп ... . ...
В этом примере China Mobile выступает в качестве обратного прокси-сервера, вам просто нужно набрать10086
.Что касается того, будет ли он назначен ММ и какой ММ будет назначен, вы не знаете, пока он не подключен.Использование обратного прокси в Интернете в основном для достижения балансировки нагрузки.Когда вы посещаете веб-сайт, обратный proxy Сервер выберет для ответа вам свободный сервер из всех серверов текущего веб-сайта.Это используется для балансировки скорости загрузки каждого сервера.
Измените хосты, чтобы завершить привязку доменного имени
пользователи Mac напрямую выполняютvim /private/etc/hosts
Добавьте строку в конец файла hosts:
127.0.0.1 a.com
Что означает это предложение? Оно говорит нашему компьютеру получить доступa.com
Когда вам не нужно запрашивать DNS, укажите прямо на нашу локальную машину.
ps: В среде win файл hosts находится вC:\Windows\System32\drivers\etc
В папке.Если у вас нет разрешения на его изменение, сначала скопируйте файл hosts в другое место, откройте его в редакторе и добавьте последнюю строку содержимого, затем вырежьте его в исходное место и замените.
Проверка: откройте окно командной строки и выполнитеping a.com
, если доступ к IP-адресу 127.0.0.1, это означает, что наша привязка доменного имени завершена ^_^
установить нгинкс
Чтобы сделать обратный прокси NGINX, вы должны установить егоnginx, Пример среды шагов установки в этой статье небольшой партнер Mac, выиграть, вы можете Baidu, эта вещь похожа.
- Установите команду brew, выполните
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- Установите nginx, выполните
brew install nginx
- запустить nginx
nginx
, если у отчета нет разрешения, выполнитьsudo nginx
После запуска nginx открывается браузерlocalhost:8080, вы можете проверить.Появится следующий интерфейс, указывающий, что установка прошла успешно.
Предварительное изучение конфигурации nginx
После настройки доменного имени хоста оно было успешно привязано.Теперь, если мы посетимa.com
На самом деле, он получит доступ к нашему собственному компьютеру, почему бы вам не попробовать?
доступ через браузерa.com
Что это, черт подери, такое????
почему быНе удается получить доступ к этому сайтуЧто? Мы скачали и установили nginx и пока ничего не настраивали, дальше можно его немного настроить и все ОК:
- Перейдите в каталог конфигурации nginx из командной строки.
cd /usr/local/etc/nginx/servers
- Создание и редактирование файлов конфигурации
vim test.conf
, вставьте следующее в файл конфигурации
server {
# 监听80端口号
listen 80;
# 监听访问的域名
server_name a.com;
# 根据访问路径配置
location / {
# 把请求转发到 https://www.baidu.com
proxy_pass https://www.baidu.com;
}
}
- сохранить файл и выполнить
nginx -s reload
Перезапустите nginx (здесь была опечатка, спасибоStanYeДрузья предложили 😄) - Вернитесь в браузер, откройте вкладку a.com и выполните принудительное обновление.
Поздравляем, вы завершили свою первую настройку nginx.
Создайте междоменную среду
Через серию подбрасываний мы смогли передать nginx в
a.com
Вперед к Baidu.После выполнения первого шага мы создадим кросс-доменный кейс и шаг за шагом реализуем кросс-доменную конфигурацию через nginx.
Во-первых, добавьте каталог nginx во внешний и задний интерфейсы проекта, а пользователи сохранят коды внешнего и внутреннего интерфейса.Структура кода показана на рисунке ниже.
Затем напишите внешний и внутренний код:
внешний код (./fe/nginx/index.html
):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>CORS 实现跨域</title>
</head>
<body>
<h3>CORS 实现跨域</h3>
<script>
var xhr = new XMLHttpRequest()
xhr.open('GET', 'http://localhost:8888/api/getFriend')
xhr.setRequestHeader('token', 'quanquanbunengshuo')
xhr.withCredentials = true;
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText)
console.log(xhr.getAllResponseHeaders())
}
}
xhr.send()
</script>
</body>
</html>
После написания внешнего кода запустите внешний веб-контейнер.live-server ./fe/nginx
В командной строке появилось желтое предупреждение о том, что порт 8080 занят, почему это?Все, пожалуйста, задумайтесь.
Переназначаем портlive-server ./fe/nginx --port=9999
Ха-ха, поменяй команду, она все еще такая гладкая. ^_^
Внутренний код:
const http = require('http');
const PORT = 8888;
// 创建一个 http 服务
const server = http.createServer((request, response) => {
console.log(request.headers)
response.end("{name: 'quanquan', friend: 'guiling'}");
});
// 启动服务, 监听端口
server.listen(PORT, () => {
console.log('服务启动成功, 正在监听: ', PORT);
});
Запустите серверную службуnode ./be/nginx/index.js
Улучшить конфигурацию nginx
Интерфейсный и внутренний коды подготовлены, и на этом этапе мы проделаем некоторые сухие вещи.Завершим окончательную настройку.
- Сначала измените конфигурацию nginx и замените адрес Baidu на локальный интерфейсный адрес.
server {
# 监听80端口号
listen 80;
# 监听访问的域名
server_name a.com;
# 根据访问路径配置
location / {
# 把请求转发到 http://127.0.0.1:9999
proxy_pass http://127.0.0.1:9999;
}
}
- После изменения файла конфигурации nginx не забудьте выполнить
nginx -s -reload
Перезапустите nginx. - доступa.com
Появилась знакомая ошибка...
- Изменить адрес интерфейса во внешнем проекте
// 接口地址修改为当前域名下 /api 路劲下的 getFriend
xhr.open('GET', '/api/getFriend')
- Измените файл конфигурации nginx
server {
# 监听80端口号
listen 80;
# 监听访问的域名
server_name a.com;
# 根据访问路径配置
location / {
# 把请求转发到 http://127.0.0.1:9999
proxy_pass http://127.0.0.1:9999;
}
# 监听根目录下的 /api 路径
location /api/ {
# 把请求转发到 http://127.0.0.1:8888
proxy_pass http://127.0.0.1:8888;
}
}
Недавно добавленный мониторинг пути API означает пересылку запроса о внутреннем API в серверный проект (ха-ха, конечно, поэтому требуется много внутренних интерфейсов)./api
Начало). После перезапуска nginx снова обновите браузер, результат, возвращенный бэкендом, успешно выведен в консоль, и эта задача междоменного доступа выполнена.
Внимательные друзья наверняка узнали, в консоли другая ошибка, это потому что наш проект используетlive-server
Для этого инструмента требуется websocket.Мы можем решить эту проблему, добавив следующую конфигурацию.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Ошибка исчезла 😄, теперь полный файл конфигурации nginx
server {
# 监听80端口号
listen 80;
# 监听访问的域名
server_name a.com;
# 根据访问路径配置
location / {
# 把请求转发到 http://127.0.0.1:9999
proxy_pass http://127.0.0.1:9999;
# 兼容websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 监听根目录下的 /api 路径
location /api/ {
# 把请求转发到 http://127.0.0.1:8888
proxy_pass http://localhost:8888;
}
}
Внешние и внутренние кодовые адреса:github
Суммировать
До сих пор мы добились междоменного доступа к API через обратный прокси nginx, в серии статейпервый разИнтерпретация кросс-доменности такова: кросс-доменность происходит из политики одного и того же происхождения, которая представляет собой поведение браузеров для обеспечения безопасности пользователей. Используемый нами обратный прокси-сервер nginx на самом деле является своего рода «уговорами» с браузером, что делает его думаю, что он получил доступ к Это API того же домена.На самом деле, настройка пакета производится на стороне сервера.Это так же, как когда вы набираете 10086 и решаете, что назначенный вам ММ обслуживания клиентов должен быть Китай Служба поддержки клиентов Mobile MM (также может появиться служба поддержки GG 😄 ) и служба поддержки клиентов China Mobile MM — это очень безопасный объект чата, нет необходимости ограничивать его...
Превью следующего эпизода: Наконец-то я доделал последнюю строку кода. Как наиболее часто используемый обратный прокси nginx в производственной среде, он намного проще, чем я думал. Потому что он включает в себя много шагов настройки. Давайте обсудим вместе в комментарии Ожидается, что в следующем разделе речь пойдет об агентах на стороне сервера.ServerProxy
Это то, что я тоже делаюИнструмент тестирования интерфейсаТехнические решения, которые необходимо использовать, До встречи.