nginx爲後端web服務器(apache,nginx,tomcat,weblogic)等作反向代理php
幾臺後端web服務器須要考慮文件共享,數據庫共享,session共享問題.文件共享可使用nfs,共享存儲(fc,ip存儲都行)+redhat GFS集羣文件系
統,rsync+inotify文件同步等.小規模的集羣中使用更多的是nfs.對於內容管理系統,單臺進行發佈信息,向多臺同步使用rsync+inotify就是個不錯的選擇.
小規模集羣,單臺高性能數據庫(如志強雙四核,32/64/128G內存)便可,大規模集羣可能要考慮數據庫集羣了,可使用mysql官方提供的集羣軟件,也
可使用keepalived+lvs讀寫分離作Mysql集羣.
session共享問題是一個大問題,若是nginx採用ip_hash的輪詢方法,每一個ip在必定時間內會被固定的後端服務器,這樣咱們不用解決session共享問題.反之,
一個ip的請求被輪詢分發到多臺服務器上,就要解決session共享的問題,可使用nfs共享session,把session寫入mysql或者memcache等方法,當機器規模比較大
時,通常使用把session寫入memcache裏面.css
後端的web服務器如何配置咱們這裏就不討論了,後端服務器多是apache,nginx,tomcat,lighthttp等,前端不關心後端究竟是什麼.
首先新建一個proxy.conf文件,方便後面咱們進行調用(配置多個集羣的話,把公共參數寫到一個文件,而後繼續include是不錯的方法)html
vi /usr/local/nginx/conf/proxy.conf 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; client_body_buffer_size 90; proxy_connect_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64
咱們這裏討論nginx的兩種負載均衡方式 輪詢加權(也能夠不加權,就是1:1負載)和ip_hash(同一ip會被分配給固定的後端服務器,解決session問題)
這個配置文件,咱們能夠寫到nginx.conf裏面(若是隻有一個web集羣),若是有多個web集羣,最好寫到vhosts裏面,以虛擬主機的方式,這裏我寫到nginx.conf裏面
第一種配置:加權輪詢,按服務器的性能給予權重,本例是1:2分配前端
upstream lb { server 192.168.196.130 weight=1 fail_timeout=20s; server 192.168.196.132 weight=2 fail_timeout=20s; } server { listen 80; server_name safexjt.com www.safexjt.com; index index.html index.htm index.php; location / { proxy_pass http://lb; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; include proxy.conf; } }
第二種配置:ip_hash輪詢方法,不可給服務器加權重mysql
upstream lb { server 192.168.196.130 fail_timeout=20s; server 192.168.196.132 fail_timeout=20s; ip_hash; } server { listen 80; server_name safexjt.com www.safexjt.com; index index.html index.htm index.php; location / { proxy_pass http://lb; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; include proxy.conf; } }
方法二 nginx負載均衡基於ip_hash實現session粘帖nginx
一、輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。 web
upstream backserver { server 192.168.0.14; server 192.168.0.15; }
二、指定權重
指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。 sql
upstream backserver { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
三、IP綁定 ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。 數據庫
upstream backserver { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; }
四、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。 apache
upstream backserver { server server1; server server2; fair; }
五、url_hash(第三方)
按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
在須要使用負載均衡的server中增長
proxy_pass http://backserver/; upstream backserver{ ip_hash; server 127.0.0.1:9090 down; (down 表示單前的server暫時不參與負載) server 127.0.0.1:8080 weight=2; (weight 默認爲1.weight越大,負載的權重就越大) server 127.0.0.1:6060; server 127.0.0.1:7070 backup; (其它全部的非backup機器down或者忙的時候,請求backup機器) } max_fails :容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤 fail_timeout:max_fails次失敗後,暫停的時間