海量運維常用技術之--Nginx網站負載均衡應用

火星人 @ 2014-03-04 , reply:0


海量運維常用技術之--Nginx網站負載均衡應用

現在隨著Nginx的普及,越來越大的網站開始應用Nginx了。Nginx不僅是一款用於高併發環境的Web應用伺服器軟體,它同時也是優划的負載均衡軟體,它的優點也有很多:成本低廉、配置簡單、強大的正則分發規則、對網路依賴極小,此外,穩定性也是它值得驕傲的地方。此外,Nginx+Keepalived作為很成熟的高可用集群架構方案,也越來越被大家熟悉和採用,更讓人驚訝的是,Nginx還可以作為緩存反向代理軟體,提供緩存加速功能,功能並不亞於老牌的Squid軟體,也有許多朋友在做其相關對比測試。不過Nginx只能做為七層負載均衡,對於四層的流量負載均衡,它是無能為力的。

活動組織:
余洪春(撫琴煮酒)《構建高可用Linux伺服器(第1-2版)》一書作者,系統架構師,ChinaUnix集群和高可用版版主。

本期話題:
話題1:除去Nginx以上的優點,你還能列舉其更多的優點或缺點嗎?
話題2:你維護的網站,目前採用的是哪一種緩存軟體,Varnish、Squid還是Nginx?
話題3: 以真實案例來說明Nginx在其工作中的應用

活動時間:2013.8.19——2013.9.10

邀請嘉賓:
老男孩 (老男孩linux培訓)老男孩Linux實戰運維培訓中心總裁
周華飛 北京弘睿千里信息技術有限公司認證部經理
崔曉輝( coralzd )  大眾網高級系統管理員
劉晗昭(wenzizone)  高級架構師
胡安偉(king_819)   系統運維主管,CU自動化運維版版主
劉鑫 (gray1982)    高級系統運維工程師,CU集群和高可用版版主
余洪春(撫琴煮酒)   資深項目實施工程師、系統架構師

活動禮品:
積极參与話題討論的10位CUer,可獲得《構建高可用Linux伺服器(第2版)》圖書一本


《解決方案》

這本書已買了,就不和大家搶了。
《解決方案》

回復 1# send_linux


     send_linux對這個討論主題很「情意熱忱」:emn10:
《解決方案》

jimmy-_-lixw 發表於 2013-08-20 09:52 static/image/common/back.gif
回復 1# send_linux



哈哈,主要是版主對這方面的議題很有興趣啊,上期是haproxy,這期是nginx哈,這樣以後就能形成系列了
《解決方案》

支持下send_linux

1.nginx的內存佔用,epoll模型應該算是優點吧

2.目前採用的是nginx做反向代理/負載均衡

3.實際的配置:upstream mysvr {
         ip_hash;
         server 192.168.5.103:80  max_fails=2 fail_timeout=30s;
         server 192.168.5.104:80  max_fails=2 fail_timeout=30s;
         server 192.168.5.90:80  max_fails=2 fail_timeout=30s;
         check interval=3000 rise=2 fall=5 timeout=1000;
     }
server {
        listen       80;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

        location / {
          proxy_pass        http://mysvr/;
          proxy_set_header  X-Real-IP  $remote_addr;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          client_max_body_size 50m;
          client_body_buffer_size 256k;
          proxy_connect_timeout 30;
          proxy_send_timeout 30;
          proxy_read_timeout 60;
          proxy_buffer_size 256k;
          proxy_buffers 4 256k;
          proxy_busy_buffers_size 256k;
          proxy_temp_file_write_size 256k;
          proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
          proxy_max_temp_file_size 128m;
          proxy_cache tmpcache;
          proxy_cache_key               $uri$is_args$args;
          proxy_cache_valid  200 1d;
          proxy_cache_use_stale  error timeout invalid_header updating
                                   http_500 http_502 http_503 http_504;
        }
location /nginx_status {
  # copied from http://blog.kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/
     stub_status on;
       access_log   off;
         allow 192.168.1.1;
           deny all;
           }

location ~ /purge(/.*) {
        allow                   192.168.1.1;
       deny                    all;
        proxy_cache_purge       STATIC   $1$is_args$args;
}

location /nstatus {
                check_status;
                access_log   off;
                allow 192.168.1.1;
                deny all;
           }
}
《解決方案》

本帖最後由 xueleixu 於 2013-08-20 10:02 編輯

