nginx反向代理proxy_pass遇到的死循環(huán)問(wèn)題
nginx反向代理proxy_pass遇到的死循環(huán)
為了解決接口調(diào)用的跨域問(wèn)題,跨域使用nginx的反向代理來(lái)解決
最簡(jiǎn)單的代碼示意如下:
server{ server www.demo.com; location /api/ { proxy_pass http://hello.test.com/api/; } }
但是運(yùn)行nginx,訪問(wèn)代理后的接口,發(fā)現(xiàn)響應(yīng)特別慢,過(guò)一段時(shí)間后出現(xiàn) 413 Request Entity Too Large 這樣的提示。
然后查看nginx的日志,發(fā)現(xiàn)日志中的請(qǐng)求頭內(nèi)容出現(xiàn)了大量重復(fù)的ip地址,似乎是請(qǐng)求出現(xiàn)了無(wú)限死循環(huán),然后就出現(xiàn)了請(qǐng)求內(nèi)容過(guò)大的提示。
那定位了大概的問(wèn)題,搜索關(guān)鍵字“nginx proxy_pass 循環(huán)”
找到了問(wèn)題的原因和解決辦法:
server{ server www.demo.com; location /api/ { proxy_set_header Host "hello.test.com"; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://hello.test.com/api/; } }
就是需要修改請(qǐng)求頭,不要讓www.demo.com帶到proxy_pass的請(qǐng)求頭中,否則會(huì)再次調(diào)用反向代理,導(dǎo)致代理出現(xiàn)死循環(huán)。
直接將proxy_set_header 的Host寫(xiě)死就解決了問(wèn)題。
nginx反向代理基本設(shè)置的21個(gè)指令
1,proxy_pass
設(shè)置被代理服務(wù)器的地址,可以主機(jī)名,IP加端口號(hào)的形勢(shì),語(yǔ)法位:proxy_pass URL
下面舉例說(shuō)明:
upstream proxy_sers { server 192.168.123.1/URI; server 192.168.123.2/URI; server 192.168.123.3/URI; } server{ listen 80; server_name www.form1.cn; location / { proxy_pass http://proxy_sers; #server中指明 http:// 在proxy_pass就不需要指定 } }
proxy_pass中URL是否包含URI的問(wèn)題,當(dāng)訪問(wèn) www.form1.cn/server
location /server/ { server_name www.form1.cn; proxy_pass http://192.168.123.2; }
由于proxy_pass中URL不包含URI,所以轉(zhuǎn)向的地址為 http://192.168.123.2/server
location /server/ { server_name www.form1.cn; proxy_pass http://192.168.123.2/loc; }
由于proxy_pass中URL指明了URI,所以轉(zhuǎn)向的地址為 http://192.168.123.2/loc
proxy_pass http://192.168.123.2; www.form1.cn/server/ http://192.168.123.2/server/ proxy_pass http://192.168.123.2/; www.form1.cn/server/ http://192.168.123.2/
2,proxy_hide_header
Nginx在發(fā)送HTTP響應(yīng)時(shí),可以去掉相關(guān)的響應(yīng)頭信息:
proxy_hide_header Set-Cookie;
3,proxy_pass_header
默認(rèn)情況下,Nginx服務(wù)器在發(fā)送響應(yīng)報(bào)頭時(shí),報(bào)文頭中不包含"Date 、Server、X-Accel"等來(lái)自代理服務(wù)器的頭域信息。proxy_pass_header可以調(diào)置這些頭域信息以被發(fā)送
語(yǔ)法為
proxy_pass_header field;
field 為需要發(fā)送的頭域
4,proxy_pass_request_body
配置是否將客戶端請(qǐng)求的請(qǐng)求體發(fā)送給代理服務(wù)器。
語(yǔ)法為
proxy_pass_request_body on | off;
默認(rèn)為開(kāi)啟狀態(tài)(on)
5,proxy_pass_request_headers
配置是否將客戶端請(qǐng)求的請(qǐng)求頭發(fā)送給代理服務(wù)器。
語(yǔ)法為
proxy_pass_request_headers on | off;
默認(rèn)為開(kāi)啟狀態(tài)(on)
6,proxy_set_header
可以更改nginx服務(wù)接收到的客戶端請(qǐng)求的請(qǐng)求頭信息,然后將新頭發(fā)送給被代理服務(wù)器。
語(yǔ)法為
proxy_set_header field value;
默認(rèn)值:
proxy_set_header Host $proxy_host; proxy_set_header Connection close;
7,proxy_set_body
可以更改nginx服務(wù)接收到的客戶端請(qǐng)求的請(qǐng)求體信息,然后將新體發(fā)送給被代理服務(wù)器。
語(yǔ)法為
proxy_set_body value;
8,proxy_bind
強(qiáng)制將與代理主機(jī)的連接綁定到指定IP地址。
語(yǔ)法為
proxy_bind address; 其中 address為IP地址
9,proxy_connect_timeout
配置Nginx服務(wù)器與后端被代理服務(wù)器嘗試建立連接的超時(shí)時(shí)間,
語(yǔ)法為
proxy_connect_timeout time; 其中time為設(shè)置的超時(shí)時(shí)間,默認(rèn)為 60s;
10,proxy_read_timeout
配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出read請(qǐng)求后,等待響應(yīng)的超時(shí)時(shí)間,
語(yǔ)法為
proxy_read_timeout time; 其中time為設(shè)置的超時(shí)時(shí)間,默認(rèn)為 60s;
11,proxy_send_timeout
配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出write請(qǐng)求后,等待的響應(yīng)超時(shí)時(shí)間,
語(yǔ)法為
proxy_send_timeout time; 其中time為設(shè)置的超時(shí)時(shí)間,默認(rèn)為 60s;
12,proxy_http_version
設(shè)置用于Nginx服務(wù)器提供代理服務(wù)的HTTP協(xié)議版本,
語(yǔ)法為
proxy_http_version 1.0 | 1.1;
默認(rèn)為 1.0版本。1.1版本支持upsteam服務(wù)器組設(shè)置中的keepalive指令
13,proxy_method
設(shè)置Nginx服務(wù)器請(qǐng)求被代理服務(wù)器時(shí)使用的請(qǐng)求方法,一般為 POST 或者 GET ,設(shè)置了該值,客戶端的請(qǐng)求方法將被忽略。
語(yǔ)法為
proxy_method POST | GET;
14,proxy_ignore_client_abort
用于設(shè)置在客戶端中斷網(wǎng)絡(luò)請(qǐng)求時(shí),Nginx服務(wù)器是否中斷對(duì)被代理服務(wù)器的請(qǐng)求,
語(yǔ)法為
proxy_ignore_client_abort on | off;
默認(rèn)為 off ,客戶端斷了,nginx對(duì)被代理服務(wù)器也斷
15,proxy_ignore_headers
用于設(shè)置一些HTTP響應(yīng)頭中的頭域,Nginx服務(wù)器接收到被代理服務(wù)器的響應(yīng)數(shù)據(jù)后不會(huì)處理被設(shè)置的頭域
語(yǔ)法為
proxy_ignore_headers field....
field為要設(shè)置的HTTP響應(yīng)頭的頭域,例如 "X-Accel-Redirect 、X-Accel-Expires 、EXpires 、Cache-Control 、Set-Cookie"
16,proxy_redirect
假設(shè)前端url是example.com。后端server域名是csdn123.com,那么后端server在返回refresh或location的時(shí)候,host為csdn123.com,顯然這個(gè)信息直接返回給客戶端是不行的,需要nginx做轉(zhuǎn)換,這時(shí)可以設(shè)置:
proxy_redirect http://csdn123.com /
nginx會(huì)將host及port部分替換成自身的server_name及l(fā)isten port。不過(guò)這種配置對(duì)server_name有多個(gè)值的情況下支持不好。
我們可以用nginx內(nèi)部變量來(lái)解決這一問(wèn)題:
proxy_redirect http://csdn123.com http://$host:$server_port
17,proxy_intercept_errors
配置一個(gè)狀態(tài)是開(kāi)啟還是關(guān)閉。
開(kāi)啟時(shí):被代理服務(wù)器返回狀態(tài)碼為 400或400以上,Nginx服務(wù)器使用自己的 error_page。
關(guān)閉時(shí):Nginx直接將代理服務(wù)器返回的狀態(tài)碼返回給客戶端
語(yǔ)法為
proxy_intercept_errors on | off;
18,proxy_headers_hash_max_size
存放HTTP報(bào)文頭的哈希表的容量
默認(rèn)為
proxy_headers_hash_max_size 512;
19,proxy_headers_hash_bucket_size
Nginx服務(wù)器申請(qǐng)存放HTTP報(bào)文頭的哈希表容量的單位大小
默認(rèn)為
proxy_headers_hash_max_size 64;
對(duì)(18和19):在啟動(dòng) Nginx 的時(shí)候,有時(shí)候會(huì)遇到這樣的一個(gè)錯(cuò)誤:
解決辦法就是在配置文件中新增以下配置項(xiàng):
proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400;
20,proxy_next_upstream
如果Nginx定義了 upstream 后端服務(wù)器組,如果組內(nèi)有異常情況,將請(qǐng)求順次交給下一個(gè)組內(nèi)服務(wù)器處理
語(yǔ)法為
proxy_next_upstream status...
可以是一個(gè)也可以是多個(gè)
status = error,timeout,invalid_header,http_500 502 503 504 404,off
21,proxy_ssl_session_reuse
該指令用于配置是否使用基于SSL安全協(xié)議的會(huì)話連接(htts://)被代理服務(wù)器,
語(yǔ)法為
proxy_ssl_session_reuse on | off;
默認(rèn)為開(kāi)啟 on,如果在錯(cuò)誤日志中發(fā)現(xiàn)“SSL3_GET_FINISHED:digest check fiailed”的情況,關(guān)閉該指令即可
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Nginx服務(wù)器的反向代理proxy_pass配置方法講解
- Nginx代理proxy pass配置去除前綴的實(shí)現(xiàn)
- nginx 反向代理之 proxy_pass的實(shí)現(xiàn)
- nginx配置中proxy_pass反向代理502的bug記錄
- nginx配置proxy_pass代理轉(zhuǎn)發(fā)時(shí)報(bào)404問(wèn)題
- nginx代理參數(shù)proxy_pass的實(shí)現(xiàn)
- Nginx?反向代理緩存(proxy_cache)的實(shí)現(xiàn)
- nginx反向代理proxy_set_header
- Nginx Proxy Manager輕松搭建反向代理的實(shí)現(xiàn)
- Nginx Proxy 代理測(cè)試的實(shí)現(xiàn)
相關(guān)文章
利用Nginx_geo模塊實(shí)現(xiàn)CDN調(diào)度的配置方法
今天小編就為大家分享一篇利用Nginx_geo模塊實(shí)現(xiàn)CDN調(diào)度的配置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08使用Nginx+Tomcat實(shí)現(xiàn)負(fù)載均衡的全過(guò)程
很多用到nginx的地方都是作為靜態(tài)伺服器,這樣可以方便緩存那些靜態(tài)文件,比如CSS,JS,html,htm等文件,下面這篇文章主要給大家介紹了關(guān)于使用Nginx+Tomcat實(shí)現(xiàn)負(fù)載均衡的相關(guān)資料,需要的朋友可以參考下2022-05-05nginx啟動(dòng)、關(guān)閉及重啟等簡(jiǎn)單命令小結(jié)
這篇文章主要介紹了使用命令行重啟Nginx的方法,包括修改配置文件后重啟以使更改生效,查看端口占用情況,以及如何關(guān)閉Nginx,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03