<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1151291115;
        mso-list-type:hybrid;
        mso-list-template-ids:-1475436698 702158118 67436547 67436549 67436545 67436547 67436549 67436545 67436547 67436549;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:20.25pt;
        text-indent:-18.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:56.25pt;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:92.25pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:128.25pt;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:164.25pt;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:200.25pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:236.25pt;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:272.25pt;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:308.25pt;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="CS" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">i love Nginx, but i have some specific problem. Nginx cache depends also on some browser-specific factors.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">In one project, we need to work with Nginx as “Static webpage mirror” for occasional outages or scheduled downtimes of primary server.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">99% visitors just browsing this website and only 1% is working actively (fills some forms, etc.), so static mirror is for us important feature. Cookies can be totally ignored.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Setup:<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">For example domain “domain.com”<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">Production public IP: 1.2.3.4, <o:p>
</o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">Primary production server LAN IP (behind NAT): IP 10.0.0.1 (HTTP.. only Apache, without Nginx)<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">Secondary server with Nginx LAN IP (behind NAT): IP 10.0.0.2 (setup as reverse proxy for 10.0.0.1 with configured Nginx cache)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Normal situation:<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">public IP is NAT-ed to 10.0.0.1<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">on secondary server is in hosts record “10.0.0.2 domain.com www.domain.com”<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">on secondary server is crawler job, which every day crawl whole domain.com including images, styles, etc.<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">on secondary server is Nginx configured to save cache of all requests for 48 hours and ignore all cache-control-headers from primary server<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:2.25pt"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:2.25pt"><span lang="EN-US">Primary server outage (expected state):<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">On router, NAT for 1.2.3.4 is changed from primary server IP 10.0.0.1 to secondary server 10.0.0.2<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left:20.25pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore">-<span style="font:7.0pt "Times New Roman"">         
</span></span></span><![endif]><span lang="EN-US">Secondary server properly handle all GET/HEAD request from its static cache (and in this situation, is for GET/HEAD fully independent from primary server accessibility)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">What is a problem?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Nginx cache works with some other factors and “proxy_cache_key” is not so unique ID, as i expected :)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">After i crawl this website by Google Chrome, for Google Chrome, cache from secondary server works great (all requests are with HIT state). But when i access to the same domain and same URL from other browser (iOS, Safari,
 Firefox, IE, Opera, Wget, Curl, etc.), Nginx cache show in log “MISS” for these requests and trying to load URL content from primary server (which is down, so it doesn’t work).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">So, this static website works partially and just for some browsers, that was close to browser/crawler, which was crawling website to load into nginx cache.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I found, that one of these factors is “Vary” header and after ignoring this header, it works better. But, there are still some other factors/header.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Could you help me with it? :)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I need to setup Nginx to be independent on browser headers and write/load cache really just for unique URL and request method.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I know - there are factors like browser capabilities to handle content encoding, etc. and Nginx need to handle it properly.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I just need to bring best efficiency of this solution to our client. For example, it’s OK to have this static cache working without gzipping.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Thank you for you help!<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Jan</span><o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">---<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Below is my nginx configuration:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_cache_key "$scheme$request_method$host$request_uri ";<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_cache_min_uses     1;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_cache_use_stale   error timeout invalid_header updating http_500 http_502 http_503 http_504;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_cache_revalidate  off;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_http_version      1.1;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_next_upstream     off;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_cache_lock on;<o:p></o:p></span></i></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">proxy_cache_path /var/lib/nginx/tmp/cache/domain.com levels=1:2 keys_zone=domain_com:32m max_size=15G inactive=2880m loader_files=500 loader_threshold=500;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">server {<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    listen 10.0.0.2:80;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    access_log  /var/log/nginx/domain.com.access.log main buffer=64k;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    error_log   /var/log/nginx/domain.com.error.log warn;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    root        /usr/share/nginx/html;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    server_name www.domain.com domain.com;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    if ($request_method !~ ^(GET|HEAD)$ ) {<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">        return 503;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    }<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    location / {<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_cache domain_com;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_pass http://10.0.0.1:80;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_connect_timeout 3s;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_read_timeout 3s;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_send_timeout 3s;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_cache_valid any 2880m;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_ignore_headers Set-Cookie X-Accel-Expires Expires Cache-Control Vary;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_hide_header "Cache-Control";<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_hide_header "Set-Cookie";<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_hide_header "Vary";<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_set_header Host $host;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_set_header X-Real-IP $remote_addr;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_set_header HTTP_REMOTE_ADDR $remote_addr;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_set_header REMOTE_ADDR $remote_addr;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000"><o:p> </o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      proxy_set_header Accept-Encoding ""; # Deny compression in Apache<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      <o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">      add_header X-Proxy-Cache $upstream_cache_status;<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">    }<o:p></o:p></span></i></p>
<p class="MsoNormal"><i><span lang="EN-US" style="color:#C00000">}<o:p></o:p></span></i></p>
</div>
</body>
</html>