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

举报
炒香菇的书呆子 发表于 2022/05/07 23:22:25 2022/05/07
【摘要】 ngx_http_proxy_module 模块ngx_http_proxy_module 模块允许将请求转发到其它服务器。该模块默认会编译进nginx中,可以通过**–without-http_proxy_module禁用该模块。同时,该模块下有很多指令,比如:proxy_buffer_size、proxy_cache等。这里只说一下proxy_pass(反向代理)**指令。 proxy...

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 h o s t : 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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。