1. 程式人生 > >nginx反向代理tomcat nginx配置反向代理示例

nginx反向代理tomcat nginx配置反向代理示例

代理服務可簡單的分為正向代理和反向代理:

1. 正向代理: 用於代理內部網路對 Internet 的連線請求(VPN/NAT),客戶端指定代理伺服器,
將本來要直接傳送給目標 Web 伺服器的 HTTP 請求先發送到代理伺服器上, 然後由代理服務
器去訪問 Web 伺服器, 並將 Web 伺服器的 Response 回傳給客戶端:(別人給我提個服務)
2. 反向代理: 與正向代理相反,如果區域網向 Internet 提供資源,並讓 Internet 上的其他使用者可以
訪問區域網內資源, 也可以設定一個代理伺服器, 它提供的服務就是反向代理. 反向代理服
務器接受來自 Internet 的連線,然後將請求轉發給內部網路上的伺服器,並將 Response 回傳給
Internet 上請求連線的客戶端:(我給別人提供服務)
一、 nginx 反向代理: Web 伺服器的排程器
1、 反向代理(Reverse Proxy)方式是指以代理伺服器來接受客戶端的連線請求,然後將請
求轉發給網路上的 web 伺服器(可能是 apachenginxtomcatiis 等),並將從 web 服務
器上得到的結果返回給請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

從上圖可以看出:反向代理伺服器代理網站 Web 伺服器接收 Http 請求,對請求進行轉發。
而且 nginx作為反向代理伺服器可以根據使用者請求的內容把請求轉發給後端不同的 web服務
器,例如靜動分離,再例如在 nginx 上建立多個虛擬主機, 這樣就成功的做到了在瀏覽器中
輸入不同域名(url) 的時候訪問後端的不同 web 伺服器或 web 群集。

2反向代理的作用
保護網站安全: 任何來自 Internet 的請求都必須先經過代理伺服器

通過配置快取功能加速 Web 請求: 可以快取真實 Web 伺服器上的某些靜態資源,減輕真
Web 伺服器的負載壓力;

實現負載均衡:充當負載均衡伺服器均衡地分發請求,平衡叢集中各個伺服器的負載壓力;

二、nginx
1nginx 簡介
Nginx 是一款輕量級的網頁伺服器、反向代理器以及電子郵件代理伺服器。因它的穩定性、
豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。 Nginx(發音同 engine x),它是
由俄羅斯程式設計師 Igor Sysoev 所開發的。起初是供俄國大型的入口網站及搜尋引擎 Rambler
(俄語:Рамблер)使用。此軟體 BSD-like 協議下發行,可以在 UNIXGNU/Linux
BSDMac OS XSolaris,以及 Microsoft Windows 等作業系統中執行。
Nginx 的應用現狀
Nginx 已經在俄羅斯最大的入口網站── Rambler Mediawww.rambler.ru)上執行,同時俄
羅斯超過 20%的虛擬主機平臺採用 Nginx 作為反向代理伺服器。
在國內,已經有 淘寶、新浪部落格、新浪播客、網易新聞、六間房、 56.comDiscuz!、水木
社群、豆瓣、 YUPOO、海內、迅雷線上 等多家網站使用 Nginx 作為 Web 伺服器或反向代
理伺服器。
2Nginx 的核心特點
1) 跨平臺: Nginx 可以在大多數 OS 編譯執行,而且也有 Windows 的版本;
2) 配置異常簡單: 非常容易上手。
3非阻塞、高併發連線: 官方測試能夠支撐 5 萬併發連線,在實際生產環境中跑到 23
萬併發連線數。(這得益於 Nginx 使用了最新的 epoll 模型);
注:
對於一個 Web 伺服器來說,首先看一個請求的基本過程:建立連線—接收資料—傳送資料,
在系統底層看來 :上述過程(建立連線—接收資料—傳送資料)在系統底層就是讀寫事件。
如果採用阻塞呼叫的方式,當讀寫事件沒有準備好時,那麼就只能等待,當前執行緒被掛起,
等事件準備好了,才能進行讀寫事件。
如果採用非阻塞呼叫的方式:事件馬上返回,告訴你事件還沒準備好呢,過會再來吧。過一
會,再來檢查一下事件,直到事件準備好了為止,在這期間,你就可以先去做其它事情,然
後再來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做
更多的事情了,但帶來的開銷也是不小的。 非阻塞呼叫指在不能立刻得到結果之前,該呼叫
不會阻塞當前執行緒
4) 事件驅動: 通訊機制採用 epoll 模型,支援更大的併發連線
非阻塞通過不斷檢查事件的狀態來判斷是否進行讀寫操作,這樣帶來的開銷很大,因此就有
非同步非阻塞的事件處理機制。這種機制讓你可以同時監控多個事件,呼叫他們是非阻塞的,
但可以設定超時時間,在超時時間之內,如果有事件準備好了,就返回。這種機制解決了上
面阻塞呼叫與非阻塞呼叫的兩個問題。
epoll 模型為例:當事件沒有準備好時,就放入 epoll(佇列)裡面。如果有事件準備好了,
那麼就去處理;當事件沒有準備好時,才在 epoll 裡面等著。這樣,我們就可以併發處理大
量的併發了,當然,這裡的併發請求,是指未處理完的請求。 執行緒只有一個,所以同時能處
理的請求當然只有一個了,只是在請求之間進行不斷地切換而已,切換也是因為非同步事件未
準備好,而主動讓出的。這裡的切換是沒有任何代價,你可以理解為迴圈處理多個準備好的
事件。
多執行緒方式相比,這種事件處理方式是有很大的優勢的, 不需要建立執行緒,每個請求佔用的
記憶體也很少, 沒有上下文切換, 事件處理非常的輕量級,併發數再多也不會導致無謂的資
源浪費(上下文切換)。對於 apache 伺服器,每個請求會獨佔一個工作執行緒,當併發數上到
幾千時,就同時有幾千的執行緒在處理請求了。這對作業系統來說,是個不小的挑戰:因為線
程帶來的記憶體佔用非常大,執行緒的上下文切換帶來的 cpu 開銷很大,自然效能就上不 去,
從而導致在高併發場景下效能下降嚴重。
總結: 通過非同步非阻塞的事件處理機制, Nginx 實現由程序迴圈處理多個準備好的事件,從
而實現高併發和輕量級。
5Master/Worker 結構:一個 master 程序,生成一個或多個 worker 程序。

