LINUX.ORG.RU

Не такой как у всех reverse proxy

 ,


1

4

Доброго времени суток господа!

Работаю в телеком компании. Есть корп.сеть и сеть состоящая и овер дохрена всякого оборудования.В сети штук 500 оптических приемников которые могут управляться только через вебморду. Есть сервер который живет и в сети оборудования и в корп. сети, на сервере крутится сайтик для мониторинга оборудования.

Задача сделать доступными веб-морды приемников с сайтика.

Решил использовать для этого уже установленный и работающий nginx. Дописал в конфиг вот это:

location ~ "/cybertron/op/(10\.22[0-2]\.[0-9]{0,3}\.[0-9]{0,3})/*(.*)"{
        	proxy_pass http://$1/$2;
        	proxy_http_version 1.1;
        	proxy_set_header Connection keep-alive;
    	}

Вот весь конфиг:

server {
		listen      80;
		server_name 10.220.127.243;

		access_log	/var/log/nginx/10.220.127.243-acc;
		error_log	/var/log/nginx/10.220.127.243-err;

		root /mnt/data/http/cybertron/www;


		location ~ ^/redqueen {
			proxy_pass			http://10.220.127.243;
			proxy_set_header	Host   redqueen;
			proxy_set_header	X-Real-IP	$remote_addr;
		}

		
		location /phpMyAdmin {
			fastcgi_pass   127.0.0.1:9000;
			fastcgi_index  index.php;
			fastcgi_param  QUERY_STRING       $query_string;
        	fastcgi_param  REQUEST_METHOD     $request_method;
        	fastcgi_param  SCRIPT_FILENAME    /mnt/data/http/cybertron/www$fastcgi_script_name;
        	include			fastcgi_params;
			
		}
		location ~ ^/cybertron/static {
			gzip_static on;
		}
		
		location ~ "/cybertron/op/(10\.22[0-2]\.[0-9]{0,3}\.[0-9]{0,3})/*(.*)"{
        	proxy_pass http://$1/$2;
        	proxy_http_version 1.1;
        	proxy_set_header Connection keep-alive;
    	}

		location ~ \.ico$	{ }
		location ~ \.zip$	{ }
		location ~ \.css$	{ }
		location ~ \.jpg$	{ }
		location ~ \.png$	{ }
		location ~ \.gif$   { }
		location ~ \.js$	{ }
		location ~ \.gz$	{ }

		# fonts
		location ~ \.eot$	{ }
		location ~ \.ttf$	{ }
		location ~ \.svg$	{ }
		location ~ \.woff$	{ }
		location ~ \.woff2$	{ }

		location ~ ^/cybertron {
			fastcgi_pass   127.0.0.1:9000;
			fastcgi_index  index.php;
			fastcgi_param  SCRIPT_FILENAME /mnt/data/http/cybertron/www/core.php;
			include        fastcgi_params;
		}

		location / {
			fastcgi_pass   127.0.0.1:9000;
			fastcgi_index  index.php;
			fastcgi_param  SCRIPT_FILENAME /mnt/data/http/cybertron/www/core.php;
			include        fastcgi_params;
		}
    }

Проблемы с которыми столкнулся: 1.У некоторых железок стоит модный

HTTP-EQUIV="REFRESH" CONTENT="1; URL=/welcome.html"
и как только пользователь получает эту страничку он пытается идти на /welcome.html вместо /cybertron/op/ipaddr/welcome.html.А даже если сразу брать вручную /cybertron/op/ipaddr/welcome.html часть контента он подгружает через js и у него это не получается. Вот часть страница welcome.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang=en lang=en><head><title>Login page</title><script language=javascript src="script/include.js"></script><meta http-equiv=content-type content="text/html; charset=UTF-8"/><style> div.jsno {
                color: red;
                font-size:200%;
                width:100%;
                height:100%;
                background-color:yellow;
                text-align: center;
                vertical-align: middle;
                z-index: 90;border:1px solid;
                border-color:black;
                position:absolute;
                top: 0px;
                }
        </style><script type="text/javascript">
                function debugprint(){}
        </script></head><body><style>
            #welcome {
                position: absolute;
                top: 50%;
                left: 50%;
            }
            #welcome_inner {
                position: relative;
                top: -70px;
            }
            #welcome_inner2 {
                position: relative;
                left: -50%;
                width: 400px;
            }
            </style><!--[if lte IE 7]><style>
                div.logo_leftup {
                    margin-left: 75px;
                }
                div.logo_leftdn {
                   margin-left: 66px;
                }
            </style><![endif]--><noscript><div class=jsno>Turn JavaScript on!</div></noscript><div class=gradient><div class=top><div class=logo><div width=320px height=110px><img id=logo_image alt="Planar logo"></img></div><a href="http
            lazy.imgOnLoad = function() { LoginLock(false);  }
            lazy.include("design/device.css");
            lazy.include("script/com_request.js");
            //lazy.include("script/checks.js");
            lazy.include("script/welcome.js");
            //lazy.include("design/logo.gif", o("loading") );
            o("logo_image").src = "design/head_logo.gif";
        </script></body></html>[!http]
