![Универсальный постоянный пул соединений proxy с nginx](https://rvso.com/image/718154/%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BF%D1%83%D0%BB%20%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9%20proxy%20%D1%81%20nginx.png)
Проблема в том, что есть буквально 100 различных удаленных серверов, которые постоянно меняются. Я подключаюсь к ним с помощью PHP, используя curl, этот процесс PHP умирает после завершения, и нет способа сохранить соединение открытым. С моими текущими знаниями мне пришлось бы настраивать каждый из них в конфигурации nginx. Следующее работает для одного сервера:
upstream some-server {
server some-server.com:443;
keepalive 20;
}
server {
listen 80;
server_name some-server.com;
location / {
proxy_pass https://some-server;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
Единственная проблема в том, что в восходящем потоке some-server.com
это жестко запрограммировано и не может быть переменной.
Ниже представлена моя попытка сделать универсальную версию того же самого. Она правильно выполняет прокси, но не сохраняет постоянный пул подключений к удаленному серверу:
server {
listen 8889;
location / {
proxy_pass https://$http_host$request_uri;
resolver 8.8.8.8;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
upstream https-proxy {
server localhost:8889;
keepalive 20;
}
server {
listen 8891;
location / {
proxy_pass http://https-proxy;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
}
}
Я предполагаю, что постоянное соединение создается между моими серверами, работающими на одном порту, 8891
и 8889
это бессмысленно.
Возможно ли сделать nginx proxy и пул постоянных подключений куда угодно? Если нет, то создание такого proxy кажется тривиальным. Так что, возможно, лучшее решение уже существует, о котором я не знаю.
решение1
Вы угадали причину, по которой это не работает так, как задумано. Вы пытаетесь использовать Nginx в качестве прямого прокси-сервера, и хотя это возможно в том виде, в котором вы это сделали, есть много ограничений, поскольку Nginx не предназначен для использования таким образом. Вам следует использовать Squid или даже Apache mod_proxy, который лучше поддерживает прямое прокси-сервер.
НО:
Пробовали ли вы использовать переменную $http_host в определении вышестоящего уровня, гдеподдерживать активностьдиректива? Я почти уверен, что это не сработает, но дайте мне знать :)