Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。客戶端不需要任何配置就可以訪問。反向代理是感知不到的。
正向代理,是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。正向代理可以感知。
nginx支持配置反向代理,通過反向代理實現網站的負載均衡。
一、nginx的下載
官網:http://nginx.org/en/download.html
下載里面的最新穩定版 Stable version nginx/Windows-1.14.1
下載下來是個壓縮包nginx-1.14.1.zip,解壓如下
確保默認80端口沒被使用,雙擊nginx.exe,在瀏覽器地址欄輸入localhost,可看到如下界面
二、nginx的常用命令(在cmd命令行下定位到nginx目錄)
start nginx 開啟nginx nginx -v 顯示 nginx 的版本。 nginx -s stop 快速關閉Nginx,可能不保存相關信息,並迅速終止web服務。 nginx -s quit 平穩關閉Nginx,保存相關信息,有安排的結束web服務。 nginx -s reload 修改Nginx配置信息后,不需要關閉nginx后重新啟動nginx,可讓改動生效。 nginx -s reopen 重新打開日志文件。 nginx -c filename 為 Nginx 指定一個配置文件,來代替缺省的。 nginx -t 不運行,僅測試配置文件。nginx 將檢查配置文件的語法正確性,並嘗試打開配置文件中所引用到的文件。
三、簡單實現負載均衡
1、准備兩個tomcat,本次測試用apache-tomcat-9.0.0.M15,復印一份,分別重命名為apache-tomcat-9.0.0.M15-1、apache-tomcat-9.0.0.M15-2
2、修改這兩個tomcat的各3個端口,其中第一個tomcat的啟動端口為10001,第2個tomcat的啟動端口為10002,打開tomcat的conf目錄下的server.xml,修改如下:
apache-tomcat-9.0.0.M15-1
<Server port="10011" shutdown="SHUTDOWN"> (原來是8005) <Connector port="10001" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> (原來是8080) <Connector port="10021" protocol="AJP/1.3" redirectPort="8443" /> (原來是8009)
apache-tomcat-9.0.0.M15-2
<Server port="10012" shutdown="SHUTDOWN"> (原來是8005) <Connector port="10002" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> (原來是8080) <Connector port="10023" protocol="AJP/1.3" redirectPort="8443" /> (原來是8009)
為了下面nginx區分訪問的是哪一個tomcat,修改上面兩個tomcat的默認頁面webapps\ROOT\index.jsp,簡單加個標識,
訪問http://localhost:10001,標識“Apache Tomcat/9.0.0.M15 ------tomcat1”,如下
訪問http://localhost:10002,標識“Apache Tomcat/9.0.0.M15 ------tomcat2”,如下
3、修改nginx配置文件
D:\javatool\nginx-1.14.1\conf\nginx.conf
因為我本機的80端口被占用了,所以修改nginx的端口為10000,詳細見下圖:
4、啟動nginx
在命令行下start nginx后,一個窗口一閃而過,可以在cmd命令窗口輸入命令 tasklist /fi "imagename eq nginx.exe" ,出現如下結果說明啟動成功
5、瀏覽器訪問http://localhost:10000
可看到訪問的是http://localhost:10001或http://localhost:10002,
手工刷新,可看到兩者的訪問比例是1:2,就是上面nginx.conf配置的weight值1和2。
-------------------------------------------------------------------------------------------------------------
附:
Nginx負載均衡的upstream目前支持以下幾種方式的分配
#1、輪詢(默認)
#每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。
upstream linuxidc { server 10.0.0.10; server 10.0.0.11; }
#2、weight
#指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。
upstream linuxidc{ server 10.0.0.10 weight=5; server 10.0.0.11 weight=10; }
#2、ip_hash
#每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
但是存在一個問題:假如訪問的tomcat掛了,那nginx的故障轉移機制將會分發給另一個tomcat服務器,這樣一來所有請求這個tomcat的所有用戶session會失效,需要重新登陸。
upstream favresin{ ip_hash; server 10.0.0.10:8080; server 10.0.0.11:8080; }
#3、fair(第三方)
#按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream favresin{ server 10.0.0.10:8080; server 10.0.0.11:8080; fair; }
#4、url_hash(第三方)
#按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。
upstream還能夠為每一個設備設置狀態值,這些狀態值的含義分別例如以下:
down 表示單前的server臨時不參與負載。
weight 默覺得1.weight越大,負載的權重就越大。
max_fails :同意請求失敗的次數默覺得1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤.
fail_timeout : max_fails次失敗后。暫停的時間。
backup: 其他全部的非backup機器down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。
upstream bakend{ #定義負載均衡設備的Ip及設備狀態 ip_hash; server 10.0.0.11:9090 down; server 10.0.0.11:8080 weight=2; server 10.0.0.11:6060; server 10.0.0.11:7070 backup; }
四、實現動態和靜態分離、綁定域名的配置
nginx.conf的配置如下
server { listen 80; #端口號 server_name xxx.com; #域名 #charset koi8-r; #access_log logs/host.access.log main; location ~ .*\.(jpg|png|gif|jpeg|css|html|swf)$ {#針對這些擴展名生效 root D:/deploy/static/; #靜態資源的路徑 } location /js/ { #針對路徑/js/生效 root D:/deploy/static/; #靜態資源的路徑 } location / { proxy_pass http://localhost:8080; #tomcat的地址 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for; } #...其它省略... }
五、nginx集群Tomcat,nginx采用輪詢方式的Session共享解決
多個Tomcat,可以使用Tomcat內置的Session復制方案。
1、多個Tomcat的相關端口號配置不一樣;
參考:https://www.cnblogs.com/gdjlc/p/7026052.html
2、打開tomcat目錄下conf/server.xml,找到下面配置,默認是注釋的,取消注釋
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
3、打開項目的web.xml(不是tomcat/conf/web.xml),增加<distributable/>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!--這里是其它配置,略--> <distributable/> </web-app>
4、nginx.conf的配置
upstream local_tomcat{ server localhost:8080; server localhost:8090; } server { listen 80; #端口號 server_name xxx.com; #域名 #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://local_tomcat; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for; } #其它略...... }