Вот JS:
var global_var=0,lazy={context:this,jsExecute:function(a){"undefined"!=typeof execScript?execScript(a):lazy.context.eval?lazy.context.eval(a):eval(a);return null},cssExecute:function(a){var b=lazy.context.document.createElement("style");b.setAttribute("type","text/css");try{b.innerHTML=a}catch(c){b.styleSheet.cssText=a}lazy.context.document.getElementsByTagName("head")[0].appendChild(b);return b},getXHTTPTransport:function(){for(var a=!1,b=[function(){return new XMLHttpRequest},function(){return new ActiveXObject("Msxml2.XMLHTTP")},
function(){return new ActiveXObject("Microsoft.XMLHTTP")}],c=0;c<b.length;c++)try{a=b[c]();break}catch(d){}return a},loadedModules:{},module:function(a){lazy.loadedModules[a]=!0},include:function(a){if(lazy.loadedModules[a]&&!0==lazy.loadedModules[a])return!1;var b=lazy.getXHTTPTransport();b.open("GET","http://"+document.domain+("80"!=document.location.port?":"+document.location.port:"")+"/"+a,!1);b.send(null);return 200!=b.status?null:/\.js$/.test(a)?lazy.jsExecute(b.responseText):/\.css$/.test(a)?
lazy.cssExecute(b.responseText):null}};

2. У других железок какая проблема в том что в src или href указано допустим 5_scripts.js а в дампе видно что запрос идет на /cybertron/op/5_scripts Вот страничка html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="content-type" content="text/html; charset=iso-8859-2"/><title>Lambda PRO 72</title><link rel="stylesheet" type="text/css" href="7_styles.css"/><link href="favicon.ico" rel="shortcut icon" type="image/x-icon"/><script type="text/javascript" src="5_scripts.js"></script><script type="text/javascript">window.onload=function(){f2("vYA","vYB","vYL","vYM","1","vU ");}</script></head>
<!--head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-2"/>
<title>vYt</title>
<link rel="stylesheet" type="text/css" href="7_styles.css"/>
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon"/>
<script type="text/javascript" src="5_scripts.js"></script>
<script type="text/javascript">window.onload=function(){f2("vYA","vYB","vYL","vYM","vYt","vU ");}</script>
</head-->

<body style="visibility:hidden">

<table id="n">
  <!--tr>
    <td class="lo" width="977px" colspan=4>
      <a class="lo" href="0_set.htm" onclick="clearAuthenticationCache('0_set.htm')">Logout</a>
    </td>
  </tr-->
  

  <tr>
    <td class="w"><a href="http://www.vector.com.pl"><img src="8_logo.jpg"/></a></td>
    <td class="w" width="210px">&nbsp;</td>
    <td width="210px"><span>Node setup</span></td>
    <td width="210px"><a href="3_admin.htm">Transponder setup</a></td>
  </tr>
</table>

