最近練習nginx+tomcat負載均衡。根據一些資料整理了大體思路,最終實現了1個nginx+2個tomcat負載均衡。
安裝JDK
1》進入安裝目錄,給所有用戶添加可執行的權限
#chmod +x jdk-7u67-linux-i586.rpm //不知這步有沒有必要
2》安裝JDK
輸入命令#rpm –ivh jdk-7u67-linux-i586.rpm
安裝完成后在/usr/目錄下生成java目錄,就是JDK的安裝目錄。# cd /usr/java
3》配置環境變量
#vi /etc/profile
這里要注意linux系統中的分隔符為冒號,而不時Windows中的分號
#set java environment
JAVA_HOME=/usr/java/jdk1.7.0_67
JAVA_BIN=/usr/java/jdk1.7.0_67/bin
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
保存退出。?
4》要使JDK在所有的用戶中使用,可以這樣:?
vi /etc/profile.d/java.sh?
在新的java.sh中輸入以下內容:?
#set java environment
JAVA_HOME=/usr/java/jdk1.7.0_67
JAVA_BIN=/usr/java/jdk1.7.0_67/bin
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
保存退出,然后給java.sh分配權限:chmod 755 /etc/profile.d/java.sh
?
32位JDK記得要給 JAVA_HOME/bin? 下的所有.sh 腳本賦予執行權限? chmod 777 *? ,今天就是沒有賦予x權限,一直找不到which? java。
64位 JAVA_HOME/bin? 下的所有文件賦予執行權限? chmod 777 * 。
5》刷新環境變量
source /etc/profile,如果沒有提示錯誤,證明配置ok
可以通過echo $CLASSPATH來查看環境配置
$echo $JAVA_HOME 應出現/usr/jdk1.8.0_60 查看JAVA_HOME是否配置成功
6》檢查環境變量
7》檢查JDK是否安裝成功。
執行java,javac,java –version,如果可以打印出相應的信息,則說明jdk安裝成功
?
安裝TOMCAT?
安裝TOMCAT只需要將TOMCAT解壓縮即可(一般情況下,Linux自帶有解壓縮.gz,.tar格式文件的工具,雙擊即可),存放在自定義目錄中,筆者自定義目錄為: /usr/tomcat
然后可以設置TOMCAT_HOME環境變量(上文中已經設置)。進入$OMCAT/bin目錄,執行./startup.sh命令,即可啟動TOMCAT,執行命令后可以看到一些TOMCAT的環境變量:
?
1》在/opt目錄下,然后在終端執行命令:
# tar –zxv -f apache-tomcat-8.0.24.tar.gz
2》改文件名:
# mv apache-tomcat-8.0.24 tomcat8
3》設置環境變量(略過仍可安裝成功)
在/usr/local/tomcat1/bin/catalina.sh中添加JAVA_HOME=/usr/java/jdk1.7.0_67
# vi /etc/profile?用vi編輯器打開該文件進行編輯(添加環境變量)
然后在文件的最尾部加入以下代碼:
CATALINA_HOME=/opt/tomcat8
export?CATALINA_HOME?
保存退出.
4》到這里TOMCAT的安裝已經完成,現在我們來測試下是否安裝成功.?現在在終端運行命令:
# /opt/tomcat/bin/startup.sh?開啟TOMCAT服務器?
啟動tomcat #???./startup.sh
關閉tomcat #???./shutdown.sh
查看是否啟動成功可以輸入ps axuwf | grep java,如果出現一大堆結果,就是啟動成功了
$cat /usr/tomcat/logs/catalina.out查看日志得知Tomcat是否正常啟動
$links -dump?http://localhost:8080/?發送HTTP請求看Tomcat是否正常啟動
然后打開瀏覽器,輸入?http://localhost:8080?如果你看到那只可愛的小貓了,就證明安裝成功了!
5》復制一個tomcat2
#分別修改tomcat1和tomcat2?端口,這里有三個端口需要修改,分別如下:? ?
shutdown?端口:8005??主要負責啟動關閉.? ?
ajp端口:8009?主要負責通過ajp均衡(常用于apache和tomcat整合)? ?
http端口:8080?可以通過web頁面直接訪問(nginx+tomcata整合)? ??
#注*?如果tomcat1三個端口分別為:8005?8009?8080?,那么tomcat2端口在此基礎上都+1,即為:8006?9009?8081? ?
?? ?
#一臺服務器上,端口不能重復,否則會報錯。? ?
#修改完端口后,然后啟動兩個tomcat,啟動命令為:?
?/usr/local/tomcat1/bin/startup.sh? ?
/usr/local/tomcat2/bin/startup.sh? ?
#如何提示沒有這個文件或者權限不足,需要tomcat?的bin目錄對sh文件賦予執行權限:chmod?o+x???*.sh? ?
#啟動后,使用netstat?-tnl?可以看到6個端口,即代表tomcat1?tomcat2成功啟動。你可以使用http://ip:8080??http://ip:8081訪問tomcat默認頁面。?
?
3.安裝Nginx
Nginx官網:http://nginx.org/
下載最新穩定版本。在安裝Nginx之前,需要先安裝gcc、 openssl、 pcre和zlib軟件庫。?Nginx依賴一些其他PCRE、openssl(依賴libssl-dev)
1.1安裝gcc、gcc-c++
安裝命令:
#yum install gcc
#yum install gcc-c++
1.2安裝openssl
openssl官網:http://www.openssl.org/
安裝版本:openssl-1.0.1i.tar.gz
安裝命令:
#tar -zxvf openssl-1.0.1i.tar.gz
#cd openssl-1.0.1i
#./config --prefix=/usr/local/openssl-1.0.1i? ? #prefix指定安裝目錄
#make
#make install
【注意】:此處使用的是config命令,而不是平常的configure命令
安裝完成后,到/usr/local/下查看是否安裝成功。如果安裝出錯,需要重新加壓縮,重新安裝。
1.3安裝pcre
Pcre的作用主要是使nginx支持HTTP rewrite模塊。
pcre官網:http://www.pcre.org/
安裝版本:pcre-8.35.tar.gz
安裝命令:
#tar -zxvf pcre-8.35.tar.gz
#cd pcre-8.35
#./configure --prefix=/usr/local/pcre-8.35? ? #prefix指定安裝目錄
#make
#make install
安裝完成后,到/usr/local/下查看是否安裝成功。如果安裝出錯,需要重新加壓縮,重新安裝。
【注意】:如果沒有安裝c++編譯器,這個軟件的安裝會報錯!
1.4安裝zlib
zlib官網:http://www.zlib.net/
安裝版本:zlib-1.2.8.tar.gz
安裝命令:
#tar -zxvf zlib-1.2.8.tar.gz
#cd zlib-1.2.8
#./configure --prefix=/usr/local/zlib-1.2.8? ? #prefix指定安裝目錄
#make
#make install
安裝完成后,到/usr/local/下查看是否安裝成功。如果安裝出錯,需要重新加壓縮,重新安裝
1.5安裝Nginx
安裝版本:nginx-1.6.1.tar.gz
安裝命令:
#tar -zxvf nginx-1.6.1.tar.gz
#cd nginx-1.6.1
#./configure
--prefix=/usr/local/nginx ????????????????#prefix指定安裝目錄
--with-openssl=/usr/local/src/openssl-1.0.0s #指的是openssl源碼路徑
--with-pcre=/usr/local/src/pcre-8.36?????? #指的是pcre的源碼路徑
--with-zlib=/usr/local/src/zlib-1.2.8 ???????#指的是zlib 的源碼路徑
--with-http_ssl_module
./configure --prefix=/usr/local/nginx --with-openssl=/usr/local/src/openssl-1.0.0s --with-pcre=/usr/local/src/pcre-8.36 --with-zlib=/usr/local/src/zlib-1.2.8 --with-http_ssl_module
?
#make
#make install
安裝完成后,到/usr/local/下查看是否安裝成功。如果安裝出錯,需要重新加壓縮,重新安裝。
?
注意:安裝成功啟動nginx,有可能會遇到下面錯誤,
[root@node1 nginx-1.5.8]# /data/nginx/sbin/nginx -t?
/data/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
解決辦法:
[root@node1 ~]# cd /lib64/?
[root@node1 lib64]# ln -s libpcre.so.0.0.1 libpcre.so.1
?
#Nginx安裝完畢,然后使用命令:/usr/local/nginx/sbin/nginx?-t?測試OK,代表nginx安裝成功。? ?
?
/usr/local/nginx/sbin/nginx?回車啟動nginx,可以通過訪問http://ip/看到nginx默認頁面。?
?
1.6編寫啟動腳本
Vi nginx.sh
#!/bin/sh
CWD=`pwd`
case $1 in
??????? start)
??????????????? /nginx/sbin/nginx;
??????????????????????? ;;
??????? stop)
??????????????? kill -2 `ps -ef|grep "/nginx/sbin/nginx"|grep -v "grep"|awk '{print $2}' `
??????????????????????? ;;
??????? restart)
??????????????? cd "$CMD"
??????????????? $0 stop
??????????????? $0 start
??????? ;;
??????? *)
??????? echo $"Usage: $0 {start|stop|restart}"
??????? exit 1
esac
exit 0
?
?
1.7關閉防火墻
(1) 重啟后永久性生效:
開啟:chkconfig iptables on
關閉:chkconfig iptables off
(2) 即時生效,重啟后失效:
開啟:service iptables start
關閉:service iptables stop
需要說明的是對于Linux下的其它服務都可以用以上命令執行開啟和關閉操作。
?
1.7配置Nginx
配置文件目錄:/usr/local/nginx-1.6.1/conf/nginx.conf
#cd /usr/local/nginx-1.6.1/conf
#vi nginx.conf
?
【修改后的配置文件如下】:
#創建進程的用戶和用戶組
user llj llj;
#服務進程數量(通常等于CPU數量或者2倍于CPU)
worker_processes 1;
#定義錯誤日志存放路徑,全局錯誤日志。建議開啟error級別日志.[ debug | info | notice | warn | error | crit ]
error_log logs/error.log error;
#error_log logs/error.log? notice;
#error_log logs/error.log? info;
#記錄進程ID的文件
pid? ? ? logs/nginx.pid;
events {
? ? #使用網絡IO模型。epoll是多路復用IO(I/O Multiplexing)中的一種方式,但是僅用于linux2.6以上內核,可以大大提高nginx的性能.Linux建議使用epoll,FreeBSD建議使用kqueue.
? ? use epoll;
? ? #一個worker_processe允許的最大連接數
? ? worker_connections? 1024;
}
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;? ?
?
?? #定義日志格式
? ? #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? logs/access.log? main;
sendfile? ? ? ? ?on;
? ? tcp_nopush? ? on;
?
? ? #http連接的持續時間
? ? keepalive_timeout? 65;
? ?
client_max_body_size?10m;?
? client_body_buffer_size??128k;? ?
#跟代理服務器連接的超時時間,必須留意這個time out時間不能超過75秒,當一臺服務器當掉時,過10秒轉發到另外一臺服務器。??
proxy_connect_timeout????10;? ?
??proxy_read_timeout???????60;? ?
??proxy_send_timeout???????10;? ?
??proxy_buffer_size????????8k;? ?
??proxy_buffers????????????4?32k;? ?
??proxy_busy_buffers_size?64k;? ?
??proxy_temp_file_write_size?64k;
# "proxy_busy_buffers_size" must be less than the size of all "proxy_buffers" minus one buffer?
?
#gzip壓縮設置
? ? #gzip? on;? ? ? ? ? #開啟gzip
? ? gzip_min_length 1k;? #最小壓縮文件大小
? ? gzip_buffers 4 16k;? #壓縮緩沖區
? ? #http的協議版本(1.0/1.1),默認1.1,前端如果是squid2.5請使用1.0
? ? gzip_http_version 1.1;
? ? #gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)
? ? gzip_comp_level 2;? ??
? ? #和http頭有關系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
? ? gzip_varyon;
? ? #gzip壓縮類型,不用添加text/html,否則會有警告信息
? ? gzip_types text/plain text/javascript text/css application/xmlapplication/x-javascript application/json;
?
#設定負載均衡的服務器列表,可以設置多個upstream,但mysvr名字要區分
? ? upstream ClusterServer1 {
? ? #weight參數表示權值,權值越高被分配到的幾率越大
? ? ? server localhost:8080? weight=5;
? ? ? server localhost:8081? weight=5;? ?
}
?
? ? server {
? ? ? #nginx監聽的端口號
? ? ? listen? ? ? 80;
? ? ? #域名可以有多個,用空格隔開
? ? ? server_name? localhost;
? ? ? #字符編碼方式
? ? ? charset utf-8;
? ? ? #設定本虛擬主機的訪問日志。關閉日志可以減少IO,提高性能。
? ? ? #access_log logs/host.access.log? main;
? ? ? #默認請求? 此處也可對網站進行動靜分離的配置
? ? ? location / {
? ? ? ? ? #定義服務器的默認網站根目錄位置
? ? ? ? ? root? html;
? ? ? ? ? #定義首頁索引文件的名稱
? ? ? ? ? index? index.html index.htmindex.jsp;
? ? ? ? ? #請求轉向mysvr 定義的服務器列表
? ? ? ? ? proxy_pass? ? http://localhost;
? ? ? ? ? proxy_redirect off;
?
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_pass?http:// ClusterServer1;? ?
proxy_redirect off;
expires??????3d;?
? ? ? ? }
? ? ? #error_page? 404? ? ? ? ? ? ? /404.html;
? ? ? #redirect server error pages to the static page /50x.html
? ? ? #
? ? ? error_page? 500 502 503 504? /50x.html;
? ? ? location = /50x.html {
? ? ? ? ? root? html;
? ? ? ? }
? ? ? #proxy the PHP scripts to Apache listening on 127.0.0.1:80
? ? ? #
? ? ? #location ~ \.php$ {
? ? ? #? ? proxy_pass? http://127.0.0.1;
? ? ? #}
? ? ? #pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
? ? ? #
? ? ? #location ~ \.php$ {
? ? ? #? ? root? ? ? ? ? html;
? ? ? #? ? fastcgi_pass? 127.0.0.1:9000;
? ? ? #? ? fastcgi_index? index.php;
? ? ? #? ? fastcgi_param? SCRIPT_FILENAME? /scripts$fastcgi_script_name;
? ? ? #? ? include? ? ? ? fastcgi_params;
? ? ? #}
? ? ? #deny access to .htaccess files, if Apache's document root
? ? ? #concurs with nginx's one
? ? ? #
? ? ? #location ~ /\.ht {
? ? ? #? ? deny? all;
? ? ? #}
? ? }
? ? # anothervirtual host using mix of IP-, name-, and port-based configuration
? ? #
? ? #server {
? ? #? ? listen? ? ? 8000;
? ? #? ? listen? ? ? somename:8080;
? ? #? ? server_name somename? alias? another.alias;
? ? #? ? location / {
? ? #? ? ? ? root? html;
? ? #? ? ? ? index index.html index.htm;
? ? #? ? }
? ? #}
? ? # HTTPSserver
? ? #
? ? #server {
? ? #? ? listen? ? ? 443 ssl;
? ? #? ? server_name localhost;
? ? #? ? ssl_certificate? ? ? cert.pem;
? ? #? ? ssl_certificate_key? cert.key;
? ? #? ? ssl_session_cache? ? shared:SSL:1m;
? ? #? ? ssl_session_timeout? 5m;
? ? #? ? ssl_ciphers? HIGH:!aNULL:!MD5;
? ? #? ? ssl_prefer_server_ciphers? on;
? ? #? ? location / {
? ? #? ? ? ? root? html;
? ? #? ? ? ? index index.html index.htm;
? ? #? ? }
? ? #}
}
NOTE: proxy_set_header是nginx的http代理模塊中的一個指令。
在nginx中的默認proxy是只能對后面real server做端口轉發的,而不能做域名轉發,即默認的是:
proxy_set_header Host $proxy_host;
我們要通過域名轉發就必須改為:
proxy_set_header Host $host;
?
1.8啟動與關閉Nginx
(1)啟動
#/usr/local/nginx-1.6.1/sbin/nginx
確保系統的 80 端口沒被其他程序占用
重新加載配置文件:
#/usr/local/nginx-1.6.1/sbin/nginx? -s? reload
(2)關閉:
#pkill nginx
(3)檢查是否啟動成功:
#netstat -ano | grep80 有結果輸入說明啟動成功
打開瀏覽器訪問此機器的 IP,如果瀏覽器出現Welcome to nginx! 則表示 Nginx 已經安裝并運行成功。如果已經配置了負載均衡服務器,則會看Tomcat中的網站頁面。
1.9進行測試
在2個tomcat的webapps目錄下建立balance文件夾(不要直接放在webapps下),在該文件夾下創建
test1.jsp,內容如下:
<%
out.println("hello world!_bytomcat1/tomcat2");
%>
<%
System.out.println("======!!=====");
%>
?
啟動nginx,然后啟動2個tomcat,在瀏覽器中輸入http://localhost/balance/test1.jsp,回車后,界面回顯hello world,測試成功。
連續快速刷新該頁面,會發現在2個tomcat的控制臺上都會輸出“==========”,此處表明服務器已經實現了負載均衡。
?
報錯Too many open files
http://www.jb51.net/article/35675.htm
104: Connection reset by peer
(111: Connection refused) while connecting to upstream
用戶在連接成功后讀取數據時,若遇到后端upstream掛掉或者不通,會收到該錯誤
?
nginx常見內部參數,錯誤總結
http://www.360doc.com/content/12/1024/11/1073512_243439687.shtml
linux下 nginx 負載均衡 單獨訪問服務器沒問題,通過負載均衡頁面加載不了,什么原因?
如果你的代理服務器能與負載服務器ping同的話 并且單獨訪問負載服務器能成功 就看看 upstream中的訪問地址與單獨訪問的地址是否相同。這個很關鍵 負載服務器上的war包最好是ROOT形式的。
nginx負載均衡器處理session共享的幾種方法
http://www.oschina.net/question/12_621
Nginx+tomcat負載均衡session問題解決
http://www.oschina.net/question/5189_4182/
?