① 為什麼要用nginx來做反向代理
nginx 這個輕量級、高性能的 web server 主要可以干兩件事情:
〉直接作為http server(代替apache,對PHP需要FastCGI處理器支持);
〉另外一個功能就是作為反向代理伺服器實現負載均衡
以下我們就來舉例說明如何使用 nginx 實現負載均衡。因為nginx在處理並發方面的優勢,現在這個應用非常常見。當然了Apache的 mod_proxy和mod_cache結合使用也可以實現對多台app server的反向代理和負載均衡,但是在並發處理方面apache還是沒有 nginx擅長。
1)環境:
a. 我們本地是Windows系統,然後使用VirutalBox安裝一個虛擬的Linux系統。
在本地的Windows系統上分別安裝nginx(偵聽8080埠)和apache(偵聽80埠)。在虛擬的Linux系統上安裝apache(偵聽80埠)。
這樣我們相當於擁有了1台nginx在前端作為反向代理伺服器;後面有2台apache作為應用程序伺服器(可以看作是小型的server cluster。;-) );
b. nginx用來作為反向代理伺服器,放置到兩台apache之前,作為用戶訪問的入口;
nginx僅僅處理靜態頁面,動態的頁面(php請求)統統都交付給後台的兩台apache來處理。
也就是說,可以把我們網站的靜態頁面或者文件放置到nginx的目錄下;動態的頁面和資料庫訪問都保留到後台的apache伺服器上。
c. 如下介紹兩種方法實現server cluster的負載均衡。
我們假設前端nginx(為127.0.0.1:80)僅僅包含一個靜態頁面index.html;
後台的兩個apache伺服器(分別為localhost:80和158.37.70.143:80),一台根目錄放置phpMyAdmin文件夾和test.php(裡面測試代碼為print 「server1「;),另一台根目錄僅僅放置一個test.php(裡面測試代碼為 print 「server2「;)。
2)針對不同請求 的負載均衡:
a. 在最簡單地構建反向代理的時候 (nginx僅僅處理靜態不處理動態內容,動態內容交給後台的apache server來處理),我們具體的設置為:在nginx.conf中修改:
復制代碼 代碼如下:
location ~ \.php$ {
proxy_pass 158.37.70.143:80 ;
}
〉 這樣當客戶端訪問localhost:8080/index.html的時候,前端的nginx會自動進行響應;
〉當用戶訪問localhost:8080/test.php的時候(這個時候nginx目錄下根本就沒有該文件),但是通過上面的設置 location ~ \.php$(表示正則表達式匹配以.php結尾的文件,詳情參看location是如何定義和匹配的 http://wiki.nginx.org/NginxHttpCoreMole) ,nginx伺服器會自動pass給 158.37.70.143的apache伺服器了。該伺服器下的test.php就會被自動解析,然後將html的結果頁面返回給nginx,然後 nginx進行顯示(如果nginx使用memcached模塊或者squid還可以支持緩存),輸出結果為列印server2。
如上是最為簡單的使用nginx做為反向代理伺服器的例子;
b. 我們現在對如上例子進行擴展,使其支持如上的兩台伺服器。
我們設置nginx.conf的server模塊部分,將對應部分修改為:
復制代碼 代碼如下:
location ^~ /phpMyAdmin/ {
proxy_pass 127.0.0.1:80 ;
}
location ~ \.php$ {
proxy_pass 158.37.70.143:80 ;
}
上面第一個部分location ^~ /phpMyAdmin/,表示不使用正則表達式匹配(^~),而是直接匹配,也就是如果客戶端訪問的 URL是以http://localhost:8080/phpMyAdmin/ 開頭的話(本地的nginx目錄下根本沒有phpMyAdmin目錄),nginx會自動pass到127.0.0.1:80 的Apache伺服器,該伺服器對phpMyAdmin目錄下的頁面進行解析,然後將結果發送給nginx,後者顯示;
如果客戶端訪問URL是http://localhost/test.php 的話,則會被pass到158.37.70.143:80 的apache進行處理。
因此綜上,我們實現了針對不同請求的負載均衡。
〉如果用戶訪問靜態頁面index.html,最前端的nginx直接進行響應;
〉如果用戶訪問test.php頁面的話,158.37.70.143:80 的Apache進行響應;
〉如果用戶訪問目錄phpMyAdmin下的頁面的話,127.0.0.1:80 的Apache進行響應;
3)訪問同一頁面 的負載均衡:
即用戶訪問http://localhost:8080/test.php 這個同一頁面的時候,我們實現兩台伺服器的負載均衡 (實際情況中,這兩個伺服器上的數據要求同步一致,這里我們分別定義了列印server1和server2是為了進行辨認區別)。
a. 現在我們的情況是在windows下nginx是localhost偵聽8080埠;
兩台apache,一台是127.0.0.1:80(包含test.php頁面但是列印server1),另一台是虛擬機的158.37.70.143:80(包含test.php頁面但是列印server2)。
b. 因此重新配置nginx.conf為:
〉首先在nginx的配置文件nginx.conf的http模塊中添加,伺服器集群server cluster(我們這里是兩台)的定義:
復制代碼 代碼如下:
upstream myCluster {
server 127.0.0.1:80 ;
server 158.37.70.143:80 ;
}
表示這個server cluster包含2台伺服器
〉然後在server模塊中定義,負載均衡:
復制代碼 代碼如下:
location ~ \.php$ {
proxy_pass http://myCluster ; #這里的名字和上面的cluster的名字相同
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
這樣的話,如果訪問http://localhost:8080/test.php 頁面的話,nginx目錄下根本沒有該文件,但是它會自動將其pass到myCluster定義的服務區機群中,分別由127.0.0.1:80;或者158.37.70.143:80;來做處理。
上面在定義upstream的時候每個server之後沒有定義權重,表示兩者均衡;如果希望某個更多響應的話例如:
復制代碼 代碼如下:
upstream myCluster {
server 127.0.0.1:80 weight=5;
server 158.37.70.143:80 ;
}
這樣表示5/6的幾率訪問第一個server,1/6訪問第二個。另外還可以定義max_fails和fail_timeout等參數。
綜上,我們使用nginx的反向代理伺服器reverse proxy server的功能,將其布置到多台apache server的前端。
nginx僅僅用來處理靜態頁面響應和動態請求的代理pass,後台的apache server作為app server來對前台pass過來的動態頁面進行處理並返回給nginx。
通過以上的架構,我們可以實現nginx和多台apache構成的機群cluster的負載均衡。
兩種均衡:
1)可以在nginx中定義訪問不同的內容,代理到不同的後台server; 如上例子中的訪問phpMyAdmin目錄代理到第一台server上;訪問test.php代理到第二台server上;
2)可以在nginx中定義訪問同一頁面,均衡 (當然如果伺服器性能不同可以定義權重來均衡)地代理到不同的後台server上。 如上的例子訪問test.php頁面,會均衡地代理到server1或者server2上。
實際應用中,server1和server2上分別保留相同的app程序和數據,需要考慮兩者的數據同步。
② CDN+前端Nginx反向代理+後端Apache,怎麼獲取真實IP
你的問題問的好奇怪,Nginx做反向解析是按照一定的規則把外部的請求轉發給內部的主機。
轉發到內部主機的請求是包含主機標頭的,但是它與泛解析有什麼關系?
最好說清你的需求和問題
③ xampp 反向代理 https 怎麼配置
查看一下xampp的apache配置文件,我們發現其中有一行: #Include etc/extra/httpd-... 9、Nginx優於apache的主要兩點:1.Nginx本身就是一個反向代理伺服器 2.Nginx支持7層... 其主要行為是將CGI解釋器進程保持在內存中並因此獲得較高的性能。傳統的CGI解釋器...
④ 我用Nginx搭建了個反向代理伺服器,前端伺服器帶寬1M後端伺服器10M,為什麼打來網站速度那麼慢
前端是在公網提供服務的的,所以前端帶寬越大,訪問速度肯定有所加快!而你的代理伺服器跟後端伺服器是在一個區域網內,所以你說的後端10M,現在隨便一個網卡都是百兆,伺服器更是千兆!反正速度慢,你可以擴大帶寬和優化你的伺服器。
⑤ nginx的反向代理和負載均衡的區別是什麼
我的理解是,負載均衡的前提是反向代理,當將同一個域名同一個埠反向代理到不同的主機時,需要負載均衡。
⑥ nginx做在前端做反向代理的時候,後端的伺服器集群應該怎麼劃分
1、nginx相對於apache的優點:
輕量級,同樣起web 服務,比apache佔用更少的內存及資源
抗並發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高並發下nginx 能保持低資源低消耗高性能
高度模塊化的設計,編寫模塊相對簡單
社區活躍,各種高性能模塊出品迅速啊
apache 相對於nginx 的優點:
rewrite ,比nginx 的rewrite 強大
動態頁面
模塊超多,基本想到的都可以找到
少bug ,nginx 的bug 相對較多
⑦ 什麼是反向代理(reverse proxy server)
但是,如果想讓互聯網上的主機訪問內部網的主機資源(例如:Web站點),又想使內部網主機免受外部網主機攻擊,一般的代理服務是不能實現的,需要使用反向代理來實現。
一.反向代理的概念
Web伺服器加速(反向代理)是針對Web伺服器提供加速功能的。它作為代理Cache,但並不針對瀏覽器用戶,而針對一台或多台特定Web伺服器(這也是反向代理名稱的由來)。實施反向代理(如上圖所示),只要將Reverse Proxy Cache設備放置在一台或多台Web伺服器前端即可。當互聯網用戶訪問某個WEB伺服器時,通過DNS伺服器解析後的IP地址是Reverse Proxy Server的IP地址,而非原始Web伺服器的IP地址,這時Reverse Proxy Server設備充當Web伺服器,瀏覽器可以與它連接,無需再直接與Web伺服器相連。因此,大量Web服務工作量被卸載到反向代理服務上。不但能夠防止外部網主機直接和web伺服器直接通信帶來的安全隱患,而且能夠很大程度上減輕web伺服器的負擔,提高訪問速度。
二.反向代理和其它代理的比較
下面將對幾種典型的代理服務作一個簡單的比較。在網路上常見的代理伺服器有三種:
1. 標準的代理緩沖伺服器
一個標準的代理緩沖服務被用於緩存靜態的網頁(例如:html文件和圖片文件等)到本地網路上的一台主機上(即代理伺服器)。當被緩存的頁面被第二次訪問的時候,瀏覽器將直接從本地代理伺服器那裡獲取請求數據而不再向原web站點請求數據。這樣就節省了寶貴的網路帶寬,而且提高了訪問速度。但是,要想實現這種方式,必須在每一個內部主機的瀏覽器上明確指明代理伺服器的IP地址和埠號。客戶端上網時,每次都把請求送給代理伺服器處理,代理伺服器根據請求確定是否連接到遠程web伺服器獲取數據。如果在本地緩沖區有目標文件,則直接將文件傳給用戶即可。如果沒有的話則先取迴文件,先在本地保存一份緩沖,然後將文件發給客戶端瀏覽器。
2. 透明代理緩沖伺服器
透明代理緩沖服務和標准代理伺服器的功能完全相同。但是,代理操作對客戶端的瀏覽器是透明的(即不需指明代理伺服器的IP和埠)。透明代理伺服器阻斷網路通信,並且過濾出訪問外部的HTTP(80埠)流量。如果客戶端的請求在本地有緩沖則將緩沖的數據直接發給用戶,如果在本地沒有緩沖則向遠程web伺服器發出請求,其餘操作和標準的代理伺服器完全相同。對於Linux操作系統來說,透明代理使用Iptables或者Ipchains實現。因為不需要對瀏覽器作任何設置,所以,透明代理對於ISP(Internet伺服器提供商)特別有用。
3. 反向代理緩沖伺服器
反向代理是和前兩種代理完全不同的一種代理服務。使用它可以降低原始WEB伺服器的負載。反向代理伺服器承擔了對原始WEB伺服器的靜態頁面的請求,防止原始伺服器過載。它位於本地WEB伺服器和Internet之間,處理所有對WEB伺服器的請求,組織了WEB伺服器和Internet的直接通信。如果互聯網用戶請求的頁面在代理伺服器上有緩沖的話,代理伺服器直接將緩沖內容發送給用戶。如果沒有緩沖則先向WEB伺服器發出請求,取回數據,本地緩存後再發送給用戶。這種方式通過降低了向WEB伺服器的請求數從而降低了WEB伺服器的負載。
三.反向代理工作原理
⑧ 反向代理負載均衡的nginx 實現反向代理負載均衡
1)環境:
a. 本地使用Windows系統,然後使用VirutalBox安裝一個虛擬的Linux系統。
在本地的Windows系統上分別安裝nginx(偵聽8080埠)和apache(偵聽80埠)。在虛擬的Linux系統上安裝apache(偵聽80埠)。這樣相當於擁有了1台nginx在前端作為反向代理伺服器;後面有2台apache作為應用程序伺服器(可以看作是小型的server cluster。;-));
b. nginx用來作為反向代理伺服器,放置到兩台apache之前,作為用戶訪問的入口。
nginx僅僅處理靜態頁面,動態的頁面(php請求)統統都交付給後台的兩台apache來處理。也就是說,可以把網站的靜態頁面或者文件放置到nginx的目錄下;動態的頁面和資料庫訪問都保留到後台的apache伺服器上。
c. 如下兩種方法實現server cluster的負載均衡。
假設前端nginx(為127.0.0.1:8080)僅僅包含一個靜態頁面index.html;後 台的兩個apache伺服器(分別為localhost:80和158.37.70.143:80),一台根目錄放置phpMyAdmin文件夾和 test.php(裡面測試代碼為print server1;),另一台根目錄僅僅放置一個test.php(裡面測試代碼為print server2;)。
2)針對不同請求的負載均衡:
a. 在最簡單地構建反向代理的時候(nginx僅僅處理靜態不處理動態內容,動態內容交給後台的apache server來處理),具體的設置為:在nginx.conf中修改:
location ~ .php$ {
proxy_pass 158.37.70.143:80;
}
>;這樣當客戶端訪問localhost:8080/index.html的時候,前端的nginx會自動進行響應;
>;當用戶訪問localhost:8080/test.php的時候(這個時候nginx目錄下根本就沒有該文件),但是通過上面的設置location ~ .php$(表示正則表達式匹配以.php結尾的文件,詳情參看location是如何定義和匹配的),nginx伺服器會自動pass給158.37.70.143的apache伺服器了。該伺服器下的test.php就會被自動解析,然後將html的 結果頁面返回給nginx,然後nginx進行顯示(如果nginx使用memcached模塊或者squid還可以支持緩存),輸出結果為列印 server2。
如上是最為簡單的使用nginx做為反向代理伺服器的例子。
b. 我們現在對如上例子進行擴展,使其支持如上的兩台伺服器。
設置nginx.conf的server模塊部分,將對應部分修改為:
location ^~ /phpMyAdmin/ {
proxy_pass 127.0.0.1:80;
}
location ~ .php$ {
proxy_pass 158.37.70.143:80;
}
上面第一個部分location ^~ /phpMyAdmin/,表示不使用正則表達式匹配(^~),而是直接匹配,也就是如果客戶端訪問的URL是以http://localhost:8080/phpMyAdmin/開頭的話(本地的nginx目錄下根本沒有phpMyAdmin目錄),nginx會自動pass到127.0.0.1:80的Apache伺服器,該伺服器對phpMyAdmin目錄下的頁面進行解析,然後將結果發送給nginx,後者顯示;
如果客戶端訪問URL是http://localhost/test.php的話,則會被pass到158.37.70.143:80的apache進行處理。
因此綜上,實現了針對不同請求的負載均衡。
>;如果用戶訪問靜態頁面index.html,最前端的nginx直接進行響應;
>;如果用戶訪問test.php頁面的話,158.37.70.143:80的Apache進行響應;
>;如果用戶訪問目錄phpMyAdmin下的頁面的話,127.0.0.1:80的Apache進行響應。
3)訪問同一頁面的負載均衡:
即用戶訪問http://localhost:8080/test.php這個同一頁面的時候,實現了兩台伺服器的負載均衡(實際情況中,這兩個伺服器上的數據要求同步一致,這里我們分別定義了列印server1和server2是為了進行辨認區別)。
a. 現在的情況是在windows下nginx是localhost偵聽8080埠;
兩台apache,一台是127.0.0.1:80(包含test.php頁面但是列印server1),另一台是虛擬機的158.37.70.143:80(包含test.php頁面但是列印server2)。
b. 因此重新配置nginx.conf為:
>;首先在nginx的配置文件nginx.conf的http模塊中添加,伺服器集群server cluster(我們這里是兩台)的定義:
upstream myCluster {
server 127.0.0.1:80;
server 158.37.70.143:80;
}
表示這個server cluster包含2台伺服器
>;然後在server模塊中定義,負載均衡:
location ~ .php$ {
proxy_passhttp://myCluster; #這里的名字和上面的cluster的名字相同
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
}
這樣的話,如果訪問http://localhost:8080/test.php頁面的話,nginx目錄下根本沒有該文件,但是它會自動將其pass到myCluster定義的服務區機群中,分別由127.0.0.1:80;或者158.37.70.143:80;來做處理。上面在定義upstream的時候每個server之後沒有定義權重,表示兩者均衡;如果希望某個更多響應的話例如:
upstream myCluster {
server 127.0.0.1:80weight=5;
server 158.37.70.143:80;
}
這樣表示5/6的幾率訪問第一個server,1/6訪問第二個。另外還可以定義max_fails和fail_timeout等參數。
====================
綜上,通過使用nginx的反向代理伺服器reverse proxy server的功能,將其布置到多台apache server的前端。nginx僅僅用來處理靜態頁面響應和動態請求的代理pass,後台的apache server作為app server來對前台pass過來的動態頁面進行處理並返回給nginx。
通過以上的架構,我們可以實現nginx和多台apache構成的機群cluster的負載均衡。
兩種均衡:
1)可以在nginx中定義訪問不同的內容,代理到不同的後台server;如上例子中的訪問phpMyAdmin目錄代理到第一台server上;訪問test.php代理到第二台server上;
2)可以在nginx中定義訪問同一頁面,均衡(當然如果伺服器性能不同可以定義權重來均衡)地代理到不同的後台server上。如上的例子訪問test.php頁面,會均衡地代理到server1或者server2上。
實際應用中,server1和server2上分別保留相同的app程序和數據,需要考慮兩者的數據同步。
⑨ 前端解決跨域都有哪些手段
1. jsonp解決跨域,缺點:只局限於GET請求;應用場景:請求第三方平台數據(比如天氣數據)時使用較多
2. 伺服器端設置Access-Control-Allow-Origin響應頭,允許前端跨域。這種辦法比較便捷,前端不需要調整代碼,一般企業中用的比較多
3. 搭建一個本地的中間伺服器,作為代理,幫助獲取需要跨域的伺服器的數據
4. vue項目可以進行proxy反向代理的配置,實現跨域
黑馬程序員官網有成套免費視頻哦,有什麼不懂的可以直接過去學習。
⑩ nginx發布前端項目,想更換html.CSS.js等,如何不重啟nginx更換
直接修改nginx配置文件,然後reload