<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Nginx專門提供了ngx_http_mirror_module模組,用來實現流量拷貝。將生產環境的流量拷貝到預上線環境或測試環境,這樣做有很多好處:
ngx_http_mirror_module模組就像是一個映象站點一樣,將所有的請求都收集起來,這個映象站點就代表了所有真實有效的原始請求。有了這個映象站點,後續就可以復現所有的請求,實現把線上的流程複製到別的地方。
下面是Nginx解壓後,編譯安裝的範例
# ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --without-http_limit_req_module --without-http_mirror_module --with-pcre=../pcre-8.43 --with-zlib=../zlib-1.2.11 --add-module=/path/to/ngx_devel_kit --add-module=/path/to/lua-nginx-module # make & make install
upstream kevin-order { server 127.0.0.1:8088; } upstream kevin-customer { server 127.0.0.1:8089; } upstream kevin-mirror1 { server 172.16.60.230:8088; } upstream kevin-mirror2 { server 172.16.60.230:8089; } server { listen 80; server_name kevin.com; access_log /usr/local/nginx/logs/kevin.com-access.log main; error_log /usr/local/nginx/logs/kevin.com-error.log; # 源站點1 location /order { proxy_pass http://kevin-order; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 複製請求體 mirror_request_body on; # 流量複製 mirror /mirror1; } # 源站點2 location /customer { proxy_pass http://kevin-customer; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; mirror_request_body on; mirror /mirror2; } # 映象站點1 location /mirror1 { proxy_pass http://kevin-mirror1$request_uri; proxy_pass_request_body on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 映象站點2 location /mirror2 { proxy_pass http://kevin-mirror2$request_uri; proxy_pass_request_body on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
設定說明:上面設定中,將存取http://kevin.com/order、http://kevin.com/customer的流量分別複製到172.16.60.230伺服器的8088和8089埠。
server { listen 80; server_name kevin.com; # 源站設定 location / { access_log /usr/local/nginx/logs/access.log accesslog; mirror /mirror; mirror_request_body on; proxy_pass http://kevin.upstream.name; } # 映象站點設定 location /mirror { internal; # 內部設定 proxy_pass http://mirror.kevin.upstream.name$request_uri; proxy_pass_request_body on; proxy_set_header X-Original-URI $request_uri; #使用真實的url重置url } }
預設是支援POST流量複製的,需要通過下面設定來禁止。
server { listen 80; server_name kevin.com; # 源站設定 location / { access_log /usr/local/nginx/logs/access.log accesslog; mirror /mirror; mirror_request_body off; proxy_pass http://kevin.upstream.name; } # 映象站點設定 location /mirror { # 判斷請求方法,不是GET返回403 if ($request_method != GET) { return 403; } internal; #內部設定 proxy_pass http://mirror.kevin.upstream.name$request_uri; proxy_pass_request_body off; # mirror_request_body和proxy_pass_request_body都設定為off,則Conten-length需要設定為"",否則有坑! proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; # 使用真實的url重置url } }
設定多分mirror映象點
server { listen 80; server_name kevin.com; # 源站設定 location / { access_log /usr/local/nginx/logs/access.log accesslog; mirror /mirror; # 多加一份mirror,流量放大一倍 mirror /mirror; mirror_request_body on; proxy_pass http://kevin.upstream.name; } # 映象站點設定 location /mirror { internal; # 內部設定 proxy_pass http://mirror.kevin.upstream.name$request_uri; proxy_pass_request_body on; proxy_set_header X-Original-URI $request_uri; #使用真實的url重置url } }
mirror中不支援設定access_log,解決方法:mirror-location跳轉到server,在server中設定accesslog。
server { listen 80; server_name kevin.com; # 源站設定 location / { access_log /usr/local/nginx/logs/access.log accesslog; mirror /mirror; mirror_request_body on; proxy_pass http://kevin.upstream.name; } # 映象站點設定 location /mirror { internal; # 內部設定 # 跳轉到下面的內部server proxy_pass http://127.0.0.1:10992$request_uri; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; #使用真實的url重置url } server { # server沒法設定為內部 listen 127.0.0.1:10992; location / { # 判斷放在server,使得post請求紀錄檔可以記錄 if ($request_method != GET) { return 403; } access_log /usr/local/nginx/logs/access.log accesslog; proxy_pass http://mirror.kevin.upstream.name; } }
映象設定不正確,導致流量複製操作沒正常執行。如果mirror映象設定缺少紀錄檔,會嚴重影響偵錯。所以強烈建議設定映象紀錄檔,設定方法如如上"設定mirror映象紀錄檔"。部分錯誤設定的錯誤資訊在在error紀錄檔中。
如果mirror_request_body
或者proxy_pass_request_body
設定為off
,則Content-Length
必須設定為"",因為nginx(mirror_request_body)
或tomcat(mirror_request_body)
處理post請求時,會根據Content-Length
獲取請求體,如果Content-Length
不為空,而由於mirror_request_body
或者proxy_pass_request_body
設定為off
,處理方以為post有內容,當request_body
中沒有,處理方會一直等待至超時,則前者為off,nginx會報upstream請求超時;後者為off,tomcat會報如下錯誤:
"2020-11-18T17:26:36.803+08:00" "331632b86ec64b829672066a96fc6324" "department" "group" "project_name" "hostname" "127.0.0.1" "" "/post" "p=11" "-" "PostmanRuntime/7.1.1" "ERROR" "xxx.GlobalControllerAdvice" "operateExp" "-" "26" "xxxx.GlobalControllerAdvice" "unknown" "org.springframework.http.converter.HttpMessageNotReadableException" "I/O error while reading input message; nested exception is java.net.SocketTimeoutException" "GlobalControllerAdvice中捕獲全域性異常" "org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.net.SocketTimeoutException at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:229) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:150) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
更多關於Nginx流量拷貝技術文章請檢視下面的相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45