nginx是俄羅斯的一個站點開發的,是一個輕量級的web服務軟件,還可以做反向代理,負載均衡器,是一個非常強大的軟件,下面,我將實現nginx的反向代理以及負載均衡的效果
實驗:兩臺服務器,一臺nginx做反向代理,一臺做後端web服務器
在後端的web服務器上,搭建LAMP環境
[root@node1 ~]# yum install php php-mysql mysql-server
將web服務器配置爲另一個網段地址,且同時給nginx服務器添加一塊與web服務器位於同一個網段的網卡
實驗拓撲如下所
其中nginx server上的eth1應該作爲211.70.160.0這個網段的網關
爲我們的web服務器提供主頁,並啓動httpd服務
[root@node1 ~]# cat /var/www/html/index.html <h1>this is node1 web test page</h1>
在前端的nginx服務器上,再定義一個server,反向代理到後端
server { listen 80; server_name blog.365lsy.com; location / { #location的路徑要與下面的web服務器一致 proxy_pass http://211.70.160.15; } }
首先,還得在當前windows客戶端的hosts文件添加如下映射
172.16.30.20 blog.365lsy.com
重新加載nginx配置文件,在瀏覽器中訪問
[root@localhost ~]# service nginx restart
我們查看後端的訪問日誌,可以發現,都是代理服務器的地址,那麼,我們該如何將真正的客戶端的ip地址記錄到日誌中呢?
我們可以在代理服務器向後端發起請求的報文首部中添加客戶端真實的ip地址
查看後端服務器記錄的日誌
從上面的日誌可以看出,記錄的是nginx服務器的eth1的網卡上的地址
修改配置文件
server { listen 80; server_name blog.365lsy.com; location / { proxy_pass http://211.70.160.15; proxy_set_header X-Real-IP $remote_addr; #添加頭部信息 } }
修改httpd服務的日誌格式
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 指定X-Real-IP這個頭部,並且重啓http服務 [root@node1 ~]# service httpd restart
重新加載配置文件後,訪問,在查看日誌
此時,客戶端真實的ip已經記錄到上游的httpd服務器的訪問日誌中去了
如果,此時,前端的請求併發量很大的時候,那我們如何做呢?
後端加一個web服務器,前端做負載均衡,這也是比較好的做法,那,如何實現呢?
我們可以將兩個web服務器定義成一個組,拓撲如下所示
我們爲後端的服務器提供主頁
[root@node2 ~]# cat /var/www/html/index.html <h1>Welcome to web2</h1>
同時修改日誌記錄格式,將客戶端的地址記錄到日誌文件中
[root@node2 ~]# vim /etc/httpd/conf/httpd.conf #修改如下 LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
重啓httpd服務
[root@node2 ~]# service httpd restart
在nginx服務器中定義一個組,在http中定義
upstream webs { server 211.70.160.15; server 211.70.160.16; }
upstream使用的注意事項:
1、只能用於http上下文
2、各server只能直接使用IP或主機名,不要加協議
訪問blog.365lsy.com這個域的網頁時,調用上面定義的webs組
server { listen 80; server_name blog.365lsy.com; location / { proxy_pass http://webs; #此處進行調用 proxy_set_header X-Real-IP $remote_addr; } }
重新加載配置文件,瀏覽器中訪問
[root@localhost ~]# service nginx reload
刷新後,兩個輪詢的方式顯示
在瀏覽器中訪問時,web1會出現3次,web2會出現2次,node2的web服務下線後,出現的web網頁只有node1提供的頁面了
如果,此時,後端的兩個web都宕機了,那麼,用戶的訪問就沒有了,此時,我們要定義sorry server
upstream webs { server 211.70.160.15 ; server 211.70.160.16 ; server 127.0.0.1:8088 backup; #添加本機使用場景 } server { listen 8088; #監聽在8088端口上 server_name 127.0.0.1; root /web/sorry; #站點目錄 }
爲sorry server提供主頁面
[root@localhost ~]# mkdir /web/sorry [root@localhost ~]# echo "Sorry, The site is sleep" > /web/sorry/index.html
將後端的兩個web服務器停掉
[root@node1 ~]service httpd stop [root@node2 ~]service httpd stop
重新加載配置文件,訪問
[root@localhost ~]# service nginx reload
ip_hash:相對於lvs 的sh算法,實現session綁定功能
源地址hash,實現session綁定
修改nginx的配置文件,只修改upstream部分
upstream webs { server 211.70.160.15; server 211.70.160.16; server 127.0.0.1:8088 backup; ip_hash; #添加此處選項 }
加載配置文件,訪問,別忘記啓動後端的web服務器咯
此時,無論怎麼刷新,你的瀏覽器頁面都停止node2的web2服務上,實現了session綁定
只有當node1這個web服務下線,訪問的網頁纔會訪問node1上的web服務