ngx_http_proxy_module 模块允许传送请求到其它服务器。
配置示例
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
语法 | 默认值 | 上下文 |
---|---|---|
proxy_pass URL | - | location, if in location, limit_except |
设置后端服务器的协议和地址,还可以设置可选的URI以定义本地路径和后端服务器的映射关系。
这条指令可以设置的协议是“http”或者“https”,而地址既可以使用域名或者IP地址加端口(可选)的形式来定义:
proxy_pass http://localhost:8000/uri/;
又可以使用UNIX域套接字路径来定义。该路径接在“unix”字符串后面,两端由冒号所包围,比如:
proxy_pass http://unix:/tmp/backend.socket:/uri/;
如果解析一个域名得到多个地址,所有的地址都会以轮转的方式被使用。当然,也可以使用服务器组来定义地址。
请求URI按下面规则传送给后端服务器:
● 如果proxy_pass使用了URI,当传送请求到后端服务器时,规范化以后的请求路径与配置中的路径的匹配部分将被替换为指令中定义的URI:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
● 如果proxy_pass没有使用URI,传送到后端服务器的请求URI一般客户端发起的原始URI,如果nginx改变了请求URI,则传送的URI是nginx改变以后完整的规范化URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
在1.1.12版以前,如果proxy_pass没有使用URI,某些情况下,nginx改变URI以后,会错误地将原始URI而不是改变以后的URI发送到后端服务器。
某些情况下,无法确定请求URI中应该被替换的部分:
● 使用正则表达式定义路径。
这种情况下,指令不应该使用URI。
● 在需要代理的路径中,使用rewrite指令改变了URI,但仍使用相同配置处理请求(break):
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1;
}
这种情况下,本指令设置的URI会被忽略,改变后的URI将被发送给后端服务器。
后端服务器的地址,端口和URI中都可以使用变量:
proxy_pass http://$host$uri;
甚至像这样:
proxy_pass $request;
这种情况下,后端服务器的地址将会在定义的服务器组中查找。如果查找不到,nginx使用resolver来查找该地址。
● nginx转发到一个服务器示例
访问www.nginx1.com之后就可以跳转到
tomcat页面(tomcat已启动,www.nginx1.com在PC中的host文件中已添加路由映射,linux防火墙关闭)
● nginx转发到2个服务器示例
1、首先启动2个linux,并启动tomcat服务器
2、在第一个linxu中去配置nginx的 upstream模块
3、nginx的upstream的配置信息如下:
ngx_http_upstream_module模块 允许定义一组服务器。它们可以在指令proxy_pass、 fastcgi_pass和
memcached_pass中被引用到。
配置例子
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
指令
语法 | 默认值 | 上下文 |
---|---|---|
upstream name | - | http |
定义一组服务器。 这些服务器可以监听不同的端口。 而且,监听在TCP和UNIX域套接字的服务器可以混用。
例子:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
默认情况下,nginx按加权轮转的方式将请求分发到各服务器。 在上面的例子中,每7个请求会通过以下方式分发:
5个请求分到backend1.example.com, 一个请求分到第二个服务器,一个请求分到第三个服务器。
与服务器通信的时候,如果出现错误,请求会被传给下一个服务器,直到所有可用的服务器都被尝试过。
如果所有服务器都返回失败,客户端将会得到最后通信的那个服务器的(失败)响应结果。
语法 | 默认值 | 上下文 |
---|---|---|
server address [parameters] | - | upstream |
定义服务器的地址address和其他参数parameters。
地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。
如果一个域名解析到多个IP,本质上是定义了多个server。
你可以定义下面的参数:
weight=number
设定服务器的权重,默认是1。
max_fails=number
设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。
失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。 你可以通过指令proxy_next_upstream、
fastcgi_next_upstream和memcached_next_upstream来配置什么是失败的尝试。
默认配置时,http_404状态不被认为是失败的尝试。
fail_timeout=time
设定
● 统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。
● 服务器被认为不可用的时间段。
默认情况下,该超时时间是10秒。
backup
标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。
down
标记服务器永久不可用,可以跟ip_hash指令一起使用。
Example:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
}
4、配置好nginx后(去掉权重),reload,同时去修改tomcat的index.jsp,干掉所有不需要的代码。
最好干掉他的head部分,因为里面有个tomcat.css文件,在访问www.nginx1.com时,会再次去请求这个连接下的css文件,相当于请求了2次。
最后重启tomcat,访问www.nginx1.com时,会发现在《tomcat1》和《tomcat2》之间进行切换。