實戰Nginx負載均衡高冗餘高可用WEB架構

   最近公司主力網站之一改版完成終於上線了,牽扯了我大半年的時間,如今終於有時間坐下來寫點東西,總結沉澱一下本身的技術心得。這次,根據服務器的數量和質量,我採用負載均衡高冗餘的架構,考慮單點故障,WEB也拋棄了apache,而使用的是nginx,數據庫仍是使用主、從架構。該架構目前承載80WPV,沒有大的壓力。javascript

這裏簡單談一下web的選擇疑問,是使用nginx仍是apache,不少朋友在規劃網站的時候都出現難以選擇的問題,甚至有朋友在建設初用apache後期改爲nginx。接下來我說一下個人規劃選擇,WEB到底是使用Apache仍是nginx,我認爲二者各自之間優缺點很是明顯,最終決定是要根據你的網站自身狀況來肯定,如網頁的主要內容、網站類型(電商仍是門戶等等)。總之,在考慮過網站內容、類型等方面後仍是沒法選擇,這時,大併發量我就選擇nginx,而動態請求很是頻繁的且併發量不大的網站我就使用apache。而個人這個網站是門戶網站,內容基本都生成靜態頁,動態頁面很少而且過不了多長時間就會生成html,因此我選擇使用nginxwebphp

    首先聲明,此架構適合場景:中小型網站場景,粗略預估100W PV左右。css

應用環境html

nginx:192.168.1.158java

Web服務器一:192.168.1.163node

Web服務器二:192.168.1.162mysql

主數據庫服務器:192.168.1.159linux

從數據庫+nginx192.168.1.161nginx

Nginx虛擬IP192.168.1.160web

操做系統:centos 6.4

    1、YUM和編譯安裝軟件方式的小分享

編譯安裝仍是yum安裝軟件的爭議,如今這個時代了還有人去爭論。我認爲這個事情不必爭論,也不可能爭論出結果,徹底看我的的工做習慣,我想說YUM真的很節省時間,YUM安裝軟件簡單、快捷,還有點好處能夠培養新人的linux興趣。編譯安裝能夠很好訂製化,將不須要的功能關閉掉,減小安全隱患等。YUM安裝只要關閉不須要的功能結果和編譯安裝同樣的,而編譯安裝過程當中你很詳細的掌握了軟件的安裝路徑等,真是各有優缺點,不必這上面去浪費心思。而我是按照所需時間來選擇,基本上我是個沒時間的人,因此我大多數都使用yum 方式安裝軟件。

2、主、從mysql安裝及同步

    挺簡單的配置,若是感興趣的朋友能夠參看我上篇文章《mysql linux下高可用架構的簡析及主、從複製的實戰(一)

   3、PHP安裝

   在兩臺WEB上分別安裝PHP,安裝過程很是簡單。

一、            yum install php*

service php-fpm start 啓動php-fpm

二、            調整PHP時區

要注意先調整一下php的時區和時間,若是不調整會出現PHP與系統時間不對應的錯誤。在php.ini找到;Date.timezone =   並將;去掉,改爲下圖

 wKiom1TZvhHT_O4_AACM8zgRLOY656.jpg

 

3、安裝zend加速

必定要安裝,php加速確實能提升PHP的運行速度,不裝ZEND也至少裝一種加速軟件。

以前安裝過ZEND包,因此我直接拿來用,上傳後解壓在規定目錄內。

打開php.ini配置文件,在最後添加zend的配置代碼

 

wKioL1TZv1qS7-8MAAD0nFL_XTw403.jpg

重啓php生效,service php-fpm restart

4、web服務器的安裝

由於我是個時間緊張的人,因此我採用Yum安裝。Centos 6.4自己的yum源是沒有nginx安裝包的,因此我先換源換成atomic的源,再yum安裝。

wget http://www.atomicorp.com/installers/atomic,直接下載

1、換源

Sh ./atomic

 

wKiom1TZw03infc4AAUXBGRMBb4930.jpg 

 

       默認安裝就能夠,裝完後會看到/etc/yum.repos.d/ 會有atomic.repo

爲讓更換源當即生效,輸入yum check-update YUM本身check

2、安裝nginx

Yum install nginx

安裝後nginx版本是1.6.2-23,正是我想裝的 1.6

wKiom1TZw72QdAIaAACBZReNvek137.jpg

 

修改配置mv /etc/nginx/nginx.conf /etc/nginx/nginx.bak,創建虛擬主機目錄mkdir –p /etc/nginx/vhosts/

將這段調整好的代碼寫入新的nginx.conf

 

##############################################################

#

# This is the main Nginx configuration file. 

#

# More information about the configuration options is available on

#   * the English wiki - http://wiki.nginx.org/Main

#   * the Russian documentation - http://sysoev.ru/nginx/

#

#######################################################################

 

#----------------------------------------------------------------------

# Main Module - directives that cover basic functionality

#

#   http://wiki.nginx.org/NginxHttpMainModule

#

#----------------------------------------------------------------------

 

user   root  root;

 

worker_processes 8;

 

 

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;

 

#Specifies the value for maximum file descriptors that can be opened by this process.

worker_rlimit_nofile 65535;

 

events

{

  use epoll;

  worker_connections 65535;

}

 

  

http

