node-http-proxy
— это программируемая библиотека HTTP-прокси, поддерживающая веб-сокеты. Он подходит для реализации таких компонентов, как обратные прокси и балансировщики нагрузки.
npm install http-proxy --save
Вернуться наверх
кликните сюда
Вернуться наверх
Новый прокси создается путем вызова createProxyServer
и передачи объекта options
в качестве аргумента (действительные свойства доступны здесь).
var httpProxy = require ( 'http-proxy' ) ;
var proxy = httpProxy . createProxyServer ( options ) ; // See (†)
†Если для объекта не вызывается метод Listen(..), веб-сервер не создается. См. ниже.
Объект будет возвращен четырьмя методами:
req, res, [options]
(используется для проксирования обычных HTTP(S)-запросов)req, socket, head, [options]
(используется для проксирования запросов WS(S))port
прослушивания (функция, которая для вашего удобства оборачивает объект на веб-сервере)[callback]
(функция, которая закрывает внутренний веб-сервер и прекращает прослушивание заданного порта)Затем можно проксировать запросы, вызывая эти функции
http . createServer ( function ( req , res ) {
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } ) ;
} ) ;
Ошибки можно прослушивать с помощью API Event Emitter.
proxy . on ( 'error' , function ( e ) {
...
} ) ;
или используя API обратного вызова
proxy . web ( req , res , { target : 'http://mytarget.com:8080' } , function ( e ) { ... } ) ;
Когда запрос передается через прокси, он следует за двумя разными конвейерами (доступными здесь), которые применяют преобразования как к объекту req
, так и к объекту res
. Первый конвейер (входящий) отвечает за создание и манипулирование потоком, который соединяет ваш клиент с целью. Второй конвейер (исходящий) отвечает за создание и управление потоком, который от вашей цели возвращает данные клиенту.
Вернуться наверх
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create your proxy server and set the target in the options.
//
httpProxy . createProxyServer ( { target : 'http://localhost:9000' } ) . listen ( 8000 ) ; // See (†)
//
// Create your target server
//
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . write ( 'request successfully proxied!' + 'n' + JSON . stringify ( req . headers , true , 2 ) ) ;
res . end ( ) ;
} ) . listen ( 9000 ) ;
†Вызов Listen(..) запускает создание веб-сервера. В противном случае создается только экземпляр прокси.
Вернуться наверх
В этом примере показано, как вы можете проксировать запрос, используя свой собственный HTTP-сервер, а также вы можете использовать свою собственную логику для обработки запроса.
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create a proxy server with custom application logic
//
var proxy = httpProxy . createProxyServer ( { } ) ;
//
// Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = http . createServer ( function ( req , res ) {
// You can define here your custom logic to handle the request
// and then proxy the request.
proxy . web ( req , res , { target : 'http://127.0.0.1:5050' } ) ;
} ) ;
console . log ( "listening on port 5050" )
server . listen ( 5050 ) ;
Вернуться наверх
В этом примере показано, как вы можете проксировать запрос, используя собственный HTTP-сервер, который изменяет исходящий прокси-запрос, добавляя специальный заголовок.
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create a proxy server with custom application logic
//
var proxy = httpProxy . createProxyServer ( { } ) ;
// To modify the proxy connection before data is sent, you can listen
// for the 'proxyReq' event. When the event is fired, you will receive
// the following arguments:
// (http.ClientRequest proxyReq, http.IncomingMessage req,
// http.ServerResponse res, Object options). This mechanism is useful when
// you need to modify the proxy request before the proxy connection
// is made to the target.
//
proxy . on ( 'proxyReq' , function ( proxyReq , req , res , options ) {
proxyReq . setHeader ( 'X-Special-Proxy-Header' , 'foobar' ) ;
} ) ;
var server = http . createServer ( function ( req , res ) {
// You can define here your custom logic to handle the request
// and then proxy the request.
proxy . web ( req , res , {
target : 'http://127.0.0.1:5050'
} ) ;
} ) ;
console . log ( "listening on port 5050" )
server . listen ( 5050 ) ;
Вернуться наверх
Иногда, когда вы получили документ HTML/XML с исходного сервера, вам нужно изменить его перед пересылкой.
Harmon позволяет вам делать это в потоковом режиме, чтобы свести к минимуму нагрузку на прокси.
Вернуться наверх
var http = require ( 'http' ) ,
httpProxy = require ( 'http-proxy' ) ;
//
// Create a proxy server with latency
//
var proxy = httpProxy . createProxyServer ( ) ;
//
// Create your server that makes an operation that waits a while
// and then proxies the request
//
http . createServer ( function ( req , res ) {
// This simulates an operation that takes 500ms to execute
setTimeout ( function ( ) {
proxy . web ( req , res , {
target : 'http://localhost:9008'
} ) ;
} , 500 ) ;
} ) . listen ( 8008 ) ;
//
// Create your target server
//
http . createServer ( function ( req , res ) {
res . writeHead ( 200 , { 'Content-Type' : 'text/plain' } ) ;
res . write ( 'request successfully proxied to: ' + req . url + 'n' + JSON . stringify ( req . headers , true , 2 ) ) ;
res . end ( ) ;
} ) . listen ( 9008 ) ;
Вернуться наверх
Вы можете активировать проверку безопасного SSL-сертификата для целевого соединения (избегайте самозаверяющих сертификатов), просто установите в параметрах secure: true
.
//
// Create the HTTPS proxy server in front of a HTTP server
//
httpProxy . createServer ( {
target : {
host : 'localhost' ,
port : 9009
} ,
ssl : {
key : fs . readFileSync ( 'valid-ssl-key.pem' , 'utf8' ) ,
cert : fs . readFileSync ( 'valid-ssl-cert.pem' , 'utf8' )
}
} ) . listen ( 8009 ) ;
//
// Create the proxy server listening on port 443
//
httpProxy . createServer ( {
ssl : {
key : fs . readFileSync ( 'valid-ssl-key.pem' , 'utf8' ) ,
cert : fs . readFileSync ( 'valid-ssl-cert.pem' , 'utf8' )
} ,
target : 'https://localhost:9010' ,
secure : true // Depends on your needs, could be false.
} ) . listen ( 443 ) ;
//
// Create an HTTP proxy server with an HTTPS target
//
httpProxy . createProxyServer ( {
target : {
protocol : 'https:' ,
host : 'my-domain-name' ,
port : 443 ,
pfx : fs . readFileSync ( 'path/to/certificate.p12' ) ,
passphrase : 'password' ,
} ,
changeOrigin : true ,
} ) . listen ( 8000 ) ;
Вернуться наверх
Вы можете активировать поддержку веб-сокетов для прокси-сервера, используя ws:true
в настройках.
//
// Create a proxy server for websockets
//
httpProxy . createServer ( {
target : 'ws://localhost:9014' ,
ws : true
} ) . listen ( 8014 ) ;
Также вы можете проксировать запросы веб-сокетов, просто вызвав метод ws(req, socket, head)
.
//
// Setup our server to proxy standard HTTP requests
//
var proxy = new httpProxy . createProxyServer ( {
target : {
host : 'localhost' ,
port : 9015
}
} ) ;
var proxyServer = http . createServer ( function ( req , res ) {
proxy . web ( req , res ) ;
} ) ;
//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
proxyServer . on ( 'upgrade' , function ( req , socket , head ) {
proxy . ws ( req , socket , head ) ;
} ) ;
proxyServer . listen ( 8015 ) ;
Вернуться наверх
httpProxy.createProxyServer
поддерживает следующие параметры:
target : строка URL-адреса, которая будет проанализирована с помощью модуля URL-адреса.
вперед : строка URL-адреса, которая будет проанализирована с помощью модуля URL-адреса
агент : объект, который будет передан в http(s).request (см. объекты https-агента узла и объекты http-агента)
ssl : объект для передачи в https.createServer()
ws : true/false, если вы хотите проксировать веб-сокеты
xfwd : true/false, добавляет заголовки x-forward
Secure : true/false, если вы хотите проверить сертификаты SSL.
toProxy : true/false, передает абсолютный URL-адрес в качестве path
(полезно для прокси-серверов)
prependPath : true/false, по умолчанию: true — укажите, хотите ли вы добавить путь цели к пути прокси.
ignorePath : true/false, Default: false — укажите, хотите ли вы игнорировать путь прокси-сервера входящего запроса (примечание: при необходимости вам придется добавить / вручную).
localAddress : строка локального интерфейса для привязки исходящих соединений.
ChangeOrigin : true/false, по умолчанию: false — меняет происхождение заголовка хоста на целевой URL-адрес.
saveHeaderKeyCase : true/false, по умолчанию: false — укажите, хотите ли вы сохранить регистр букв в ключе заголовка ответа.
auth : базовая аутентификация, т.е. «пользователь:пароль» для вычисления заголовка авторизации.
hostRewrite : перезаписывает имя хоста местоположения при перенаправлениях (201/301/302/307/308).
autoRewrite : перезаписывает хост/порт местоположения при перенаправлении (201/301/302/307/308) на основе запрошенного хоста/порта. По умолчанию: ложь.
протоколRewrite : перезаписывает протокол местоположения (201/301/302/307/308) с перенаправлением на «http» или «https». По умолчанию: ноль.
cookieDomainRewrite : перезаписывает домен заголовков set-cookie
. Возможные значения:
false
(по умолчанию): отключить перезапись файлов cookie.cookieDomainRewrite: "new.domain"
. Чтобы удалить домен, используйте cookieDomainRewrite: ""
."*"
. Например, оставьте один домен без изменений, перепишите один домен и удалите другие домены: cookieDomainRewrite: {
"unchanged.domain": "unchanged.domain",
"old.domain": "new.domain",
"*": ""
}
cookiePathRewrite : перезаписывает путь к заголовкам set-cookie
. Возможные значения:
false
(по умолчанию): отключить перезапись файлов cookie.cookiePathRewrite: "/newPath/"
. Чтобы удалить путь, используйте cookiePathRewrite: ""
. Чтобы установить путь к корню, используйте cookiePathRewrite: "/"
."*"
чтобы сопоставить все пути. Например, чтобы сохранить один путь неизменным, перепишите один путь и удалите другие пути: cookiePathRewrite: {
"/unchanged.path/": "/unchanged.path/",
"/old.path/": "/new.path/",
"*": ""
}
headers : объект с дополнительными заголовками, которые будут добавлены к целевым запросам.
proxyTimeout : таймаут (в миллисах) для исходящих прокси-запросов.
timeout : тайм-аут (в миллисах) для входящих запросов.
FollowRedirects : true/false, По умолчанию: false — укажите, хотите ли вы следовать за перенаправлениями.
selfHandleResponse true/false, если установлено значение true, ни один из проходов webOutgoing не вызывается, и вы несете ответственность за надлежащий возврат ответа, прослушивая событие proxyRes
и действуя на него.
буфер : поток данных для отправки в качестве тела запроса. Возможно, у вас есть какое-то промежуточное программное обеспечение, которое потребляет поток запросов перед его проксированием, например, если вы читаете тело запроса в поле с именем «req.rawbody», вы можете повторно передать это поле в опцию буфера:
'use strict';
const streamify = require('stream-array');
const HttpProxy = require('http-proxy');
const proxy = new HttpProxy();
module.exports = (req, res, next) => {
proxy.web(req, res, {
target: 'http://localhost:4003/',
buffer: streamify(req.rawBody)
}, next);
};
ПРИМЕЧАНИЕ. options.ws
и options.ssl
являются необязательными. options.target
и options.forward
не могут отсутствовать оба
Если вы используете метод proxyServer.listen
, также применимы следующие параметры:
Вернуться наверх
error
: Событие ошибки генерируется, если запрос к цели не выполнен. Мы не обрабатываем ошибки сообщений, передаваемых между клиентом и прокси-сервером, а также сообщений, передаваемых между прокси-сервером и целью, поэтому рекомендуется прослушивать ошибки и обрабатывать их.proxyReq
: это событие генерируется перед отправкой данных. Это дает вам возможность изменить объект запроса proxyReq. Применяется к «сетевым» соединениямproxyReqWs
: это событие генерируется перед отправкой данных. Это дает вам возможность изменить объект запроса proxyReq. Применяется к соединениям «websocket».proxyRes
: это событие генерируется, если запрос к цели получил ответ.open
: это событие генерируется после создания веб-сокета прокси и его передачи в целевой веб-сокет.close
: это событие генерируется после закрытия веб-сокета прокси.proxySocket
: устарел в пользу open
. var httpProxy = require ( 'http-proxy' ) ;
// Error example
//
// Http Proxy Server with bad target
//
var proxy = httpProxy . createServer ( {
target : 'http://localhost:9005'
} ) ;
proxy . listen ( 8005 ) ;
//
// Listen for the `error` event on `proxy`.
proxy . on ( 'error' , function ( err , req , res ) {
res . writeHead ( 500 , {
'Content-Type' : 'text/plain'
} ) ;
res . end ( 'Something went wrong. And we are reporting a custom error message.' ) ;
} ) ;
//
// Listen for the `proxyRes` event on `proxy`.
//
proxy . on ( 'proxyRes' , function ( proxyRes , req , res ) {
console . log ( 'RAW Response from the target' , JSON . stringify ( proxyRes . headers , true , 2 ) ) ;
} ) ;
//
// Listen for the `open` event on `proxy`.
//
proxy . on ( 'open' , function ( proxySocket ) {
// listen for messages coming FROM the target here
proxySocket . on ( 'data' , hybiParseAndLogMessage ) ;
} ) ;
//
// Listen for the `close` event on `proxy`.
//
proxy . on ( 'close' , function ( res , socket , head ) {
// view disconnected websocket connections
console . log ( 'Client disconnected' ) ;
} ) ;
Вернуться наверх
var proxy = new httpProxy . createProxyServer ( {
target : {
host : 'localhost' ,
port : 1337
}
} ) ;
proxy . close ( ) ;
Вернуться наверх
Если вы хотите обработать свой собственный ответ после получения proxyRes
, вы можете сделать это с помощью selfHandleResponse
. Как вы можете видеть ниже, если вы используете эту опцию, вы можете перехватывать и читать proxyRes
, но вы также должны обязательно ответить на сам res
, иначе исходный клиент никогда не получит никаких данных.
var option = {
target : target ,
selfHandleResponse : true
} ;
proxy . on ( 'proxyRes' , function ( proxyRes , req , res ) {
var body = [ ] ;
proxyRes . on ( 'data' , function ( chunk ) {
body . push ( chunk ) ;
} ) ;
proxyRes . on ( 'end' , function ( ) {
body = Buffer . concat ( body ) . toString ( ) ;
console . log ( "res from proxied server:" , body ) ;
res . end ( "my response to cli" ) ;
} ) ;
} ) ;
proxy . web ( req , res , option ) ;
Через этот дополнительный модуль доступен API-интерфейс прокси-таблицы, который позволяет вам определить набор правил для преобразования соответствующих маршрутов в целевые маршруты, с которыми будет общаться обратный прокси-сервер.
$ npm test
Логотип создан Диего Паскуали.
Вернуться наверх
master
)Вернуться наверх
Лицензия MIT (MIT)
Авторские права (c) 2010–2016 гг. Чарли Роббинс, Джарретт Крюгер и участники.
Настоящим бесплатно любому лицу, получившему копию данного программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.