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》之間進行切換。