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 加/,表示绝对根路径。如果没有/,表示相对路径,把匹配的路径部分也给代理走。
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
版权声明: 本文为 InfoQ 作者【乌龟哥哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/4b2400aad5b7057eb8052bee9】。文章转载请联系作者。
评论