<div dir="ltr">Доброго дня всем!<div><br></div><div>Ребят, подскажите - имеется такой вопрос..</div><div><br></div><div>INTRO: </div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Mono. Есть приложение, на которое nginx проксирует запросы. И есть один не-совсем-адекватный клиент, который у этого приложения запрашивает wsdl прежде, чем воспользоваться апишкой.. перед каждым запросом... и делает это с частотой ~200 запросов в минуту (на каждый полезный запрос - вот этот вот сорный запрос wsdl'ки, который впустую напрягает приложение)</div>
</blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Возможности повлиять на клиента нет. Время подставлять костыли...</div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><br></div></blockquote><div>WORKAROUND:</div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Раз возможности повлиять на клиента нет, было принято решение обмануть его (нормальная практика, что =) ): вместо постоянной генерации wsdl'ки на стороне приложения - отдавать nginx'ом статический файл, содержащий её контент (если в параметрах запроса имеется ?wsdl, если его нет - то проксировать на приложение). Было сделано что-то вроде следующего:</div>
<div><br></div><div><div><span class="" style="white-space:pre"> </span>location = /some/app/url/messenger.asmx {</div><div><span class="" style="white-space:pre"> </span> if ( $args ~* wsdl ) {</div><div><span class="" style="white-space:pre"> </span>return 301 /some/app/url/static/messengerwsdl.xml;<br>
</div><div><span class="" style="white-space:pre"> </span> }</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div> proxy_pass <a href="http://server1:8080">http://server1:8080</a>;</div>
</blockquote></div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><span class="" style="white-space:pre"> </span>}</div></div><div><br></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
где /some/app/url/static/ - смотрит на папку со статикой, обрабатываемую nginx'ом, а messengerwsdl.xml - тот самый файл с контентом wsdl'ки.<br>работало всё просто замечательно, но..<br><br></blockquote>PROBLEMS:</div>
<div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>..оказалось, что клиент, запрашивавший wsdl, не умеет работать с редиректом :( </div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div>А т.к. повлиять на клиента возможности нет - пришлось чесать затылок.</div></blockquote></div><div><br></div>GOALS:<div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Можно ли сделать нечто подобное <u>без перенаправлений</u> ? </div>
<div>Что пробовалось: положить файл в папку статики по пути, аналогичным location и с тем же именем, и поменять $document_root в блоке if'a, но: из if'a тоже надо как-то выходить - break не годится (обработка пойдет дальше по локейшену и в результате - запрос будет проксирован), return не годится (клиент не понимает редиректов), rewrite... а смысл? все равно в итоге return new location.</div>
</blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>В этом смысле, наверное, неплохо вписался бы try_files в блоке if'a... но он внутри директивы if запрещён.</div><div><br></div></blockquote>
Может, ещё какие-нибудь варианты? И могут ли они быть в принципе.</div><div>Если что-то было не ясно в описании - могу на псевдопримерах пояснить. А пока - вот:</div><div><div><br></div><div>#$ nginx -V</div><div>nginx version: nginx/1.0.15</div>
<div>built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) </div><div>TLS SNI support enabled</div><div>configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=-Wl,-E</div>
<div><br></div><div><div>#$ lsb_release -a</div><div>LSB Version:<span class="" style="white-space:pre"> </span>:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch</div>
<div>Distributor ID:<span class="" style="white-space:pre"> </span>CentOS</div><div>Description:<span class="" style="white-space:pre"> </span>CentOS release 6.2 (Final)</div><div>Release:<span class="" style="white-space:pre"> </span>6.2</div>
<div>Codename:<span class="" style="white-space:pre"> </span>Final</div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><br></div><div><br></div></blockquote>Спасибо!<br><br></div></div>