风中芦苇 發表於 2019-9-29 17:27:00

Nginx - 代理后端通过域名访问

<p>目录<br>- 前言<br>- Nginx 根据域名反向代理<br>- Nginx proxy_pass 关于 '/' 的作用</p>
<p>&nbsp;</p>
<h2>1. 前言</h2>
<p>接到一个需求,通过nginx 代理互联网上某一个页面,刚开始的时候觉得很简单的,直接 proxy_pass 过去就完事了,测试了下还是想太多。具体记录如下。</p>
<p>&nbsp;</p>
<h2>2. Nginx 根据域名反向代理</h2>
<p>web服务器通常有三种访问方式:</p>
<ol>
<li>基于ip</li>
<li>基于域名</li>
<li>基于端口</li>



</ol>
<p>而互联网上暴露的网站多数都是通过 基于域名 的方式,如果直接通过解析后的IP访问,可能就无法访问到网站信息。我这里模拟了下这种方式,如下:</p>
<p>&nbsp;</p>
<p>对应关系:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172056188-1522138548.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>浏览器访问域名:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172103605-1523317066.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>浏览器访问ip地址:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172111540-650672482.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>现在问题来了,当你的 nginx 配置 proxy_pass 的时候,得到的是 域名返回的结果 还是 ip地址返回的结果呢?这两种返回的结果完全不同。</p>
<p>在另一台主机 [ 192.168.118.14 ] 上安装 nginx 并配置好 </p>
<p>&nbsp;</p>
<p>配置nginx 方向代理 </p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172131594-1305240335.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>通过浏览器访问 192.168.118.14</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172233765-1105800814.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;查看日志信息:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">192.168.118.41 - - "GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" "upstream_addr":"112.2.3.66:80"
</pre>
</div>
<p>&nbsp;</p>
<p>结合上面的反馈, 可以得到,当 nginx 反向代理域名,会根据启动时候解析出来的ip,加载到内存中,后面不会改变可以绑定hosts或者指定resolve服务器来固定ip</p>
<p>如果在使用 nginx 做反向代理的时候遇到以上相同的情况,解决办法是 设置一个 proxy_set_header</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">proxy_set_header Host "";
</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172332218-1602347793.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>配置完成,nginx -s reload&nbsp; 浏览器访问:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172337222-806697518.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;现在就得到想要的页面了。</p>
<p>&nbsp;</p>
<h2>3. Nginx proxy_pass 关于 '/' 的作用</h2>
<p>有这样一个服务器访问如下:</p>
<p>访问 http://192.168.118.15 得到</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172439836-1221906783.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>访问 http://192.168.118.15/a/</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172448421-1267129659.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在这台主机前端需要添加一个反向代理。配置如下:</p>
<p>&nbsp;</p>
<p>第一种配置:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172500475-1357630259.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>当这样配置的时候,访问 http://192.168.118.14/a/ 结果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172509768-332679649.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>总结:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">proxy_pass http://192.168.118.14/a/--&gt; http://192.168.118.15/
</pre>
</div>
<p>&nbsp;</p>
<p>第二种配置:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172538494-1125718511.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>当这样配置的时候,访问 http://192.168.118.14/a/ 结果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/828019/201909/828019-20190929172550298-2135515154.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>总结:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">proxy_pass http://192.168.118.14/a--&gt; http://192.168.118.15/
</pre>
</div>
<p>&nbsp;</p>
<p><span style="background-color: rgba(0, 255, 0, 1)">综上所述:</span></p>
<p><span style="background-color: rgba(0, 255, 0, 1)">当 proxy_pass 不加 '/' 时, location uri 会追加到 proxy_pass http://domain/&nbsp; 后面;</span><br><span style="background-color: rgba(0, 255, 0, 1)">当 proxy_pass 加 '/' 时,不会在 proxy_pass http://domain&nbsp; 后面追加任何uri</span> </p>
<p>&nbsp;</p>
<p>切记以上两条规则。</p><br><br>
来源:https://www.cnblogs.com/hukey/p/11609030.html
頁: [1]
查看完整版本: Nginx - 代理后端通过域名访问