隨着互聯網的快速發展,我們的web站點訪問量和數據流量的快速增長,對於我們服務器的處理能裏的要求也越來越高,這樣的情況下,單一的服務器根本無法承受, 這樣的話我們丟棄掉原有的設備,做硬件升級,會造成成本的浪費,如果再過一段時間,升級過後的硬件有負載不起了,怎麼辦呢?沒關係,我們有負載均衡的技術,就不用擔心了!
負載均衡通俗點說,就是一堆的計算機,或設備,同時爲用戶提供一個相同的服務,下面就來說說怎麼實現的!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先在此感謝,"馬哥"以及網友"IT你好" 的幫助,一路走來,問題不斷,感謝朋友們的支持,再次表示謝謝, “劉庸有句話說的好,(人在黑暗既又邪惡的道路上成長,才能使自己變的更加強大)” 我想表達的意思就是,在學習的過程中遇到的問題越多,那麼自己就積累的越多,當然對於那些勇於克服問題的童鞋而言,呵呵,閒話有點多了,下面來介紹下單一的nginx負載均衡是怎麼工作的,
單一nginx負載均衡,見下圖,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1,首先用戶發送請求訪問bbs.andy.com,
2,當前端nginx負載均衡服務器(上圖中的SVR1)收到用戶的請求之後,nginx負載均衡器,會根據此前配置好的調度算法,代用戶請求後端的應用程序服務器,
3,應用程序服務器(也就是上圖中的SVR2,3,4) 收到前端nginx負載均衡器的請求的時候,它並不知道是nginx負載均衡器是代用戶請求的,對於後端的應用程序服務器而言前端nginx負載均衡器就是一個用戶, 那麼它收到請求之後,將對應請求的處理結果,再返回給前端nginx負載均衡器,
4,當前端的nginx負載均衡器,收到後端應用程序服務器返回的響應內容之後再講結果返回給用戶,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
應該是這樣工作的吧,個人的理解,呵呵,說的不好,還望大傢伙指點,下面來說說LNMP分佈式架構是怎麼工作的,也就是上圖啦, 待會的配置也是根據上圖的架構來配置的,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LNMP分佈式架構的工作原理,根據上圖來,
1,用戶請求bbs.andy.com
2,前端nginx負載均衡器收到用戶請求,根據此前設定的調度算法,代用戶請求後端的應用程序服務器,假如說此時前端nginx負載均衡器,根據調度算法的結果,應該訪問svr2,這臺應用程序服務器,
3,那麼svr2這臺服務器根據用戶請求的內容的不同,而進行不同的處理機制,根據上圖的架構一般有兩種可能,
當用戶請求的內容是一個靜態的html頁面的話,那麼svr2,就直接將請求的結果響應給前端nginx負載均衡器,
當用戶請求的內容是一個動態的頁面內容(在上圖中也就是PHP頁面了)那麼svr2會去找svr4上面的FastCGI程序來幫忙解析動態php頁面,如果此次頁面請求中需要訪問數據庫的話,fastcgi會通過mysql的接口訪問數據庫的,然後將其請求的結果,返回給svr2,
當svr2收到返回的請求結果後,svr2再將結果返回給前端的nginx負載均衡器,
4,當前端的nginx負載均衡器收到請求的結果後,再將其返回給用戶,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面來配置下在nginx負載均衡的情況下,後端的LNMP應用服務器分佈式架構,根據上圖來,下面再簡單介紹下上圖中每臺服務器的角色,已經IP地址,等信息,
服務器 角色 IP地址 DNS能解析的域名
SVR1 nginx負載均衡器 192.168.0.52/172.16.0.1 bbs.andy.com解析到192.168.0.52
SVR2 nginx 172.16.0.2
SVR3 nginx/NFS 172.16.0.3
SVR4 php(FastCGI)/MySQL 172.16.0.4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SVR1負責接受用戶請求,根據調度算法,負載到SVR2 SVR3上面去,
SVR3上面有個NFS服務,是提供共享存儲的,這裏主要是共享網站的源碼
SVR4 php(FastCGI)提供SVR2 SVR3的動態PHP頁面的請求,
SVR4 MYSQL數據庫提供SVR4上的PHP(FastCGI)的數據請求等,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
單一nginx負載均衡+LNMP分佈式架構 rhel5.8的系統上實現
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
目錄
一,安裝配置SVR4
二,安裝配置SVR3
三,安裝配置SVR2
四,安裝配置SVR1
注:配置過程中需要用到的源碼包,自己在官方下載, 所有包下載至系統的/usr/src目錄
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一,安裝配置SVR4
1.安裝基本開發庫,等依賴軟件包
- #yum -y groupinstall "Development Libraries" "Development Tools" "X Software Development"
2.安裝配置mysql
2.1 編譯安裝mysql
- #cd /usr/src
- #tar xzvf mysql-5.0.56.tar.gz
- #cd mysql-5.0.56
- #./configure --prefix=/usr/local/mysql --sysconfdir=/usr/local/mysql/etc --with-ssl \
- --localstatedir=/usr/local/mysql/database --enable-assembler --with-readline \
- --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables \
- --with-embedded-server --enable-local-infile --with-plugins=innobase
- #make && make install
2.2 將mysql命令加入到系統搜索路徑
- #vim /etc/profile
- PATH=/usr/local/mysql/bin:$PATH 將次行添加到文件中的44行
- #export PATH=/usr/local/mysql/bin:$PATH
2.3 將頭文件添加到系統搜索路徑
- #ln -s /usr/local/mysql/include/mysql /usr/include/mysql
2.4 將庫文件添加到系統搜索路徑
- #echo “/usr/local/mysql/lib/mysql” > /etc/ld.so.conf.d/mysql.conf
- #ldconfig
2.5 爲mysql提供配置文件,服務啓動腳本,用戶,並初始化mysql
- #cp support-files/my-huge.cnf /etc/my.cnf
- #cp support-files/mysql.server /etc/init.d/mysqld
- #chmod a+x /etc/init.d/mysqld
- #useradd -s /sbin/nologin mysql
- #chown -R mysql:mysql /usr/local/mysql
- #mysql_install_db --user=mysql
- #chkconfig --add mysqld
- #chkconfig mysqld on
- #service mysqld restart
3,安裝配置php(FastCGI)
3.1 編譯安裝libiconv 編碼轉換庫
- #cd /usr/src
- #tar xzvf libiconv-1.13.1.tar.gz
- #cd libiconv-1.13.1
- #./configure --prefix=/usr/local
- #make && make install
3.2 編譯安裝libmcryp加密算法擴展庫
- #cd /usr/src
- #tar xjvf libmcrypt-2.5.8.tar.bz2
- #cd libmcrypt-2.5.8
- #./configure
- #make
- #make install
- #ldconfig
- #cd libltdl/
- #./configure --enable-ltdl-install
- #make && make install
3.3 編譯安裝mhash加密算法擴展庫
- #cd /usr/src
- #tar xjvf mhash-0.9.9.9.tar.bz2
- #cd mhash-0.9.9.9
- #./configure
- #make && make install
- #ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
- #ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
- #ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
- #ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
- #ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
- #ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
- #ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
- #ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
- #ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
3.4 編譯安裝mcrypt 加密算法工具
- #cd /usr/src
- #tar xzvf mcrypt-2.6.8.tar.gz
- #cd mcrypt-2.6.8
- #./configure
- #make && make install
3.5 編譯安裝php(FastCGI) 這裏使用的是5.4的版本, 5.4的版本不需要打fpm補丁就支持FastCGI
3.5.1 編譯安裝php
- #cd /usr/src
- #tar xjvf php-5.4.4.tar.bz2
- #cd php-5.4.4
- #./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql/ --with-openssl \
- --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config\
- --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir \
- --with-libxml-dir=/usr/ --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc \
- --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl --with-ldap --with-iconv-dir
- #make ZEND_EXTRA_LIBS='-liconv'
- #make install
3.5.2 爲php-fpm提供配置文件,服務啓動腳本等,
- #cp php.ini-production /etc/php.ini
- #cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
- #chmod +x /etc/rc.d/init.d/php-fpm
- #chkconfig --add php-fpm
- #chkconfig php-fpm on
- #cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
- #vim /usr/local/php/etc/php-fpm.conf 修改內容如下
- pid = /usr/local/php/var/run/php-fpm.pid
- listen = 172.16.0.4:9000
- pm.max_children = 50
- pm.start_servers = 5
- pm.min_spare_servers = 2
- pm.max_spare_servers = 8
- #service php-fpm start
二,安裝配置SVR3
1.安裝基本開發庫,及依賴軟件包
- #yum groupinstall "Development Libraries" "Development Tools"
- #yum -y install pcre-devel
2.安裝配置nginx
2.1 編譯安裝nginx
- #useradd -s /sbin/nologin nginx
- #cd /usr/src
- #tar xzvf nginx-1.2.2.tar.gz
- #cd nginx-1.2.2
- #./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module \
- --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
- #make && make install
2.2 爲nginx提供服務啓動腳本
- #vim /etc/rc.d/init.d/nginx 內容如下
- #!/bin/sh
- #
- # nginx - this script starts and stops the nginx daemon
- #
- # chkconfig: - 85 15
- # description: Nginx is an HTTP(S) server, HTTP(S) reverse \
- # proxy and IMAP/POP3 proxy server
- # processname: nginx
- # config: /etc/nginx/nginx.conf
- # config: /etc/sysconfig/nginx
- # pidfile: /var/run/nginx.pid
- # Source function library.
- . /etc/rc.d/init.d/functions
- # Source networking configuration.
- . /etc/sysconfig/network
- # Check that networking is up.
- [ "$NETWORKING" = "no" ] && exit 0
- nginx="/usr/local/nginx/sbin/nginx"
- prog=$(basename $nginx)
- NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
- [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
- lockfile=/var/lock/subsys/nginx
- make_dirs() {
- # make required directories
- user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
- options=`$nginx -V 2>&1 | grep 'configure arguments:'`
- for opt in $options; do
- if [ `echo $opt | grep '.*-temp-path'` ]; then
- value=`echo $opt | cut -d "=" -f 2`
- if [ ! -d "$value" ]; then
- # echo "creating" $value
- mkdir -p $value && chown -R $user $value
- fi
- fi
- done
- }
- start() {
- [ -x $nginx ] || exit 5
- [ -f $NGINX_CONF_FILE ] || exit 6
- make_dirs
- echo -n $"Starting $prog: "
- daemon $nginx -c $NGINX_CONF_FILE
- retval=$?
- echo
- [ $retval -eq 0 ] && touch $lockfile
- return $retval
- }
- stop() {
- echo -n $"Stopping $prog: "
- killproc $prog -QUIT
- retval=$?
- echo
- [ $retval -eq 0 ] && rm -f $lockfile
- return $retval
- }
- restart() {
- configtest || return $?
- stop
- sleep 1
- start
- }
- reload() {
- configtest || return $?
- echo -n $"Reloading $prog: "
- killproc $nginx -HUP
- RETVAL=$?
- echo
- }
- force_reload() {
- restart
- }
- configtest() {
- $nginx -t -c $NGINX_CONF_FILE
- }
- rh_status() {
- status $prog
- }
- rh_status_q() {
- rh_status >/dev/null 2>&1
- }
- case "$1" in
- start)
- rh_status_q && exit 0
- $1
- ;;
- stop)
- rh_status_q || exit 0
- $1
- ;;
- restart|configtest)
- $1
- ;;
- reload)
- rh_status_q || exit 7
- $1
- ;;
- force-reload)
- force_reload
- ;;
- status)
- rh_status
- ;;
- condrestart|try-restart)
- rh_status_q || exit 0
- ;;
- *)
- echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
- exit 2
- esac
- #chmod a+x /etc/init.d/nginx
- #chkconfig --add nginx
- #chkconfig nginx on
2.3 編輯nginx的主配置文件
- #vim /usr/local/nginx/conf/nginx.conf 內容如下
- user nginx;
- worker_processes 10;
- error_log logs/error.log crit;
- pid logs/nginx.pid;
- events
- {
- use epoll;
- worker_connections 51000;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- client_header_buffer_size 32k;
- large_client_header_buffers 4 32k;
- client_max_body_size 10m;
- 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/ccs application/xml;
- gzip_vary on;
- server {
- listen 80;
- server_name 172.16.0.3;
- index index.html index.htm index.php;
- root /web/bbs;
- location ~ .*\.(php|php5)?$
- {
- fastcgi_pass 172.16.0.4:9000;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME /web/bbs$fastcgi_script_name;
- include fastcgi.conf;
- }
- access_log logs/bbs.log;
- }
- }
2.4 創建網站根目錄以及測試文件
- #mkdir -pv /web/bbs
- #vim /web/bbs/index.php
- <h1>test</h1>
- <?php
- phpinfo();
- ?>
2.5 啓動nginx服務
- #service nginx restart
3,配置NFS
- #vim /etc/exports
- /web 172.16.0.*(rw,no_root_squash,sync)
- #chkconfig portmap on
- #chkconfig nfs on
- #service portmap restart
- #service nfs restart
三,安裝配置SVR2
1.安裝基本開發庫,及依賴軟件包
- #yum groupinstall "Development Libraries" "Development Tools"
- #yum -y install pcre-devel
2.安裝配置nginx
2.1 編譯安裝nginx
- #useradd -s /sbin/nologin nginx
- #cd /usr/src
- #tar xzvf nginx-1.2.2.tar.gz
- #cd nginx-1.2.2
- #./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module \
- --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
- #make && make install
2.2 爲nginx提供服務啓動腳本
- 見 二.2.2 的配置內容
2.3 編輯nginx的主配置文件
- #vim /usr/local/nginx/conf/nginx.conf 內容如下
- user nginx;
- worker_processes 10;
- error_log logs/error.log crit;
- pid logs/nginx.pid;
- events
- {
- use epoll;
- worker_connections 51000;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- client_header_buffer_size 32k;
- large_client_header_buffers 4 32k;
- client_max_body_size 10m;
- 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/ccs application/xml;
- gzip_vary on;
- server {
- listen 80;
- server_name 172.16.0.2;
- index index.html index.htm index.php;
- root /web/bbs;
- location ~ .*\.(php|php5)?$
- {
- fastcgi_pass 172.16.0.4:9000;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME /web/bbs$fastcgi_script_name;
- include fastcgi.conf;
- }
- access_log logs/bbs.log;
- }
- }
3.重啓nginx服務
- #service nginx restart
4.使用NFS 共享的網站目錄,以達到共享存儲的目的
- #mkdir /web
- #mount -t nfs 172.16.0.3:/web /web
- #echo "mount -t nfs 172.16.0.3:/web /web " >> /etc/rc.local
四.安裝配置SVR1
1. 安裝基本開發庫,以及依賴的軟件包
- #yum groupinstall "Development Libraries" "Development Tools"
- #yum -y install pcre-devel
2.安裝配置nginx
- useradd -s /sbin/nologin nginx
- #cd /usr/src
- #tar xzvf nginx-1.2.2.tar.gz
- #cd nginx-1.2.2
- #./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module \
- --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
- #make && make install
3.爲nginx提供服務啓動腳本
- 見 二.2.2 的配置內容
4.編輯nginx主配置文件,配置負載均衡
- #vim /usr/local/nginx/conf/nginx.conf
- user nginx;
- worker_processes 10;
- error_log logs/error.log crit;
- pid logs/nginx.pid;
- events
- {
- use epoll;
- worker_connections 51000;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- keepalive_timeout 60;
- tcp_nodelay on;
- #指定負載均衡的方式
- upstream bbs.andy.com {
- server 172.16.0.2:80;
- server 172.16.0.3:80;
- ip_hash;
- }
- server {
- listen 80;
- server_name bbs.andy.com;
- index index.html index.htm index.php;
- location / {
- proxy_pass http://bbs.andy.com;
- proxy_next_upstream http_502 http_504 error timeout invalid_header;
- 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_connect_timeout 600;
- proxy_read_timeout 600;
- proxy_send_timeout 600;
- proxy_buffer_size 8k;
- proxy_temp_file_write_size 64k;
- }
- access_log logs/bbs.log;
- }
- }
3.重啓nginx服務
- #service nginx restart
五,收尾配置,
1,需要在每臺服務器上執行以下命令
- #chkconfig iptables off
- #service iptables stop
- #setenforce 0
- #echo "setenforce 0" >> /etc/rc.local
2.需要在SVR4上掛載nfs共享
- #mkdir /web
- #mount -t nfs 172.16.0.3:/web /web
- #echo "mount -t nfs 172.16.0.3:/web /web" >> /etc/rc.local
OK.到這裏配置就結束了,
2012年7月16日凌晨3:00整 完!