<table id="c">
<tr>
<form action="0_set.htm" name="fr">
<td class="l">
<div style="height:350px;">&nbsp;</div>
<div id="d1"><img src="LP_72.png"/></div>
<div id="d2" style="display:vYR"><select name="b"><option value="D" selected>prefer A<option value="B" >force A<option value="C" >force B</select></div><div id="d8"><select name="V"><option value="@" >on<option value="V" >20 dB<option value="U" >19 dB<option value="T" >18 dB<option value="S" >17 dB<option value="R" >16 dB<option value="Q" >15 dB<option value="P" >14 dB<option value="O" >13 dB<option value="N" >12 dB<option value="M" >11 dB<option value="L" >10 dB<option value="K" >9 dB<option value="J" >8 dB<option value="I" >7 dB<option value="H" >6 dB<option value="G" >5 dB<option value="F" >4 dB<option value="E" >3 dB<option value="D" >2 dB<option value="C" >1 dB<option value="B" >off</select></div>
<!--div id="d2" style="display:vYR">
<select name="b">
<option value="D" sAD>prefer A
<option value="B" sAB>force A
<option value="C" sAC>force B
</select></div>
<div id="d8">
<select name="V">
<option value="@" sV@>on
<option value="V" sVV>20dB
<option value="U" sVU>19dB
<option value="T" sVT>18dB
<option value="S" sVS>17dB
<option value="R" sVR>16dB
<option value="Q" sVQ>15dB
<option value="P" sVP>14dB
<option value="O" sVO>13dB
<option value="N" sVN>12dB
<option value="M" sVM>11dB
<option value="L" sVL>10dB
<option value="K" sVK>9dB
<option value="J" sVJ>8dB
<option value="I" sVI>7dB
<option value="H" sVH>6dB
<option value="G" sVG>5dB
<option value="F" sVF>4dB
<option value="E" sVE>3dB
<option value="D" sVD>2dB
<option value="C" sVC>1dB
<option value="B" sVB>off
</select></div-->

<div id="d6"><input class ="intext" id="i1a" maxlength="2" size="1" name="H1" value=""/><font size="1">dB</font></div>
<!--div id="da"><input id="i20" maxlength="2" size="1" name="H5" value=""/><font size="1">dB</font></div-->
<div id="dd"></div><div id="dA"></div><div id="dE"></div><div id="dF"></div>
<table>
<tr>
<td class="pc">
<table class="p p2">
<tr><th colspan="3">Power supply</th></tr>
<tr class="o"><td>6V</td><td class="cr"><span id="p01">.</span></td><td>V</td></tr>
<tr><td>12.4V</td><td class="cr"><span id="p03">.</span></td><td>V</td></tr>
</table>
</td>
<tr></table>
</td>

<td class="pc">

<!-- ZAWARTOSC TABELI ZALEZY OD TYPU LP71 / LP72 -->
<table class="p p3">
<tr><th colspan="3">Lambda PRO 72, s/n: 000000802690<!--vYt, s/n: vYs--></th></tr>
<tr class="o"><td>Firmware</td><td><span>1.4.0</span></td>
<tr><td>Temperature</td><td class="cl"><span id="p24">.</span>&nbsp;°C</td>


<tr class="o"><td>Ext. port A</td><td><span id="p26">.</span></td><tr><td>Ext. port B</td><td><span id="p27">.</span></td><tr id="r1rh"><td class="h" colspan="3">Forward receivers</td><tr id="r1r1" class="o"><td>RX power A</td><td class="cl"><span id="p0a">.</span>&nbsp;dBm</td></tr><tr id="r2r1"><td>RX power B</td><td class="cl"><span id="p0b">.</span>&nbsp;dBm</td></tr><tr id="abrh"><td class="h" colspan="3">Extended AB switch configuration</td></tr><tr id="abr1"><td>Active input</td><td><span id="p15">.</span></td><tr id="abr2" class="o"><td>Lower threshold</td><td class="cl"><input class ="intext" id="i16" maxlength="5" size="1" name="H7" value=""/>&nbsp;dBm</td></tr><tr id="abr3"><td>Upper threshold</td><td class="cl"><input class ="intext" id="i17" maxlength="5" size="1" name="H8" value=""/>&nbsp;dBm</td></tr>


<!--tr class="o"><td>Ext. port A</td><td><span id="p26">.</span></td>
<tr><td>Ext. port B</td><td><span id="p27">.</span></td-->


<!--tr id="r1rh"><td class="h" colspan="3">Forward receiver</td>
<tr id="r1r1" class="o"><td>RX power A</td><td class="cl"><span id="p0a">.</span>&nbsp;dBm</td></tr-->


<!--tr id="r1rh"><td class="h" colspan="3">Forward receivers</td>
<tr id="r1r1" class="o"><td>RX power A</td><td class="cl"><span id="p0a">.</span>&nbsp;dBm</td></tr>
<tr id="r2r1"><td>RX power B</td><td class="cl"><span id="p0b">.</span>&nbsp;dBm</td></tr>
<tr id="abrh"><td class="h" colspan="3">Extended AB switch configuration</td></tr>
<tr id="abr1"><td>Active input</td><td><span id="p15">.</span></td>
<tr id="abr2" class="o"><td>Lower threshold</td><td class="cl"><input class ="intext" id="i16" maxlength="5" size="1" name="H7" value=""/>&nbsp;dBm</td></tr>
<tr id="abr3"><td>Upper threshold</td><td class="cl"><input class ="intext" id="i17" maxlength="5" size="1" name="H8" value=""/>&nbsp;dBm</td></tr-->