web開發過程中,大家肯定需要配置不同的域名來區分正式環境和測試環境,那麼這個時候就有個問題,就是那些已經寫在了靜態文件(html、js、css)中的鏈接。
大家基本會選擇2種方式
(1)在測試環境中需要改成測試環境的域名,而當程序發布到正式環境的時候又要修改這些靜態文件中鏈接中的域名。
          缺點:費時費力,稍有不注意,就會有漏網之魚。
(2)另外一種就是配置客戶端的hosts映射。
          缺點:測試的時候,忘記修改hosts,往往會導致測試的目標環境不清楚,即本想訪問測試環境的,結果卻訪問到了正式環境;本想訪問正式環境,卻訪問測試環境了。

下面是我使用Nginx中的HttpSubModule模塊和第三方的substitutions4nginx模塊,來替換靜態文件中的url,來實現上面的需求
HttpSubModule,不支持正則表達式,只能配置一條命令 http://wiki.nginx.org/NginxHttpSubModule
substitutions4nginx 支持正則表達式,可以配置多條命令 https://code.google.com/p/substitutions4nginx/

通過這種方式非常好用,開發只需要關注正式環境使用的域名,而在測試環境中的鏈接都是使用Nginx中的這個功能來替換。這樣程序不需要任何修改(二進位文件是不能替換的,例如asp.net。)就可以部署到測試和正式環境中。


以上情況是在有多個域名站點的時候才會用到。如果所有程序都是用一個域名,本身就沒有上面的煩惱,只需要使用相對路徑就可以了。呵呵!


其實上面的HttpSubModule模塊和第三方的substitutions4nginx模塊,大家都不陌生,只是大家更多的應用在偷站方面。希望樓下分享更多更好的應用!
《解決方案》

用nginx做web伺服器也快3年了,從nginx0.7.x就開始用,一直延續到現在的nginx1.2.x的版本。
緩存這塊一開始是用varnish,現在在逐步往ATS(Apache Traffic Server)上遷移
Varnish這塊的配置可以給大家show一下(環境:CentOS5.6)
sysctl.conf的配置肯定是不可少的net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_recycle = 1
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2varnish版本:2.0.2
backend core_ahosting_com
{
    .host = "1.1.1.1"  ;
    .port = "80";
    .probe = {
        .url = "http://www.ahosting.com/do_not_delete/noc.gif";
        .interval  = 5s ;
        .timeout   = 2s ;
        .window    = 5 ;
        .threshold = 3 ;
    }
}

acl purge
{
    "localhost";
    "127.0.0.1";
    "1.1.1.1";
    "2.2.2.2.";
}

if (req.http.host ~ "ahosting.com")
    {
        if (req.url ~ "\.php")
        {
            return(pass);
        }
        elsif (beresp.ttl <= 0s || beresp.http.Vary == "*")
        {
            set beresp.ttl = 12h;
        }
    }
    elsif (beresp.ttl < 12h || beresp.http.Vary == "*")
    {
        set beresp.ttl = 12h;
    }
}

    if (req.request == "GET" || req.request == "HEAD") {
        return (lookup);
    }
    else {
        return (pipe);
    }
    if (! req.backend.healthy)
    {
        set req.grace=3d;
    } else {
        set req.grace=1m;
    }
}

sub vcl_fetch
{
    if (beresp.status == 500 || beresp.status == 502 || beresp.status == 503)
    {
        set beresp.saintmode=1m;
        restart;
    }

    set beresp.grace = 3d ;

    if (beresp.http.set-Cookie)
    {
        return(pass);
    }
sub vcl_error {
        set obj.http.Content-Type = "text/html; charset=utf-8";
        synthetic {"
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html>
        <head>
        <title>"} obj.status " " obj.response {"</title>
        </head><body>
        <h1>Error "} obj.status " " obj.response {"</h1>
        <p>"} obj.response {"</p>
        <h3>Guru Meditation:</h3>
        <p>XID: "} req.xid {"</p>
        <hr>
        <address>
        <a href="http://www.varnish-cache.com/">varnish cache server</a>
        </address>
        </body>
        </html>
        "};
        return (deliver);
}

《解決方案》

mark.頂一下。
《解決方案》

樓主有空把張宴請過來聊聊啊!
《解決方案》

rootsecurity 發表於 2013-08-20 10:16 static/image/common/back.gif
用nginx做web伺服器也快3年了,從nginx0.7.x就開始用,一直延續到現在的nginx1.2.x的版本。
緩存這塊一開始 ...

謝謝分享線上的資料。



[火星人 via ] 海量運維常用技術之--Nginx網站負載均衡應用已經有299次圍觀

http://www.coctec.com/docs/service/show-post-3933.html