開發人員學Linux(5):CentOS7編譯安裝Nginx並搭建Tomcat負載均衡環境
1.前言
在上一篇講述了JMeter的使用,在本篇就可以應用得上了。本篇將講述如何編譯安裝Nginx並利用前面的介紹搭建一個負載均衡測試環境。
2.軟體準備
Nginx-1.12.0,下載地址:https://nginx.org/download/nginx-1.12.0.tar.gz
Tomcat8(本系列已介紹過如何下載和安裝)
JMeter(本系列已介紹過如何下載和使用)
注:VirtualBox宿主機IP為“192.168.60.16,虛擬機器IP為:192.168.60.198,虛擬機器通過橋接方式接入網際網路。
3.安裝Nginx-1.12.0
3.1安裝前準備
3.1.1新增nginx使用者及使用者組
useraddnginx-s/sbin/nologin–M
上面的命令建立了名為nginx的使用者和使用者組,並且nginx使用者無法登入系統(-s /sbin/nologin限制),可以通過id nginx命令檢視:
[[email protected]~]#idnginx uid=1001(nginx)gid=1001(nginx)groups=1001(nginx)
3.1.2安裝編譯環境
在Linux下基本上都是用gcc或gcc-c++來編譯的,所以這裡通過如下命令來安裝:
yuminstallgcc*-y
另外,編譯nginx還需要安裝一些依賴庫,通過下面的命令來安裝:
yuminstallpcrepcre-developensslopenssl-develzlibzlib-devel–y
3.1.3下載nginx-1.12.0
可以通過wget來下載,如果執行時提示找不到wget命令可通過yum install wget –y來安裝,通過wget下載nginx-1.12.0的命令為:
wget-chttps://nginx.org/download/nginx-1.12.0.tar.gz
3.1.4編譯並安裝Nginx
我們假設執行/root目錄執行wget來下載nginx-1.12.0.tar.gz,那麼下載後的檔案將存在/root目錄下。
解壓檔案:
tarzxf./nginx-1.12.0.tar.gz cd./nginx-1.12.0 ./configure--user=nginx–group=nginx–prefix=/usr/local/nginx-1.12.0–with-http_stub_status_module–with_http_ssl_module make makeinstall
注:“./configure --user=nginx –group=nginx –prefix=/usr/local/nginx-1.12.0 –with-http_stub_status_module –with_http_ssl_module”表示Nginx將會以剛剛建立的nginx這個使用者的許可權來執行,安裝目錄在/usr/local/nginx-1.12.0,並附有http_stub_status和http_ssl模組。
如果不出錯的話,將會在/usr/local/nginx-1.12.0安裝Nginx。
3.1.5將nginx配置成服務
通過上面的操作,nginx可以通過命令列啟動,但nginx服務未被加入到開機自啟動列表,重啟伺服器後,未發現nginx服務,我們需要手動加入開機自啟動。
通過vim /lib/systemd/system/nginx.service來新增nginx.service檔案,並輸入如下內容:
[Unit] Description=nginx1.12.0 After=network.target [Service] Type=forking ExecStart=/usr/local/nginx-1.12.0/sbin/nginx ExecReload=/usr/local/nginx-1.12.0/sbin/nginx-sreload ExecStop=/usr/local/nginx-1.12.0/sbin/nginx-squit PrivateTmp=true [Install] WantedBy=multi-user.target
注意:如果不是安裝在/usr/local/nginx-1.12.0/目錄下,請根據實際安裝路徑修改ExecStart、ExecReload、ExecStop中的值。
更改nginx.service為可執行:
chmod755/lib/systemd/system/nginx.service
設定開機自啟動
systemctlenablenginx.service
至此,已將nginx設定為隨系統啟動了,在這裡使用systemctl start nginx來啟動(如果不嫌麻煩也可以重啟CentOS7)。
可以在瀏覽器中輸入http://localhost來檢視效果。為方便截圖,我在宿主機中開啟觀看效果,虛擬機器的IP我設定為:192.168.60.198,效果如下圖所示:
注:為防止我們編輯出錯導致nginx無法啟動,我們可以先用nginx –t來測試nginx.conf檔案是否存在語法錯誤。在本篇中nginx程式安裝在/usr/local/nginx-1.12.0目錄,因此可執行如下命令:
/usr/local/nginx-1.12.0/sbin/nginx –t
執行效果如下圖:
如果得到的不是測試成功的資訊,那麼需要對nginx.conf進行檢查,否則無法啟動成功。
4.Nginx負載均衡設定
4.1配置Tomcat雙例項
為簡單起見,我們將本系列中已經配置好的Tomcat拷貝一份出來,並做一些修改以當做第二個Tomcat伺服器。在之前的介紹中我們將Tomcat8安裝在/usr/local/apache-tomcat-8.5.15,並且配置為隨系統啟動,下面我們將其拷貝一份到/usr/lib目錄:
cp/usr/local/apache-tomcat-8.5.15/usr/lib
然後修改新位置的tomcat配置:
vim/usr/lib/apache-tomcat-8.5.15/conf/server.xml
要修改的地方有幾處:
<Server port="8005" shutdown="SHUTDOWN">中的”8005”改為”8006”;
<Service name="Catalina">中的"Catalina"改為"Catalina81";
<Connector port="8080" protocol="HTTP/1.1"中的”8080”改為”8081”;
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />中的”8009”改為”8010”;
同時要更改/usr/lib/ apache-tomcat-8.5.15/bin/setenv.sh中的配置,要更改的有幾處:
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.15
export CATALINA_BASE=/usr/local/apache-tomcat-8.5.15
分別改為:
export CATALINA_HOME=/usr/lib/apache-tomcat-8.5.15
export CATALINA_BASE=/usr/lib/apache-tomcat-8.5.15
因為監聽8080埠的Tomcat已經隨系統啟動,只需執行/usr/local/apache-tomcat-8.5.15/bin/startup.sh啟動監聽8081埠的Tomcat即可。
同時為便於識別,修改監聽8081埠的Tomcat的root目錄下的index.jsp頁面,將首頁中的“
If you're seeing this, you've successfully installed Tomcat. Congratulations!”改為“If you're seeing this, you've successfully installed Tomcat. Congratulations!Server port:8081!”。
在宿主機中開啟http://192.168.60.198:8080的介面如下:
在宿主機中開啟http://192.168.60.198:8081的介面如下:
4.2Nginx負載均衡設定
對nginx.conf的改動如下:
注意:我們配置了一個名為”tomcat_test”的upstream,然後註釋了原來的location的內容,同時新增了一個,裡面有一個proxy_pass的設定為http://tomcat_test,它們是相對應的。
至此,負載均衡配置成功,我們在宿主機中開啟虛擬機器對應的IP,會發現前文所展示的兩個tomcat首頁的都會出現。
如下圖所示:
從圖中可以看出,URL地址均為http://192.168.60.198,但響應被Nginx分發到兩個Tomcat例項上了,也就是在這種情況下“Nginx並不響應請求,而是請求的傳輸工”。
5.Nginx配置反向代理
5.1名詞解釋
所謂反向代理,是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
這裡也提一下正向代理,正向代理,也就是傳說中的代理,他的工作原理就像一個跳板。某個使用者不能訪問某些網站(例如被牆),但是牆外的一臺伺服器可以訪問那些被牆的網站,並且這個使用者可以訪問這個未被牆的伺服器,於是每次使用者需要訪問被牆網站上的資源時先告訴這臺伺服器,伺服器從被牆網站上下載下來後交給使用者,上述的伺服器就是代理伺服器,通常也被簡稱代理。這種代理方式就是正向代理。
這裡再舉兩個通俗一點的例子。
在某個大公司裡由於經常出差的人比較多,所以公司安排了一個人專門來處理這些事情,每次大家要出差之前就把行程資訊高速這個人,這個人就負責預定火車票、飛機票及酒店等,成功後就把相關資訊告訴要出差的人。在未被告知之前,要出差的人對外部的列車時刻表、航班資訊表及酒店價格表均不知情,在將要出差的人腦子裡那些都是透明的。這種方式即為正向代理。
在某個大公司裡業務專業化程度很高,外部經常有客戶需要諮詢,為了便於更快捷地服務和響應客戶公司成立了一個客戶支援部門,一旦有客戶需求過來,客戶支援部門立即快速定位到需要響應的部門並將響應傳遞過去,響應完成後技術支援部門將響應反饋給客戶,在客戶那裡甚至都不知道公司內部到底有哪些部門。這種方式即為反向代理。
簡單地說,正向代理是內部不知道、不關心外部細節,反向代理是外部不知道、不關心內部細節。
5.2nginx配置
為了保險起見,我們將nginx.conf做一下備份。
首先進入到nginx的安裝目錄:
cd/usr/local/nginx-1.12.0 cp./conf/nginx.conf./conf/nginx_bak.conf
在真實的環境中,通常一個nginx會有多個站點的配置,如果所有站點的配置資訊都放在nginx.conf中那將非常不便於管理和維護,為此我們可以將每個站點的配置資訊放在單獨的檔案中,然後在nginx中include進來。在本次演示中我們將建立兩個虛擬站點:www.goodapp.net及bbs.goodapp.net,這兩個站點分別以上一節的兩個Tomcat例項對應,及埠號8080和8081。
建立目錄以存放站點的配置資訊:
mkdir ./conf/vhosts
然後編輯nginx.conf為如下內容:
#usernginx; worker_processes1; #error_loglogs/error.log; #error_loglogs/error.lognotice; #error_loglogs/error.loginfo; #pidlogs/nginx.pid; events{ worker_connections1024; } http{ includemime.types; default_typeapplication/octet-stream; log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; access_loglogs/access.logmain; sendfileon; #tcp_nopushon; keepalive_timeout65; gzipon; includevhosts/www.goodapp.net.conf; includevhosts/bbs.goodapp.net.conf; }
www.goodapp.net的配置檔案www.goodapp.net.conf的內容:
upstreamtomcat8081jsp{ server127.0.0.1:8081; } server{ listen80; server_namewww.goodapp.net; access_loglogs/www.access.logmain; error_loglogs/www.error.log; #roothtml; #indexindex.htmlindex.htmindex.jspindex.php; location/{ proxy_passhttp://tomcat8081jsp; #ProxySettings proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_502http_503http_504; proxy_max_temp_file_size0; proxy_connect_timeout90; proxy_send_timeout90; proxy_read_timeout90; proxy_buffer_size4k; proxy_buffers432k; proxy_busy_buffers_size64k; proxy_temp_file_write_size64k; } }
bbs.goodapp.net的配置檔案bbs.goodapp.net.conf的內容:
upstreamtomcat8080jsp{ server127.0.0.1:8080; } server{ listen80; server_namebbs.goodapp.net; access_loglogs/bbs.access.logmain; error_loglogs/bbs.error.log; #roothtml; #indexindex.htmlindex.htmindex.jspindex.php; location/{ proxy_passhttp://tomcat8080jsp; #ProxySettings proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_502http_503http_504; proxy_max_temp_file_size0; proxy_connect_timeout90; proxy_send_timeout90; proxy_read_timeout90; proxy_buffer_size4k; proxy_buffers432k; proxy_busy_buffers_size64k; proxy_temp_file_write_size64k; } }
三個檔案的存放位置:
nginx.conf:位於/usr/local/nginx-1.12.0/conf下
www.goodapp.net.conf:位於/usr/local/nginx-1.12.0/conf/vhosts下
bbs.goodapp.net.conf:位於/usr/local/nginx-1.12.0/conf/vhosts下
5.3Tomcat配置
檢查一下兩個Tomcat例項是否啟動:
netstat -ntlp |grep 80
在本人機器上結果如下:
[[email protected] nginx-1.12.0]# netstat -ntlp |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1037/nginx: master
tcp6 0 0 :::8080 :::* LISTEN 1553/java
tcp6 0 0 :::8081 :::* LISTEN 4071/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1553/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 4071/java
tcp6 0 0 :::8009 :::* LISTEN 1553/java
tcp6 0 0 :::8010 :::* LISTEN 4071/java
可以看出nginx在監聽80埠,而兩個Tomcat例項分別監聽8080和8081埠,其中監聽8080埠的Tomcat被設定成隨系統啟動,如果發現沒有程序監聽此埠可以通過systemctl start tomcat.service來啟動;監聽8081埠的Tomcat例項是我們手動設定的,如果沒有程序監聽此埠可以通過/usr/lib/apache-tomcat-8.5.15/bin/startup.sh來啟動。
5.4host配置
由於www.goodapp.net和bbs.goodapp.net兩個網站相應的域名解析不正確(我知道的原因是因為goodapp.net這個域名是我註冊的,因為國外VPS響應時間太長而國內需要備案,所以最近沒怎麼用),我們需要在host檔案進行配置,在輸入網站域名時它的解析優先順序是高於任何DNS伺服器的。
在CentOS7中這個hosts檔案位於/etc目錄下,在Windows中這個hosts檔案位於C:\Windows\System32\drivers\etc目錄下。
在hosts檔案中新增如下內容並儲存:
192.168.60.198 www.goodapp.net
192.168.60.198 bbs.goodapp.net
5.5結果檢查
上述工作完成後,通過systemctl reload nginx來重新載入配置檔案,在宿主機開啟瀏覽器輸入網址http://www.goodapp.net/,效果如下:
在宿主機開啟瀏覽器輸入網址http://bbs.goodapp.net/,效果如下:
至此,Nginx反向代理配置成功。
總結:Nginx是高負載Web網站中常用的軟體之一,它不僅體積小,而且開源免費、功能強大。在本篇講述瞭如何編譯安裝Nginx,以及如何設定負載均衡和反向代理。Nginx上手容易,但是要用好還是需要一番功夫的。
宣告:本文首發於本人個人微信訂閱號:zhoujinqiaoIT,其後會同時在本人的CSDN、51CTO及oschina三處部落格釋出,本人會負責在此四處答疑。
轉載於:https://blog.51cto.com/zhoufoxcn/1932544