<tr><td class="h" colspan="3">Output monitoring</td></tr>
<tr><td>Output Level</td><td class="cl"><span id="p28">.</span>&nbsp;dBm</td></tr>
<tr class="o"><td>Reference level</td><td class="cl"><input class ="intext" id="i29" maxlength="3" size="1" name="H6"/>&nbsp;dBm</td></tr>
<tr><td>Delta</td><td class="cl"><span id="p2a">.</span>&nbsp;dBm</td></tr>
</table>

</td></form></tr>

<tr class="o">
<td colspan="4" style="text-align:right; padding:5px;">
<span id="b4" style="visibility:hidden;background:#ffcc00;padding:5px">Node configuration in progress, please wait...</span>
<input id="b1" type="button" value="SET" onclick="doSet()" style="display:vYS" enabled>
<input id="b2" type="button" value="REFRESH" onclick="JavaScript:document.location.assign('0_set.htm')">
<input id="b3" type="button" onclick="window.print()" value="PRINT">
</td></tr>
<tr><td class="f" colspan="4">&copy; 2012 <b><a href="http://www.vector.com.pl">VECTOR</a></b></td></tr>
</table>

</body>
</html>

3. Третий тип умеет keep-alive(в отличии от остальных) но почему то висит долгое время открытым, в дампе нет http ответа вообще, но каким то образом видно окно входа в веб интерфейс.

P.S. Опыта в подобных вещах мало, подскажите пожалуйста если я несу бред и все решается проще

Ответ на: комментарий от kovalev_94

Каков вопрос, таков ответ. Я с первого раза не распарсил твой поток мыслей.

Покажи хотя бы конфиг nginx, а лучше ещё логи и конкретные примеры того, что работает не так, как ты ожидаешь.

Как видишь, никто не бросился тебе помогать. Гадать, что ты делаешь не так, желающих пока нет.

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

Прошу прощения) Исправил надеюсь теперь мой поток мыслей понятней.

