Nginx Practice in Windows - 3

Reference

Description

    server {
        listen       8080;
        server_name  example.com;
        location /test {
           return 200 'example.com';
        }
    }
nginx 這個 server 區塊的設定中, server_name 是用來判斷 request 的 Host header 是打算導給哪個 server. 比方說這個例子就是如果 header 指定了 example.com 會導向這個 server.

Practice

如果有找到與 request header 的 Host 相對應的 server, 就會導過去

  1. setup nginx.conf
        server {
            listen       8080;
            server_name  server1;
            location /test {
                return 200 'server1';
            }
        } 
        server {
            listen       8080;
            server_name  server2;
            location /test {
                return 200 'server2';
            }
        } 
    
  2. run "nginx -s reload"
  3. run "telnet 127.0.0.1 8080"
  4. send request
    GET /test HTTP/1.1
    Host: server2:8080
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4
    
  5. get response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 23:04:24 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server2
    

沒有指定誰是預設 server 而且透過 request header 的 Host 又找不到相對應的 server_name, 就會回傳第一個.

  1. setup nginx.conf
        server {
            listen       8080;
            server_name  server1;
            location /test {
                return 200 'server1';
            }
        } 
        server {
            listen       8080;
            server_name  server2;
            location /test {
                return 200 'server2';
            }
        } 
    
  2. run "nginx -s reload"
  3. run "telnet 127.0.0.1 8080"
  4. send request
    GET /test HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4
    
  5. get response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 22:55:05 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server1
    

有指定 default_server, 當 request header Host 找不到相對應的 server_name 時, 就會導向 default server. (文件上說0.8.21之後使用 default_server, 之前使用 default. 不過我在 nginx-1.4.3 for Windows 要使用 default 才可以. 是 Linux 版的才可改 default_server?)

  1. setup nginx.conf
        server {
            listen       8080;
            server_name  server1;
            location /test {
                return 200 'server1';
            }
        } 
        server {
            listen       8080 default;
            server_name  server2;
            location /test {
                return 200 'server2';
            }
        } 
    
  2. run "nginx -s reload"
  3. run "telnet 127.0.0.1 8080"
  4. send request
    GET /test HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4
    
  5. get response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 22:59:23 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server2
    

如果指定的 server 包含不同 ip, 那每個 ip 就會有自己的 default server.

  1. setup nginx.conf
        server {
            listen       127.0.0.1:8080;
            server_name  server1;
            location /test {
                return 200 'server1';
            }
        } 
        server {
            listen       127.0.0.1:8080;
            server_name  server2;
            location /test {
                return 200 'server2';
            }
        } 
     server {
            listen       127.0.0.2:8081;
            server_name  server3;
            location /test {
                return 200 'server3';
            }
        } 
        server {
            listen       127.0.0.2:8081;
            server_name  server4;
            location /test {
                return 200 'server4';
            }
        }
    
     
  2. run "nginx -s reload"
  3. run "telnet 127.0.0.1 8080"
  4. send request
    GET /test HTTP/1.1
    Host: localhost
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4 
  5. get responseget response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 23:20:33 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server1
  6. run "telnet 127.0.0.2 8081"
  7. send request
    GET /test HTTP/1.1
    Host: localhost
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4 
  8. get responseget response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 23:21:52 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server3
  9. setup nginx.conf
        server {
            listen       127.0.0.1:8080;
            server_name  server1;
            location /test {
                return 200 'server1';
            }
        } 
        server {
            listen       127.0.0.1:8080 default;
            server_name  server2;
            location /test {
                return 200 'server2';
            }
        } 
     server {
            listen       127.0.0.2:8081;
            server_name  server3;
            location /test {
                return 200 'server3';
            }
        } 
        server {
            listen       127.0.0.2:8081 default;
            server_name  server4;
            location /test {
                return 200 'server4';
            }
        } 
    
     
  10. run "nginx -s reload"
  11. run "telnet 127.0.0.1 8080"
  12. send request
    GET /test HTTP/1.1
    Host: localhost
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4 
  13. get responseget response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 23:20:33 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server2
  14. run "telnet 127.0.0.2 8081"
  15. send request
    GET /test HTTP/1.1
    Host: localhost
    Connection: close
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4 
  16. get responseget response
    HTTP/1.1 200 OK
    Server: nginx/1.4.3
    Date: Mon, 21 Oct 2013 23:21:52 GMT
    Content-Type: application/octet-stream
    Content-Length: 7
    Connection: close
    
    server4


沒有留言:

張貼留言

別名演算法 Alias Method

 題目 每個伺服器支援不同的 TPM (transaction per minute) 當 request 來的時候, 系統需要馬上根據 TPM 的能力隨機找到一個適合的 server. 雖然稱為 "隨機", 但還是需要有 TPM 作為權重. 解法 別名演算法...