注: Master-Worker 設計模式主要包含兩個主要元件 Master WorkerMaster 維護著 Worker
佇列, 將請求下發到多個 Worker 並行執行, Worker 主要進行實際邏輯計算,並將結果返回
Master
nginx 採用這種程序模型有什麼好處?採用獨立的程序,可以讓互相之間不會影響,一個進
程退出後,其它程序還在工作,服務不會中斷, Master 程序則很快重新啟動新的 Worker

程序。當然, Worker 程序的異常退出,肯定是程式有 bug 了,異常退出,會導致當前 Worker
上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。
6) 記憶體消耗小: 處理大併發的請求記憶體消耗非常小。在 3 萬併發連線下,開啟的 10
Nginx 程序才消耗 150M 記憶體(15M*10=150M)。
7) 內建的健康檢查功能: 如果 Nginx 代理的後端的某臺 Web 伺服器宕機了,不會影響
前端訪問。
8) 節省頻寬: 支援 GZIP 壓縮,可以新增瀏覽器本地快取的 Header 頭。
9) 穩定性高: 用於反向代理,宕機的概率微乎其微。
三、 Nginx+apache 構築 Web 伺服器叢集的負載均衡

nginx 配置反向代理
配置 nginx 作為反向代理和負載均衡,同時利用其快取功能,將靜態頁面在 nginx 快取,以
達到降低後端伺服器連線數的目的並檢查後端 web 伺服器的健康狀況。

nginx配置反向代理示例

環境:

nginx1:192.168.157.10

tomcat1:192.168.157.10

tomcat2:192.168.157.10

服務都在一臺伺服器上了,tomcat是兩個獨立的程式,tomcat如果裝在一臺要配置tomcat環境變數才可以啟動

 

安裝 zlib-develpcre-devel 等依賴包

yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel 

下載nginx:    wget http://nginx.org/download/nginx-1.13.0.tar.gz

由於我是測試只單獨裝預設自帶的模組,請根據自身環境情況配置自身的模組

tar xzf nginx-1.13.0.tar.gz
進入目錄 執行 ./configure  產生makefile
make
make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

完成後/usr/local/下會產生一個nginx的目錄,/usr/local/是預設二進位制程式預設位置

注: nginx 的所有模組必須在編譯的時候新增,不能再執行的時候動態載入。
注: 如果你想在已安裝好的 nginx 上新增第三方模組,依然需要重新編譯,但為了不覆蓋你
原有的配置,請不要 make install,而是直接拷貝可執行檔案:
# nginx –V