kovalev_94 ()
  1. Редиректы в html можно пофиксить с помощью sub_filter.
  2. /cybertron/op/(10\.22[0-2]\.[0-9]{0,3}\.[0-9]{0,3})/* — здесь слеш не обязательный, следовательно, если ты идёшь просто в индекс, а слеша нет, то айпишник у тебя — ресурс, а 5_scripts.js относительно директории закономерно оказывается здесь — /cybertron/op/5_scripts.js.
  3. Не осознал о чём речь.

Тут у тебя что-то странное:

<script language=javascript src="s
                color: red;

Ошибся при копипасте?

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

1. Тоже об этом подумал... Даже сработало в некоторых местах 2. Спасибо. Запрос со слэшэм после адреса сработал нормально, и мне даже немного кажется что эта причина проблем не только для одной модели. Но можно еще вопрос? Просто я специально написал регулярку так, чтобы слэш не попадал в переменную но при этом он у меня обязателен здесь (между $1 и $2):

proxy_pass http://$1/$2;
Таким образом запросы со слэшэм и без должны всегда конвертироваться в запросы с одним слэшэм.Плюс в дампе запросы всегда «GET /»( но работают при этом как ты и сказал по разному) - WTF? 3. Да я сам пока не осознал))

Тут у тебя что-то странное:

Исправил.

kovalev_94 ()
Ответ на: комментарий от kovalev_94

Вот запросы:

От меня к серверу


 GET /cybertron/op/10.220.75.8 HTTP/1.0                                    
        Host: 10.220.127.243                                                          
        RQAUTH: CN=Cool,L=P=K,ST=41,C=RU                                                                                                      
        Connection: close                                                                                  
        User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0                                                                                                                       
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8                                                                                                                                
        Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3                                                                                                    
        Accept-Encoding: gzip, deflate, br                                                                                                              
        Authorization: Basic YWRtaW46dmVjdG9y                                                                                                      
        Cookie: TUZ19-2003-000427097=CA0431DDDF8A8A888E8E8E8E8ECB30CB                                                                              
        Upgrade-Insecure-Requests: 1                                                                                                                                                                           
                                                                           


 GET /cybertron/op/10.220.75.8/ HTTP/1.0
        Host: 10.220.127.243
        RQAUTH: CN=Cool,L=P=K,ST=41,C=RU
        Connection: close
        User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
        Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
        Accept-Encoding: gzip, deflate, br
        Authorization: Basic YWRtaW46dmVjdG9y
        Cookie: TUZ19-2003-000427097=CA0431DDDF8A8A888E8E8E8E8ECB30CB
        Upgrade-Insecure-Requests: 1

От сервера к приемнику:

GET / HTTP/1.1
    Connection: keep-alive
    Host: 10.220.75.8
    RQAUTH: CN=Cool,L=P=K,ST=41,C=RU
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate, br
    Authorization: Basic YWRtaW46dmVjdG9y
    Cookie: TUZ19-2003-000427097=CA0431DDDF8A8A888E8E8E8E8ECB30CB
    Upgrade-Insecure-Requests: 1

GET / HTTP/1.1
    Connection: keep-alive
    Host: 10.220.75.8
    RQAUTH: CN=Cool,L=P=K,ST=41,C=RU
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate, br
    Authorization: Basic YWRtaW46dmVjdG9y
    Cookie: TUZ19-2003-000427097=CA0431DDDF8A8A888E8E8E8E8ECB30CB
    Upgrade-Insecure-Requests: 1

kovalev_94 ()
Ответ на: комментарий от kovalev_94
  1. Браузер же решает откуда брать ресурс, а location там без слеша.
  2. До меня так и не дошло зачем тебе keep-alive, без ssl он в сущности бесполезен, я бы вообще его не включал. Но если ты считаешь, что он тебе нужен, и тебя волнуют долго висящие соединения, то тебе, наверное, следует поставить на него таймаут. Вообще, в nginx я ничего не смыслю, но полагаю, что в данном случае он не флешит логи на диск до закрытия соединения.
WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

2. Допёр, спасибо большое.

3.Объясни пожалуйста почему ты считаешь что безполезен, я просто думал что гонять все через одну tcp сессию круче чем через 10. А таймаут разве не сервер ставит, который на приемнике крутится.

kovalev_94 ()
Ответ на: комментарий от kovalev_94
  1. Это вопос целесообразности, ssl handshake — это долго, оверхед ужасный, при большой нагрузке не держать соединение — самоубийсво. В твоём случае ssl нет, большой нагрузки не предполагается, даже dns-запросов нет. На TCP handshake в данном случае обращать внимания смысла не вижу. Впрочем, HTTP/1.1 соединение держит по-дефолту. Убери proxy_set_header Connection keep-alive;, вероятно ты не даёшь браузеру передать Connection: close.

А таймаут разве не сервер ставит, который на приемнике крутится

Так соединение могут закрыть и клиент, и сервер.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от kovalev_94

3.Объясни пожалуйста почему ты считаешь что безполезен, я просто думал что гонять все через одну tcp сессию круче чем через 10. А таймаут разве не сервер ставит, который на приемнике крутится.

Про keep-alive все сложно, нужно смотреть что вообще происходит с соединением. Например, если сервер вернет тебе ответ без Content-Length, то могут возникнуть проблемы с чтением ответа, т.к. концом данных для HTTP1x является завершение соединения. Далее посмотри сколько у тебя запросов. Если их 100500, то стоит включить keep-alive, т.к. сокеты это те же файлы и в какой-то момент можно напороться на исчерпание открытых сокетов или встрять во всякие TIME_WAIT состояния. Нужно еще понимать, что keep-alive HTTP и TCP это разные вещи. Первое работает на уровне клиента, второе на уровне ОС. В целом если Content-Length нигде не бьется, то keep-alive лишних проблем не создаст.

xpahos ★★★★★ ()
        location ~ "/cybertron/op/(10\.22[0-2]\.[0-9]{0,3}\.[0-9]{0,3})/*(.*)"
        {
        	proxy_pass http://$1/$2;
        	proxy_http_version 1.1;
        	proxy_set_header Connection keep-alive;
    	}

Делать так не стоит, лучше автоматически генерировать секции для каждого устройства. Например, у вас есть что-то вроде racktables(https://racktables.org) и тогда нужно брать адреса из него и генерировать каждую секцию. Используя текущий регэксп вполне может случиться ситуация, когда критически важная железка попадет под него и случайно ты начнешь пускать людей туда, куда не стоит.

Еще одна особенность - это заголовок Authentication и в целом авторизация/аутентификация пользователей. Лучше в этом месте сделать обертку для всех железок, которая будет уметь авторизовываться на самих железках, а текущего пользователя авторизовывать по сессионной куке и ходить в центральное хранилище, которое может проверить есть ли права на редактирование у текущего пользователя. Так ты решишь проблему утекания паролей и всякие JS/welcom.html, т.к. быстро и дешево их можно подменить только iframe’ами.

xpahos ★★★★★ ()
Ответ на: комментарий от xpahos

Спасибо, интересно. Особенно про обертку которая умеет аунтетифицироваться, не могли бы вы чуть подробнее рассказать как реализуется? По поводу автоматического генерирование секций - вы имеете виду 100500 конфигов со всеми железками, и последующим добавлением туда новых или один файл в котором постоянно меняется эта секция и постоянно заставлять nginx перечитывать конфиг(просто видел подобное и мне почему то кажется что каждый раз заставлять nginx перечитывать конфиг бред)

kovalev_94 ()
Ответ на: комментарий от kovalev_94

Особенно про обертку которая умеет аунтетифицироваться, не могли бы вы чуть подробнее рассказать как реализуется?

Если делать совсем просто, то можно хранить базу с пользователями в СУБД и каждому пользователю разрешать определенные железки. Далее зависит от железки. Можно написать скриптов для CLI на железках, которые будут выполнять определенные функции. Пользователь авторизовывает, проверяется доступ к этой железке и если ему разрешено что-то менять, то скрипт идет на железку через telnet/ssh и там уже выполняет нужные действия. Можно еще управление в отдельный VLAN запихнуть на всякий случай. Скорее всего что-то подобное уже есть в opensource, я такую штуку делал больше 10 лет назад.

По поводу автоматического генерирование секций - вы имеете виду 100500 конфигов со всеми железками, и последующим добавлением туда новых или один файл в котором постоянно меняется эта секция и постоянно заставлять nginx перечитывать конфиг(просто видел подобное и мне почему то кажется что каждый раз заставлять nginx перечитывать конфиг бред)

Вряд ли у вас раз в секунду добавляются/удаляются железки. Вполне себе нормальный вариант в один файл дописывать новые. Но лучше, конечно написать на Go/Python обертку.

xpahos ★★★★★ ()
Ответ на: комментарий от xpahos

управление в отдельный VLAN запихнуть на всякий случай Так и сделано. скрипт идет на железку через telnet/ssh и там уже выполняет нужные действия Так не получится ибо у железок ничего кроме веб интерфейса нет. Мне кажется самый логичный вариант это в нжинксе прописать js скрипт, который выполняется при загрузке страницы, проверяет куку и заполняет логин/пароль. (Наверное вы что-то подобное и имели ввиду) Вполне себе нормальный вариант в один файл дописывать новые. Тут все же не понял, дописывать и переписывать разные вещи. Просто очень интересен этот момент по перечитывания конфига, разумно ли его привязывать к определенным действиям на странице(Типа щелкнул ссылку, тебе скриптик в конфиг добавил адрес и нжинксу сказал перечитать)? P.S Прошу прощения если сильно закидал вопросами

kovalev_94 ()
Ответ на: комментарий от kovalev_94

Веб-интерфейс тоже автоматизируется. Разницы же в JS, не JS нет, это все GET/POST запросы. А администратора авторизовация уже по желанию, тогда это был отдельный сервис, т.к. я не думал об единой точке авторизации для всех сервисов. Да и не вытянул бы это все один. Сделал обычную формочку и SQL базу, но Authorization хедер я бы не советовал использовать.

Регулярки для nginx стоит переписывать только в том случае, если будет проксирование запросов к железке. Если автоматизировать скрипты(которые сами ходят на железки), то такое нужно не будет.

Лучший вариант в случае с веб-интерфейсом, имхо, будет что-то вроде:

Пользователь -> nginx -> python/php/go -> requests/curl/etc запрос к http интерфейсу к железке.

xpahos ★★★★★ ()
Ответ на: комментарий от xpahos

Лучший вариант в случае с веб-интерфейсом, имхо, будет что-то вроде:
Пользователь -> nginx -> python/php/go -> requests/curl/etc запрос к http интерфейсу к железке.

А какая разница будет ли у меня посередине python/php/go если они будут так же выполнять запросы и передавать страничку мне? Тоже самое будет делать и nginx.

Я просто думаю что проблема в самих страничках которые отдает железка.

Пример: Допустим я сгенерировал для каждого устройства свою секцию, без регекспа. Допустим location такой:

location ~ "/cybertron/op/10.220.71.9"
        {
        	proxy_pass http://10.220.71.9;
        	proxy_http_version 1.1;
    	}
Я запрашиваю страничку(GET /cybertron/op/10.220.71.9). NGINX берет страничку у приемника(GET /), и передает мне. Браузер смотрит что у меня на страничке разные скрипты, картинки с адресами (/index.html,/welcome.js, /include.js итд) И соответственно долблит в NGINX с этим uri(GET /welcome.js) итд

Получается мне нало переписывать все адреса в самих страничках чтобы эта хрень работала. Я бы с радостью написал подобное на Go, только не очень вижу смысла так как nginx сам такое умеет. Мне кажется nginx будет в этом плане производительнее.

ИМХО: Мне кажется проще сделать сервис c простой веб мордой который принимает запросы по http, и потом по snmp получает или сетит нужные параметры.

P.S. Прошу прощения что вопросами замучал.

kovalev_94 ()
Последнее исправление: kovalev_94 (всего исправлений: 1)

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

KivApple ★★★★★ ()
Ответ на: комментарий от kovalev_94

Идея не в том, чтобы дублировать все эти html/js.

Условно есть две разных железки и тебе нужно у обоих назначать wlanX на порт Y:

  1. Для управления нужно передать GET /netdevice/0/port/1/?wlanid=x
  2. Для второго нужно сделать POST /changesettings в параметрами {‘device’: 0, ‘port’: 1, ‘wlan_tag’: x}

Это все скрыто за веб интерфейсом. У тебя в твоем веб интерфейсе выводится поля вида <имя железки> <порт> <wlan тэг> и кнопка сохранить. Во время нажатия на кнопку твой скрипт пойдет по первому пути и сохранит изменения для первого устройства, а потом для второго. Я предлагаю сделать более верхнеуровневый интерфейс, которые будет прятать абстракции внутри себя. Посмотри в сторону netmiko для питона.

xpahos ★★★★★ ()
Ответ на: комментарий от xpahos

Все!!! Теперь я наконец то вас понял!( по-крайней мере мне так кажется). Как понял идея была сделать сервис с единой веб мордой, которая каким либо способом(http, ssh, telnet, snmp) сама взаимодействует с железкой.

Быстрый гугл по netmiko сказал что это либа для телнет, ссх подключений. В данном случае не поможет. Железо уж очень тупое. Остановлюсь на snmp, ибо уже есть мибы, а ковырять как оно там ходит и куда не очень хочется.

Большое вам спасибо за помощь!!! Как говорится - от души))

kovalev_94 ()

Тебе нужен http://nginx.org/en/docs/http/ngx_http_sub_module.html

Сначала в html заменяешь все урлы ресурсов, затем в ресурсах если это требуется.

Хотя если железки типовые то ты можешь сразу сделать подхаченные варианты скриптов и стилей и отдавать сразу их.

ya-betmen ★★★★★ ()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от kovalev_94

Да. Создаёшь поддомен для каждой железки. Затем на nginx настраиваешь vhost на каждый поддомен. Таким образом админка каждой железки находится в корне и все ссылки валидны.

KivApple ★★★★★ ()

Задачу не понял (где конкретный вопрос, какие js?), но я бы начал с вырезания

HTTP-EQUIV="REFRESH" CONTENT="1; URL=/welcome.html"
через ngx_http_sub_module

anonymous ()
Ответ на: комментарий от anonymous

Ну если вкратце.

На сети кучу оптических приемников. Из управления только веб и snmp. Есть сервак с белым айпишником на нем что то типо сайта с инвертаризационными данными. Хотел сделать что-то типа реверс прокси с сайта на приемники. На некоторых приемниках вообще почти весь веб интрефейс сделан на JS.

Но суть в том что запрос я делаю с одним url(/cybertron/op/10.220.71.9) а ответ приходит с (/welcome.html). И получается надо переписывать урлы перед ответом, чтобы браузер дальше нормально общался приемником.

Ну пока решил остановиться сделать одну веб морду для всех, которая получает запрос по http, а к приемнику идет по snmp

kovalev_94 ()
Последнее исправление: kovalev_94 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.