mod_proxy - ProxyPassãBalancerMemberã®ãã©ã¡ã¼ã¿ã®documentãèªãã ã®ã§ã¾ã¨ãã
- http://httpd.apache.org/docs/2.2/en/mod/mod_proxy.html#proxypass
- http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html#proxypass
timeoutã¨ãconnectionã¨ããä»ã¾ã§çé¢ç®ã«ã¿ã¦ãªãã£ãã®ã§ãmod_proxyã®documentã¯ç¿»è¨³ã追ãã¤ãã¦ãªãããããæ¥æ¬èªã®ãã¼ã¸ã«è¨è¼ããã¦ããå 容ã¯å¤ãversionã®ãã®ãããã®ã§ããªãã¹ãè±èªã®ãã¼ã¸ãè¦ãã»ããè¯ãã
ã¨ãã¾ã¡ã¢ã£ãå 容ãè¨é²ãä½è£ã¯å¾ã§æ´ããã
ãã¨ã"ã¾ã¨ãã"ã¨ãè¨ã£ã¦ããã©ãå
¨é¨ã®ãã©ã¡ã¼ã¿ã«ã¤ãã¦èª¿ã¹ãããã§ã¯ãªãã§ãã
parameter: default
Description
timeout: ProxyTimeoutã®è¨å®å¤
- ProxyTimeoutã®defaultå¤ã¯Timeoutã¨åãå¤
- Timeoutã®defaultå¤ã¯300
ã¤ã¾ãProxyPassã®timeoutã®defaultã¯300ç§ãtimeoutã¯backendã«æ¥ç¶ãã¦ããã®ã³ãã¯ã·ã§ã³ã¿ã¤ã ã¢ã¦ããtimeoutã§æå®ããç§ã ããbackendããã®ãã¼ã¿åä¿¡(ã¸ã®éä¿¡) ãå¾ ã¤ã(Apache waits for data sent by / to the backend.) ãã®éã«ãã¼ã¿ã®éåä¿¡ããªãã£ãããbackendã¨ã®æ¥ç¶ãã¿ã¤ã ã¢ã¦ãã¨è¦ãªãã¦ãclientã«ã¯502 Proxy Errorãè¿ãã
ã¢ããªã±ã¼ã·ã§ã³ã«ããã ãããã©ã300ç§å¾ ã¤ã®ã¯é·ãã®ã§æ°10ç§ç¨åº¦ã«æ¸ãããã»ããè¯ããããªæ°ããã¾ãã300ç§ãå¾ ã¤ç¶æ³ã£ã¦æ¢ã«backendã®ãµã¼ãã¯ãã³ããªç¶æ ã ã¨æãã®ã§ããããªãããã£ã¨æ©ã段éã§clientã«ã¨ã©ã¼ãè¿ãã¡ããã°ãããããªãã£ã¦ããã
apache æ¥æ¬èªã®timeoutã®èª¬æã«ã¯ "ç¹ã«æå®ãããªããã°ã ããªã¼ãªã³ãã¯ã·ã§ã³ãåå¾ã§ããã¾ã§å¾ ã¡ã¾ã" ã¨æ¸ãã¦ãããã©ããã¶ãããã¯connectiontimeoutã®è©±ã ã¨æããapache 2.2.10 ããconnectiontimeout ãã©ã¡ã¼ã¿ã追å ããããããªã®ã§ããã¶ãæ¥æ¬èªã®ç¿»è¨³ã®ã»ãã追ãã¤ãã¦ããªããapacheã®CHANGESãè¦ãã¨ãChanges with Apache 2.2.10ã®ã¨ãã«æ¬¡ã®æç« ãããã®ã§ã
mod_proxy: Add connectiontimeout parameter for proxy workers in order to be able to set the timeout for connecting to the backend separately.
å人çã«ã¯timeoutã£ã¦ããè¨èãç´ããããæãããã ãã©ãProxyPassã®timeoutã¯ãbackendã«æ¥ç¶ãã¦ããã¬ã¹ãã³ã¹ã帰ã£ã¦ããã¾ã§ã®å ¨ä½ã®æéã§ã¯ãªãã¦ãæ¥ç¶ä¸ã«timeoutç§éãã¼ã¿ã®éåä¿¡ããªãã£ããã¿ã¤ã ã¢ã¦ãããããã®ãã®ã
ããã«ã¤ãã¦ã¯hiroseããã®ã¨ã³ã㪠フロント/バックのreverse proxy構成で、指定秒数以内に必ずレスポンスを返す方法 ãã¨ã£ã¦ãã«åèã«ãªããProxyPassã®timeoutã5ç§ã«è¨å®ãã¦ããç¶æ
ã§ã8ç§ésleepããURL "?t=8" ã«ã¢ã¯ã»ã¹ããã¨ã¿ã¤ã ã¢ã¦ããããæ¬¡ã«ã2ç§ããã«ãã¼ã¿ãè¿ãã¦åè¨12ç§ã®ã¬ã¹ãã³ã¹ããããURL "?d=1" ã§ã¯ã¿ã¤ã ã¢ã¦ããçºçãã¦ããªãã
curlã®çµæã ãã§ã¯ãããã«ãããã©ãngrep -t -q -W byline port "backend appãµã¼ãã®port" ã¨ãã§ãã±ãããã£ããã£ãã¤ã¤curlãå©ãã°ãã¡ããã¡ããã¬ã¹ãã³ã¹ãè¿ã£ã¦ãã¤ã¤ãæå¾ã¾ã§ã¬ã¹ãã³ã¹ãåä¿¡ãã¦ãããã¨ããããã(timeoutãã¦ããªã)
# ngrep -t -d any -q -W byline port 8888 T 2010/09/05 10:56:26.362847 10.0.0.1:53995 -> 10.0.0.2:8888 [AP] GET /app/?d=1 HTTP/1.1. Host: backend:8888. User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15. Accept: */*. X-Forwarded-For: 192.168.0.1. X-Forwarded-Host: www.example.com. X-Forwarded-Server: www.example.com. Connection: Keep-Alive. . T 2010/09/05 10:56:26.371997 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] HTTP/1.0 200 OK. Date: Sun, 05 Sep 2010 01:56:26 GMT. Server: Plack::Handler::Starlet. Content-Type: text/plain. T 2010/09/05 10:56:26.372048 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] delayed 1 T 2010/09/05 10:56:28.374015 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] delayed 2 T 2010/09/05 10:56:30.374786 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] delayed 3 T 2010/09/05 10:56:32.375671 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] delayed 4 T 2010/09/05 10:56:34.376626 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] delayed 5 T 2010/09/05 10:56:36.377451 10.0.0.2:8888 -> 10.0.0.1:53995 [AP] delayed 6
ãã¨ããã£ããã£ãã¦åãã¦ãã£ããã ãã©ãProxyPassã®keepalive=off ã¯backendã«éä¿¡ããHTTPã®keepaliveã®ãã¨ã§ã¯ãªãã¦ãOSã¬ãã«(TCP)ã®è©±ã®ããã ããã®è©±ã¯æ¬¡ã®keepaliveã®é
ç®ã§ã
connectiontimeout: timeoutã¨åã
- timeoutã¨åã == defaultã§ã¯300ç§
apache 2.2.10ã§è¿½å ããããã©ã¡ã¼ã¿ãbackendã«ã³ãã¯ã·ã§ã³ã確ç«ããã¾ã§ã®timeout(ç§)ãæ°åã®å¾ãã«ms ãã¤ããã¨ããªç§åä½ã«ãªãã(By adding a postfix of ms the timeout can be also set in milliseconds)
timeoutã®è¨å®ã¨åãããdefaultã®300ç§ã¯é·ãæ°ããããconnectiontimeoutã¯frontã®apacheãbackendã«æ¥ç¶ããã¾ã§ã®æéãªã®ã§ã300ç§ãå¾
ã¤ã£ã¦é·éããããï¼ã£ã¦ããã
keepalive: off
backendã¨ã®æ¥ç¶ãTCPã¬ãã«ã§keepaliveãããã©ãããæ®éã¯offã§è¯ããapache documentã«ã¯ãapache <=> backendéã«firewallããã£ã¦ãfirewallã«packetãè½ã¨ãããå ´åã¯keepalive on ã«ãã¦ããã£ã¦æ¸ãã¦ããã
ã¾ããtimeoutã®ã¨ãã§ãæ¸ãããã©ãbackendã«éä¿¡ããHTTPã®keepaliveã®è©±ã§ã¯ãªãããªã®ã§keepalive=offã«ãã¦ã¦ããbackendã«ã¯"Connection: Keep-Alive"ã§HTTPãã¦ãã(disablereuse=onã«ãã¦ããã¡)
HTTPã®keepaliveãoffã«ãããå ´åã¯ã"SetEnv proxy-nokeepalive 1" ãè¨å®ããã¨backendã¨ã®HTTPæ¥ç¶ãkeepaliveããªããªãã
For circumstances where mod_proxy is sending requests to an origin server that doesn't properly implement keepalives or HTTP/1.1, there are two environment variables that can force the request to use HTTP/1.0 with no keepalive. These are set via the SetEnv directive.
<Location /buggyappserver/> ProxyPass http://buggyappserver:7001/foo/ SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1 </Location>
(ãã®ä¾ã®force-proxy-request-1.0 ã¯HTTP/1.1 ã«å¯¾å¿ãã¦ãªãappãµã¼ãã«å¯¾ããå¦ç)
backendã¸ã®æ¥ç¶ãkeepaliveãã/ããªãã®æ¯éã«ã¤ãã¦ã¯ä»¥ä¸ã®urlãã¨ã£ã¦ãåèã«ãªãã
retry: 60
backendã¸ã®ã³ãã¯ã·ã§ã³ãã¼ã«ãã¨ã©ã¼ç¶æ
ã«ãªã£ãéã«ããªãã©ã¤ããã¾ã§ã®ééã0ã«ããã¨ãééãéããã«å¸¸ã«ãªãã©ã¤ããã
æå¤§60ç§éãªãã©ã¤ããªãã®ã¯å°ãé·ãæ°ããããã ãã©ãã©ãã§ããããã10~30 ãããã«æ¸ããããªãapache documentã«ã¯ãbackendãµã¼ãã®ã¡ã³ããã³ã¹ã®ããã«retryãã©ã¡ã¼ã¿ä½¿ã£ã¦ãã¨æ¸ãã¦ããã ãã©ãå人çã«ã¯ã¡ã³ããã³ã¹ããå ´åã¯BalancerMemberãè§¦ãæ´¾(䏿çã«ã³ã¡ã³ããããã/balancer-managerããæä½ããã)ãªã®ã§retryã¯60ç§ããããªãããªã¨ã
disablereuse: off
backendã¨ã®ã³ãã¯ã·ã§ã³ã使ãçµãã£ãããåå©ç¨ããã«ããéããã¨ãã«ã¯onã«è¨å®ãapache documentã§ã¯ãapache <=> backendéã«firewallãå± ã¦ãããã£ã¨ã³ãã¯ã·ã§ã³ãè½ã¨ããããããå ´åããbackendãµã¼ããDNS ã©ã¦ã³ãããã³ä¸ã§åãã¦ãå ´åã«å½¹ç«ã¤ããã£ã¦æ¸ãã¦ãã(keepaliveã«ä¼¼ã¦ããï¼)
kazuhoããã®ã¨ã³ããªã«æ¸ãã¦ãã£ããããã©ãfrontã®apacheãã³ãã¯ã·ã§ã³ãçæãããªã¼ããããã£ã¦ãbackendã®ã¢ããªã±ã¼ã·ã§ã³ã®è² è·(ãã·ã¹ãã å
¨ä½ã®ãªã¼ãããã)ããã¯ãã£ã¨å°ããã¨æãã®ã§ãonã§æ¯åéãã¦ãã®ãå®å
¨ãªæ°ãããã
mod_proxyã£ã¦ã¾ã æ¯ãã¦ãªãããããçµæ§ãããããªbugããã£ãããã¾ããããapache 2.2.12ã§ä¿®æ£ããããã©ãmod_proxy_ajpãéãã¹ã¬ããã®ã³ã³ãã³ãè¿ããã°ã¨ããã£ããã(ãã®bugãdisablereuse on ã«ãã¦ããçºçããªããã©ããã¯ç¥ããªããã©)
loadfactor: 1
BalancerMemberç¨ã®éã¿ä»ãã®å¤ã§1 ãã 100ã¾ã§ã®æ°åãè¨å®ãè¤æ°ã®BalancerMemberãåå¨ããå ´åã¯æ£è¦åããå²åã§æ¯ãåãããåºæ¬çã«ã¯å
¨BalancerMemberã§åãå¤ã«ãã¦ãçåã«æ¯ãåããã°è¯ããã§ãã¹ããã¯ã®ãããµã¼ãã«ã¯loadfactorã大ããå¤ã«è¨å®ããã¨ãã
route: -
mod_proxy_balancerã§æ¯ãåããéã®ã«ã¼ãã£ã³ã°ã§ä½¿ãworkerãã»ãã·ã§ã³IDã®æ«å°¾ã«ä»å ããããjvm1ã¨ãapp1ã¨ãé©å½ã«ã
max: preforkã¯å¸¸ã«1, workerã¯ThreadsPerChild
"1ããã»ã¹ãããã®"backendãµã¼ãã¸ã®æå¤§æ¥ç¶æ°(hard maximimum)ãmaxã®å¤ã¯apacheå
¨ä½ã®æ°ã§ã¯ãªãã¦ã1ããã»ã¹ãããã®æ°ã
ã¤ã¾ããProxyPassã«è¨å®ããbackendã¸ã®æå¤§æ¥ç¶æ°ã¯apacheå
¨ä½ã§ã¯ä»¥ä¸ã®éãã
- prefork: ServerLimit * max(常ã«1)
- worker: ServerLimit * max(defaultã¯ThreadsPerChildã®æ°å¤)
ã¨ãªãã®ã§ãdefaultã ã¨preforkãworkerãMaxClientsåã ãbackendã¸åææ¥ç¶ããã
(prefork: MaxClients(256) == ServerLimit)
(worker: MaxClients(400) == ServerLimit(16) * ThreadsPerChild(25))
apacheã®MaxClientsããããbackendã¸ã®æå¤§æ¥ç¶æ°ããã¼ãããå ´å
åè¿°ã®ããã«defaultã®ProxyPassã®å ´åã¯ãapacheã®MaxClinetsåã ãbackendã¸åææ¥ç¶ããå¯è½æ§ããã£ã¦ãé常ããã¯å¤§ããããå¤ãªã®ã§ä½ã¨ããããã
ãã ãpreforkã®å ´åã¯apacheãããã»ã¹åä½ã§åãã¦ããããæ¸ããããããªããtimeoutçãé§ä½¿ãã¦ä½ã¨ããããã
䏿¹ãworkerã®å ´åã¯maxã«å°ããå¤ãè¨å®ããã°ãMaxClientsããããã£ã¨å°ããå¤ã«ãããã¨ãå¯è½ã
ex)
## workerã®default MaxClients 400 ServerLimit 16 ThreadsPerChild 25 ProxyPass /app http://backend:8080/app min=0 max=5
ã«ããã°ãapache(worker)ã®æå¤§åææ¥ç¶æ°ã¯400ã§ãbackendã¸ã®æå¤§åææ¥ç¶æ°ã¯16 * 5 = 80 ã«ãªãã
maxã®å¤ã«ã¤ãã¦ã®åéã
åéãã£ã¦ããã俺ãdocumentãã¡ããã¨èªãã§ãªãã£ãã®ãæªããã ãã©ã
Hard Maximum number of connections that will be allowed to the backend server. The default for a Hard Maximum for the number of connections is the number of threads per process in the active MPM. In the Prefork MPM, this is always 1, while with the Worker MPM it is controlled by the ThreadsPerChild. Apache will never create more than the Hard Maximum connections to the backend server.
å½åãæå¾ã®ä¸æãå°è±¡ã«æ®ã£ã¦ãmaxã®è¨å®å¤ãapacheå ¨ä½ã®backendã¸ã®æ¥ç¶æ°ã ã¨åéããã¦ãã¾ã£ããâã®MLã®äººã俺ã¨åãåéãããã¦ãã
- http://www.apacheserver.net/mod_proxy-ProxyPass-max-parameter-has-no-effect-at192660.htm
- http://osdir.com/ml/httpd-apache/2010-07/msg00067.html
ProxyPass /myapp ajp://localhost:8009/myapp max=2
This is a simplified config, but is enough to reproduce the issue, which is that the max parameter has no effect. If I through 10 concurrent requests to Apache, all 10 are forwarded to Tomcat at the same time, while I would like to have them forwarded 2 by 2. Should I use something other than the max parameter for this?
"In the Prefork MPM, this is always 1"ãªãã ãããããProxyPassã®maxãapacheå
¨ä½ã®hard limitã ã£ãããprefork ã§ã¯ backendã¸ã®æ¥ç¶ãæå¤§1ã«ãªã£ã¦ãã¾ããã©ãèãã¦ãããã¯ããããã
min: 0
1ããã»ã¹ãããã®backendãµã¼ãã¨å¸¸ã«æ¥ç¶ãã¦ããã³ãã¯ã·ã§ã³ã®æå°æ°
smax: max
1ããã»ã¹ãããã®backendã¨ã®æ¥ç¶ã«å¿ãã¦çæãããã³ãã¯ã·ã§ã³ã®soft limitãttlãéããã³ãã¯ã·ã§ã³ã¯åæããã
ttl: -
smaxãè¶ããã³ãã¯ã·ã§ã³ã®çåæé(ç§)
mod_proxy_balancerç¨ã®parameter
ProxyPassãbalancer://~ ã«ä½¿ç¨ããéã®parameter
timeout: 0
ããªã¼ã®workerãåå¾ããã¾ã§ã®å¾ æ©æé(ç§)ãdefaultã®0ç§ã§ã¯å¾ æ©ããªãã
stickysession: -
backendã¸ãã¼ããã©ã³ã¹ããéã«ä½¿ç¨ããã¹ãã£ããã¼ã»ãã·ã§ã³åãæ®éã¯Cookieçã§ä½¿ç¨ãããJSESSIONID(tomcat)ãPHPSESSIONID(php) ãªã©ã大æåãå°æåã¯å¤å¥ãããã
apache 2.2.6 ãã㯠"|"ã§åºåã£ã¦ãcookie/urlç¨ã®sessionåãæå®ã§ããã
If the backend application server uses different name for cookies and url encoded id (like servlet containers) use | to to separate them. The first part is for the cookie the second for the path.
Changes with Apache 2.2.6
*) mod_proxy: Allow to use different values for sessionid
in url encoded id and cookies. PR 41897. [Jean-Frederic Clere]
ã¨ããã®ããtomcatã®å ´åcookieã§ã¯"JSESSIONID"ã ãã©ãcookieä¸å¯ã®å ´åã¯urlã«;jsessionid ã¨ããæåãåãè¾¼ãã®ã§ãã®æ¸ãæ¹ãå¿ è¦ã«ãªãã
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid nofailover=On
ã¾ã¨ã
- ex) workerã§ãbackendã¸ã®åææ¥ç¶æ°ãå°ãªãã«ãã¦ãtimeout/retryãçãã«ããè¨å®
timeoutã¨connectiontimeoutã¯ProxyTimeoutã§è¨å®ãã¦ãè¯ãã
MaxClients 400 ServerLimit 16 ThreadsPerChild 25 <Proxy balancer://mycluster> BalancerMember http://backend1:8080 min=0 max=5 timeout=30 connectiontimeout=30 retry=30 disablereuse=on keepalive=off BalancerMember http://backend2:8080 min=0 max=5 timeout=30 connectiontimeout=30 retry=30 disablereuse=on keepalive=off </Proxy> <Location /app > SetEnv proxy-nokeepalive 1 ProxyPass balancer://mycluster/app ## apache 2.2.12 and later ProxyPassReverse /app balancer://mycluster/app </Location>
ProxyPassReverseå ã®balancerã«ã¤ãã¦ã¯ããã£ã¡ã§æ¸ããã
ãã¨ã§èª¿ã¹ã
- ProxySet
parameterã¯ProxySetã§ãè¨å®ã§ããã®ã§ãè¤æ°ã®BalancerMemberã«åãparameterãè¨å®ããå ´å㯠ProxySet balancer://~ ã使ãã»ãã便å©ããã
ProxySet balancer://foo lbmethod=bytraffic timeout=15
ãã ãæ¸ãã¦ã¿ããtimeoutã¯æ¸ãããã©min,max,keepaliveçãæ¸ããªãã£ã¦ããå¾®å¦ãªæãã
ãããã balancer:// ã«ã¯keepalive ã®è¨å®ãåºæ¥ãªãã ãã§ãã£ã¦ã
ProxySet http://foo keepalive=on
ã§ããã°åé¡ãªãã£ãã