[[email protected] nginx-1.13.0]#./configure --add-module=…… #你的第三方模組
[[email protected] nginx-1.13.0] #make 後不要 make install,改為手動拷貝,先備份
[[email protected] nginx-1.13.0] #cp /usr/local/nginx1.10/sbin/nginx /usr/local/nginx1.10/sbin/nginx.bak
[[email protected] nginx-1.13.0] #cp objs/nginx /usr/local/nginx1.10/sbin/nginx

配置 nginx 反向代理: 反向代理+負載均衡+健康探測
檢視 nginx 載入的模組

[[email protected] ~]## nginx -V 
nginx version: nginx/1.13.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx1.10 --user=www --group=www
--with-http_stub_status_module --with-http_realip_module --with-http_ssl_module
--with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client
--http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi
--with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module
--add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42
nginx 的所有模組必須在編譯的時候新增,不能再執行的時候動態載入。 

配置防火牆規則或者關閉防火牆

firewall-cmd --permanent --add-port=80/tcp

vi /usr/local/nginx/conf/nginx.conf
在http內新增不要新增到server內
        upstream lxstest{
                server 192.168.157.10:9090 weight=1;
                server 192.168.157.10:8080 weight=1;
            }
在server內新增在location裡新增一條proxy_pass http://lxstest;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://lxstest;
        }

儲存並推出

nginx -t 檢視配置檔案是否正確並啟動

[[email protected] src]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[[email protected] src]# nginx
nginx -s reload 重新重新整理配置檔案

 

測試訪問,由於簡單測試,就自己隨便搞個測試頁

 

 ok完成,具體看自身情況往配置檔案加入引數

環境:

nginx1:192.168.157.10

tomcat1:192.168.157.10

tomcat2:192.168.157.10

服務都在一臺伺服器上了,tomcat是兩個獨立的程式,tomcat如果裝在一臺要配置tomcat環境變數才可以啟動

 

安裝 zlib-develpcre-devel 等依賴包

yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel 

下載nginx:    wget http://nginx.org/download/nginx-1.13.0.tar.gz

由於我是測試只單獨裝預設自帶的模組,請根據自身環境情況配置自身的模組

tar xzf nginx-1.13.0.tar.gz
進入目錄 執行 ./configure  產生makefile
make
make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

完成後/usr/local/下會產生一個nginx的目錄,/usr/local/是預設二進位制程式預設位置

注: nginx 的所有模組必須在編譯的時候新增,不能再執行的時候動態載入。
注: 如果你想在已安裝好的 nginx 上新增第三方模組,依然需要重新編譯,但為了不覆蓋你
原有的配置,請不要 make install,而是直接拷貝可執行檔案:
# nginx –V

[[email protected] nginx-1.13.0]#./configure --add-module=…… #你的第三方模組
[[email protected] nginx-1.13.0] #make 後不要 make install,改為手動拷貝,先備份
[[email protected] nginx-1.13.0] #cp /usr/local/nginx1.10/sbin/nginx /usr/local/nginx1.10/sbin/nginx.bak
[[email protected] nginx-1.13.0] #cp objs/nginx /usr/local/nginx1.10/sbin/nginx

配置 nginx 反向代理: 反向代理+負載均衡+健康探測
檢視 nginx 載入的模組

[[email protected] ~]## nginx -V 
nginx version: nginx/1.13.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx1.10 --user=www --group=www
--with-http_stub_status_module --with-http_realip_module --with-http_ssl_module
--with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client
--http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi
--with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module
--add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42
nginx 的所有模組必須在編譯的時候新增,不能再執行的時候動態載入。 

配置防火牆規則或者關閉防火牆

firewall-cmd --permanent --add-port=80/tcp

vi /usr/local/nginx/conf/nginx.conf
在http內新增不要新增到server內
        upstream lxstest{
                server 192.168.157.10:9090 weight=1;
                server 192.168.157.10:8080 weight=1;
            }
在server內新增在location裡新增一條proxy_pass http://lxstest;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://lxstest;
        }

儲存並推出

nginx -t 檢視配置檔案是否正確並啟動

[[email protected] src]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[[email protected] src]# nginx
nginx -s reload 重新重新整理配置檔案

 

測試訪問,由於簡單測試,就自己隨便搞個測試頁

 

 ok完成,具體看自身情況往配置檔案加入引數