{

  include       /etc/nginx/mime.types;

  default_type  application/octet-stream;

  ssi on;

  ssi_silent_errors on;

  ssi_types test/shtml;

  #charset  gb2312;

     

  server_names_hash_bucket_size 128;

  client_header_buffer_size 32k;

  large_client_header_buffers 4 32k;

  client_max_body_size 8m;

     

  sendfile on;

  tcp_nopush     on;

 

  keepalive_timeout 60;

 

  tcp_nodelay on;

 

  fastcgi_connect_timeout 300;

  fastcgi_send_timeout 300;

  fastcgi_read_timeout 300;

  fastcgi_buffer_size 64k;

  fastcgi_buffers 4 64k;

  fastcgi_busy_buffers_size 128k;

  fastcgi_temp_file_write_size 128k;

  fastcgi_intercept_errors on;

 

  gzip on;

  gzip_min_length  1k;

  gzip_buffers     4 16k;

  gzip_http_version 1.0;

  gzip_comp_level 2;

  gzip_types       text/plain application/x-javascript text/css application/xml;

  gzip_vary on;

 

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

 

    access_log  /var/log/nginx/access.log  main;

 

    include /etc/nginx/vhosts/*.conf;

}

 

3、在/etc/nginx/vhosts/ 建立網站站點

Vi www.conf

server

  {

    listen       80;

    server_name  www.test.com;

    index index.html index.php;

    root  /www/web_www;

      

    location ~ .*\.(php|php5)?$

    {     

      #fastcgi_pass  unix:/tmp/php-cgi.sock;

      fastcgi_pass  127.0.0.1:9000;

      fastcgi_index index.php;

      include fastcgi.conf;

     

    }

}

 

wKiom1TZxP7gKSJ_AAFAFGNQz1g600.jpg

兩臺WEB服務器作同樣的配置。

 

5、負載均衡的實現

    nginx作負載均衡仍是很穩定,甚至不須要腳原本監控nginx進程存活狀況,我維護的幾個站基本一年有不了1、兩次,因此沒有編寫也沒有采用別人寫的監控進程腳本,可是提醒各位朋友,因網站而異,沒有什麼該有什麼不應有,適合本身的就是最好、最穩定的。

一、負載均衡nginx的安裝及配置

兩臺nginx分別安裝nginx,過程簡單就再也不詳細說明,貼出配置文件供各位朋友參考。

user root root;

worker_processes 8;

pid        /var/run/nginx.pid;

worker_rlimit_nofile 65535;

events

{

use epoll;

worker_connections 65535;

}

http{ 

include       mime.types;

default_type application/octet-stream;

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 8m;

sendfile on;

tcp_nopush     on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

gzip on;

gzip_min_length 1k;

gzip_buffers     4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types     text/plain application/x-javascript text/css application/xml;

gzip_vary on; 

 

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

    '$status $body_bytes_sent "$http_referer" '

    '"$http_user_agent" $http_x_forwarded_for';

    access_log /var/log/nginx/access.log main;

 

 

upstream backend {

   server 192.168.1.162;

   server 192.168.1.163;

}

server { 

listen 80;

server_name www.test.cn;

location / { 

root /var/www ;

index index.htm index.html index.php index.shtml;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://backend;

}  

 

 }

}

 

2yum 安裝keepalived

Yum install keepalived

 

wKiom1TZxT-ht0gUAACxSMpoo40999.jpg 

3、主keepalived的配置

Vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state MASTER

    interface eth1

    virtual_router_id 51

    priority 99 

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass test.cn     

    }

    virtual_ipaddress {

         192.168.1.160

    }

}

 

 

 

wKiom1TZxYnhrtldAAFVdNbH9dU933.jpg 

 

 

Service keepalived start

ip add 的結果以下,出現global ip  就成功了。

 

wKioL1TZxrPA4hgHAAGSZz9mV-E134.jpg 

四、keepalived的配置

 

! Configuration File for keepalived

global_defs {

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth1

    virtual_router_id 51

    priority 99 

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass test.cn     

    }

    virtual_ipaddress {

         192.168.1.160

    }

}

 

wKiom1TZxfLzYopQAAE0nL3Dbe4302.jpg 

測試過程以下:

一、分別重啓主nginx和備nginx服務器,觀察網站訪問狀況,也經過ping 虛擬IP地址192.168.1.160來觀察,看可否正常訪問網站。

經過ping是比較直觀的,只丟失1個包,網站是能正常打開。

二、分別重啓web1web2服務器,觀察網站訪問狀況。

檢查個站點打開狀況,打開完整的。

 

結果:若是兩步測試結果都不影響網站的正常訪問,說明負載均衡架構是成功的,恭喜你,是否是有種建設成功後的小喜悅。

注意點:

1、兩臺web服務器的nginx都設置了worker_connections 65535; 必須優化centos的內核,不然是起不到做用的。

vi /etc/sysctl.conf

sysctl.conf代碼的最後面加入

# Add

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

 

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

 

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

 

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

 

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.ip_local_port_range = 1024  65535

 

wKioL1TZx1eS2_teAAJD96lUsL8289.jpg

 

重啓服務器或/sbin/sysctl –p

 

2nginx日誌切分,要是你使用個人nginx日誌部分的配置,就不用再去更改,每晚凌晨會自動切分,不過log日誌路徑要放在/var/log/nginx目錄下。

 

wKioL1TZx4PywNW3AABrH0I4zUY444.jpg 

 

http://hostslinux.blog.51cto.com/8819775/1613387

相關文章
相關標籤/搜索