写点什么

nginx 配置系列(十)代理服务(proxy_pass)

作者:乌龟哥哥
  • 2022 年 5 月 07 日
  • 本文字数:1904 字

    阅读完需:约 6 分钟

nginx配置系列(十)代理服务(proxy_pass)

ngx_http_proxy_module 模块

ngx_http_proxy_module 模块允许将请求转发到其它服务器。该模块默认会编译进 nginx 中,可以通过**--without-http_proxy_module 禁用该模块。同时,该模块下有很多指令,比如:proxy_buffer_size、proxy_cache 等。这里只说一下 proxy_pass(反向代理)**指令。

proxy_pass 指令语法:

语法:proxy_pass URL;


默认值:—


配置上下文:location、if in location、limit_except


说明:设置后端代理服务器的协议(protocol)和地址(address),以及 location 中可以匹配的一个可选的 URI。协议可以是"http"或"https"。而地址既可以使用域名或者 IP 地址加端口(端口可选)的形式来定义:


proxy_pass http://www.test.com:8000/uri/;


又可以使用 UNIX 域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如:


proxy_pass http://unix:/tmp/backend.socket:/uri/;


URL 参数规则说明如下:


①、URL 必须以 http://或者 https://开头,接下来是域名、IP、unix socket 地址或者 upstream 的名字,前两者可以在域名或者 IP 后加端口。最后是可选的 URI。(PS:虽然 这条上面已经有了大概的说明并给出了示例。。不过在重复说明下吧)****


②、当 URL 参数中携带 URI 或者不携带 URI,会导致转发出去的请求 URL 不同:


不携带 URI,则将客户端请求中的 URL 直接转发出去


​ location 后使用正则表达式、@名字时,应采用这种方式。


携带 URI,则对用户请求中的 URL 作如下操作:


​ 将 location 参数中匹配上的一段替换为该 URI。


③、该 URL 参数中可以携带变量


④、更复杂的 URL 替换,可以在 location 内的配置中添加 rewrite break 语句

proxy_pass 指令配置示例

在 nginx 中配置 proxy_pass 指令进行代理转发时,如果在 proxy_pass 后面的 url 加/,表示绝对根路径。如果没有/,表示相对路径,把匹配的路径部分也给代理走。


假设server_name为www.test.com` `当请求http://www.test.com/aming/a.html的时候,以下示例分别访问的结果是` `示例1:``location /aming/``{``  ``proxy_pass http://192.168.1.10;``  ``...``}``代理转发的请求URL是:http://192.168.1.10/aming/a.html` `示例2:``location /aming/``{``  ``proxy_pass http://192.168.1.10/;``  ``...``}` `代理转发的请求URL是:http://192.168.1.10/a.html` `示例3:``location /aming/``{``  ``proxy_pass http://192.168.1.10/linux/;``  ``...``}``代理转发的请求URL是:http://192.168.1.10/linux/a.html` `示例4:``location /aming/``{``  ``proxy_pass http://192.168.1.10/linux;``  ``...``}` `代理转发的请求URL是:http://192.168.1.10/linuxa.html
复制代码

proxy_pass 指令的其它说明:

nginx 中有两个模块都有 proxy_pass 指令。除了本文中的 ngx_http_proxy_module 模块。还有一个 ngx_stream_proxy_module 模块,这个模块也有 proxy_pass 指令。两个 proxy_pass 指令的区别就是:ngx_stream_proxy_module 模块中的 proxy_pass 指令只能在 server 段使用使用,只需要提供域名或 ip 地址和端口。可以理解为端口转发,可以是 tcp 端口,也可以是 udp 端口。

其它常用指令配置语法 - 头信息(一般都是和 proxy_pass 配合使用):

语法:proxy_set_header field value;


默认值:


proxy_set_header Host $proxy_host;


proxy_set_header Connection close;


配置上下文:http、server、location


说明:允许重新定义或者添加发往后端服务器的请求头。value 可以包含文本、变量或者它们的组合。当前配置级别中没有定义 proxy_set_header 指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:


proxy_set_header Host $proxy_host;


proxy_set_header Connection close;


如果不想改变请求头“Host”的值,可以这样来设置:


proxy_set_header Host $http_host;


如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,更好的方式是使用 $host 变量— —它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:


proxy_set_header Host $host;


此外,服务器名可以和后端服务器的端口一起传送:


proxy_set_header Host proxy_port;


如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:


proxy_set_header Accept-Encoding "";


扩展指令:proxy_hide_header、proxy_set_body

其它常用指令配置语法 - 超时(一般都是和 proxy_pass 配合使用):

语法:proxy_connect_timeout time;


默认值:proxy_connect_timeout 60s;


配置上下文:http、server、location


说明:设置与后端服务器建立连接的超时时间。应该注意这个超时时间一般不大于 75 秒。


扩展指令:proxy_read_timeout、proxy_send_timeout

发布于: 刚刚阅读数: 2
用户头像

乌龟哥哥

关注

正在努力寻找offer的大四小菜鸟 2021.03.16 加入

擅长 Hbuilder、VS Code、MyEclipse、AppServ、PS 等软件的安装与卸载 精通 Html、CSS、JavaScript、jQuery、Java 等单词的拼写 熟悉 Windows、Linux、 等系统的开关机 看–时间过得多快,不说了,去搬砖了

评论

发布
暂无评论
nginx配置系列(十)代理服务(proxy_pass)_5月月更_乌龟哥哥_InfoQ写作社区