nginx代理ftp
A. 10. Nginx實現反向代理
反向代理: reverse proxy, 指的是代理外網用戶的請求到內部的指定的伺服器, 並將數據返回給用戶的一種方式, 這是用的比較多的一種方式
Nginx除了可以為企業提供高性能的web服務之外, 另外還可以將Nginx本身不具備的請求通過某種預定義的協議轉發至其他伺服器處理, 不同的協議就是Nginx伺服器與其他伺服器進行通信的一種規范, 主要在不同的場景使用以下模塊實現不同的功能
生成環境部署架構:
訪問邏輯圖:
Nginx反向代理http服務:
1. proxy_pass
2. proxy_hide_header field
修改前, 響應報文頭部會攜帶ETag信息
修改後ETag信息被隱藏
3. proxy_pass_header field
4. proxy_pass_request_body
5. proxy_pass_request_headers
6. proxy_set_header
由於proxy_set_header只是修改了請求報文的頭部信息, 添加了自定義的欄位, 因此, 還需要在後端伺服器修改日誌定義格式, 才能方便將客戶端ip記錄到日誌信息中
注意1:通過set_proxy_header自定義變數只是給請求報文添加了一個自定義的欄位, 其欄位值是人為根據系統內置變數設定的
注意2: 這種方法, 在多級代理的情況下, 並不能將客戶端ip, 逐層的傳給後端伺服器, 而是需要利用$proxy_add_x_forwarded_for變數實現
注意3: 如果一定要使用proxy_set_header去傳遞客戶端ip和每一層代理的ip地址, 那麼需要在每一層nginx代理都開啟proxy_set_header, 並且設置不同的自定義變數去引用nginx自帶變數$remote_addr, 這樣每一級nginx都會記錄上一級, 也就包括客戶端的ip地址, 同時, 在後端伺服器的日誌格式中, 要添加多個nginx自定義的變數, 這樣也可以把客戶端ip和中間經過的代理的ip全部傳遞給後端的伺服器
proxy_add_x_forwarded_for實現多級代理ip地址透傳示例: 需要在每一級代理都開啟
實驗環境:
7. 有關反向代理時間的幾個參數
8. proxy_ignore_client_abort
9. hash表大小的設置
客戶端 ----- http協議 ------- nginx(代理伺服器,10.0.0.86) ----- http --- apache (10.0.0.85)
客戶端, 通過訪問nginx上定義的虛擬主機中的server_name域名, 通過內部定義的location匹配規則, 被轉發到10.0.0.85伺服器
代理伺服器與後端伺服器連接出現問題可能發生的報錯:
如果後端伺服器想把圖片資源放到固定的目錄下, 也可以自定義, 比如存到/var/www/html/static, 那麼nginx的location就要修改為如下:
緩存功能相關參數:
實驗環境:
proxy_pass 可以讓Nginx將客戶端請求轉發至後端單台伺服器, 但是無法轉發至特定的一組伺服器, 而且不能對後端伺服器提供相應的伺服器狀態監測.
Nginx可以基於 ngx_http_upstream_mole 模塊提供伺服器分組轉發, 權重分配, 狀態監測, 使用不同的調度演算法等高級功能
關於ip_forward
注意: 本實驗過程要先關閉緩存
訪問固定的URI會被調度到相同的伺服器
B. nginx反向代理三種模式
1、基於IP代理
2、基於域名代理
3、基於埠代理
Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,其特點是佔用內存少,並發能力強,是我們在Web開發中最常用的工具之一。

此外,Nginx能提供性能穩定、並且提供配置靈活的轉發功能。它可以根據不同的正則匹配,採取不同的轉發策略,並且Nginx對返回結果進行錯誤頁跳轉,異常判斷等。如果被分發的伺服器存在異常,它可以將請求重新轉發給另外一台伺服器,然後自動去除異常伺服器。
C. Nginx 最全操作——nginx反向代理(5)
將 NGINX 配置為 HTTP 和其他協議的反向代理,支持修改請求標頭和微調的響應緩沖。
本文介紹代理伺服器的基本配置。您將學習如何通過不同的協議將請求從 NGINX 傳遞到代理伺服器,修改發送到代理伺服器的客戶端請求標頭,以及配置來自代理伺服器的響應的緩沖。
代理通常用於在多個伺服器之間分配負載,無縫顯示來自不同網站的內容,或通過 HTTP 以外的協議將處理請求傳遞給應用程序伺服器。
當 NGINX 代理請求時,它會將請求發送到指定的代理伺服器,獲取響應,然後將請求發送回客戶端。可以使用指定的協議將請求代理到 HTTP 伺服器(另一個 NGINX 伺服器或任何其他伺服器)或非 HTTP 伺服器(可以運行使用特定框架開發的應用程序,例如 php 或 Python)。支持的協議包括FastCGI、uwsgi、SCGI和memcached。
要將請求傳遞給 HTTP 代理伺服器,需要在location中指定proxy_pass指令。例如:
此示例配置導致將在此位置處理的所有請求傳遞到指定地址的代理伺服器。此地址可以指定為域名或者 IP 地址。該地址還可能包括一個埠:
注意,在上面的第一個例子中,代理的伺服器的地址後面是一個URI, /link/ 。如果 URI 與地址一起指定,它將替換請求 URI 中與 location 參數匹配的部分。例如,這里帶有 /some/path/page.html URI的請求將被代理到 http://www.example.com/link/page.html . 如果指定的地址沒有問題 URI,或者無法確定要替換的 URI 部分,則傳遞完整的請求 URI(可能已修改)。
要將請求傳遞給非 HTTP 代理伺服器, **_pass 應使用適當的指令:
請注意,在這些情況下,指定地址的規則可能不同。您可能還需要將其他參數傳遞給伺服器(有關詳細信息,請參閱參考文檔)。
proxy_pass指令也可以指向一組命名的伺服器。在這種情況下,請求根據指定的方法在組中的伺服器之間分發。
默認情況下,NGINX 重新定義代理請求中的兩個 header 欄位,「Host」和「Connection」,並消除值為空字元串的 header 欄位。「Host」設置為 $proxy_host 變數,「Connection」設置為 close 。
要更改這些設置以及修改其他標頭欄位,請使用proxy_set_header指令。該指令可以在某個位置或更高位置指定。它也可以在特定的伺服器上下文或http塊中指定。例如:
在此配置中,「主機」欄位設置為$host變數。
要防止標頭欄位被傳遞到代理伺服器,請將其設置為空字元串,如下所示:
默認情況下,NGINX 緩沖來自代理伺服器的響應。響應存儲在內部緩沖區中,並且在收到整個響應之前不會發送到客戶端。緩沖有助於優化慢速客戶端的性能,如果響應從 NGINX 同步傳遞到客戶端,這可能會浪費代理伺服器的時間。但是,當啟用緩沖時,NGINX 允許代理伺服器快速處理響應,而 NGINX 存儲響應的時間與客戶端下載它們所需的時間一樣長。
負責啟用和禁用緩沖的指令是proxy_buffering。默認情況下,它設置為 on 並啟用緩沖器。
該proxy_buffers指令控制規模和分配的請求緩沖區的數目。來自代理伺服器的響應的第一部分存儲在單獨的緩沖區中,其大小由proxy_buffer_size指令設置。這部分通常包含一個相對較小的響應頭,並且可以做得比其餘響應的緩沖區小。
在以下示例中,緩沖區的默認數量增加了,並且響應的第一部分的緩沖區大小小於默認值。
如果禁用緩沖,則在從代理伺服器接收響應的同時將響應同步發送到客戶端。對於需要盡快開始接收響應的快速交互客戶端,此行為可能是可取的。
要在特定位置禁用緩沖,請將proxy_buffering指令放在帶有參數的位置 off ,如下所示:
在這種情況下,NGINX 僅使用proxy_buffer_size配置的緩沖區來存儲響應的當前部分。
反向代理的一個常見用途是提供負載平衡。閱讀免費的選擇軟體負載均衡器的五個理由電子書,了解如何通過快速部署來提高功能、性能和專注於您的應用程序。
如果您的代理伺服器有多個網路介面,有時您可能需要選擇特定的源 IP 地址連接到代理伺服器或上游。如果 NGINX 後面的代理伺服器配置為接受來自特定 IP 網路或 IP 地址范圍的連接,這可能很有用。
指定proxy_bind指令和必要網路介面的 IP 地址:
IP 地址也可以用變數指定。例如, $server_addr 變數傳遞接受請求的網路介面的 IP 地址:
簡單來說,把網路首頁代理到/test路徑,同時把java代理到/testapi,配置如下:
參考鏈接:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
歡迎大家提出不一樣的觀點,我們一起討論,
我是辣個男人,一個運維人。
D. Nginx的反向代理跨域
什麼是跨域?
跨域是指a頁面想獲取b頁面資源,如果a、b頁面的協議、域名、埠、子域名不同,或是a頁面為ip地址, b頁面為域名地址,所進行的訪問行動都是跨域
瀏覽器為了安全問題一般都限制了跨域訪問,也就是不允許跨域請求資源
同ip(或domain),同埠,同協議視為同一個域,一個域內的腳本僅僅具有本域內的許可權,可以理解為本域腳本只能讀寫 本域內的資源,而無法訪問其它域的資源。這種安全限制稱為同源策略
現代瀏覽器在安全性和可用性之間選擇了一個平衡點。 在遵循同源策略的基礎上,選擇性地為同源策略「開放了後門」。例如img script style等標簽,都允許垮域引用資源,然而, 你也只能是引用這些資源而已,並不能讀取這些資源的內容
同源策略限制以下幾種行為:
1.Cookie、LocalStorage 和 IndexDB 無法讀取
2.DOM 和 Js對象無法獲得
3.AJAX 請求不能發送
http://www.domain.com/a.jshttp://www.domain.com/b.js 同一域名,不同文件或路徑 允許http://www.domain.com/lab/c.jshttp://www.domain.com:8000/a.jshttp://www.domain.com/b.js 同一域名,不同埠 不允許http://www.domain.com/a.jshttps://www.domain.com/b.js 同一域名,不同協議 不允許http://www.domain.com/a.jshttp://192.168.4.12/b.js 域名和域名對應相同ip 不允許http://www.domain.com/a.jshttp://x.domain.com/b.js 主域相同,子域不同 不允許http://domain.com/c.jshttp://www.domain1.com/a.jshttp://www.domain2.com/b.js 不同域名 不允許
1、 通過jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域資源共享(CORS)
7、 nginx代理跨域
8、 nodejs中間件代理跨域
9、 WebSocket協議跨域
正向代理 :代理位於網站和客戶端中間, 客戶端無法訪問某網站,就將請求發送給代理伺服器,代理從網站取回來再發送給客戶端,網站並不知道為誰提供服務
反向代理 :客戶端訪問某網站的一個頁面, 但是網站並沒有,就偷偷從另外一台伺服器上取回來,然後作為自己的內容吐給用戶,用戶不知道真正提供服務的是誰
對於瀏覽器來說,訪問的就是同源伺服器上的一個url。而nginx通過 檢測url前綴,把http請求轉發到後面真實的物理伺服器。並通過rewrite命令把前綴再去掉。這樣真實的伺服器就可以正確 處理請求,並且並不知道這個請求是來自代理伺服器的。
簡單說,nginx伺服器欺騙了瀏覽器,讓它認為這是同源調用,從而解決了瀏覽器的跨域問題。又通過重寫url,欺騙了真實 的伺服器,讓它以為這個http請求是直接來自與用戶瀏覽器的。
Location/carrots-admin-ajax/{
proxy_passhttp://dev.admin.carrots.ptteng.com/;
}
proxy_pass 把請求代理到其他主機
兩種寫法hhttp://dev.admin.carrots.ptteng.com/ 和 http://dev.admin.carrots.ptteng.com
如果訪問url = http://server/html/test.jsp ,則被nginx代理後
情況1,將test/作為根路徑,請求test/路徑下的資源。
情況2,則被nginx代理後,請求路徑會變為http://proxy_pass/test.jsp,直接訪問server的根資源。
是一個匹配規則,用於攔截請求,匹配任何以/proxy/html/開頭的地址,匹配符合以後,停止往下搜索正則。
對於瀏覽器來說,訪問的就是同源伺服器上的一個url。而nginx通過檢測url前綴,把http請求轉發到後面真實的物理伺服器。並通過rewrite命令把前綴再去掉。這樣真實的伺服器就可以正確處理請求,並且並不知道這個請求是來自代理伺服器的。
簡單說,nginx伺服器欺騙了瀏覽器,讓它認為這是同源調用,從而解決了瀏覽器的跨域問題。又通過重寫url,欺騙了真實的伺服器,讓它以為這個http請求是直接來自與用戶瀏覽器的。
1.執行server塊的rewrite指令(這里的塊指的是server關鍵字後{}包圍的區域,其它xx塊類似)
2.執行location匹配
3.執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件
如果循環超過10次,則返回500 Internal Server Error錯誤
7.參考文獻
參考一: https://www.cnblogs.com/gabrielchen/p/5066120.html
參考二: http://blog.csdn.net/shendl/article/details/48443299
8.更多討論
提問:
Q :例如img script style等標簽,都允許垮域引用資源?
A :在瀏覽器中,並且載入的方式其實相當於一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對載入到的資源的讀寫操作,而只能使用標簽本身應當具備的能力(比如腳本執行、樣式應用等等)。
Q :例如img script style等標簽,都允許垮域引用資源?
A :在瀏覽器中,並且載入的方式其實相當於一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對載入到的資源的讀寫操作,而只能使用標簽本身應當具備的能力(比如腳本執行、樣式應用等等)。
Q:JSONP和nginx跨域有什麼不同
JSONP和nginx是完全不同的 是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數
原理:是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數
script標簽是可以載入異域的JavaScript並執行的,通過預先設定好的callback函數來實現和母頁面的交互。它有一個大名,叫做JSONP跨域,JSONP是JSON with Padding的略稱。它是一個非官方的協議,明明是載入script,為啥和JSON扯上關系呢?原來就是這個callback函數,對它的使用有一個典型的方式,就是通過JSON來傳參,即將JSON數據填充進回調函數,這就是JSONP的JSON+Padding的含義。JSONP只支持GET請求。
E. Nginx正向代理配置
Nginx配置正向代理支持HTTP和HTTPS轉發
Nginx本身不支持HTTPS正向代理,需要安裝ngx_http_proxy_connect_mole模塊後才可以支持HTTPS正向代理,否則會遇到HTTP 400錯誤。
參考文檔:
https://github.com/chobits/ngx_http_proxy_connect_mole
安裝Nginx和ngx_http_proxy_connect_mole模塊
修改Nginx配置文件
Nginx目錄:/usr/local/nginx
修改Nginx目錄下conf/nginx.conf配置文件,在http中添加以下內容:
啟動Nginx
運行./sbin/nginx啟動Nginx。
Nginx命令參考:
查看埠
打開防火牆
驗證埠:
測試代理
F. Nginx反向代理的使用及原理
正向代理,用通俗的方式來說,就是代理伺服器只起到轉發的作用,例如,在顧客進商店購買東西,商店就是一個正向代理,起到的作用就是把商品從廠家代理售賣到顧客手中。
反向代理,就是顧客的請求是確定的,但將商品的需求信息發送給代理商之後,代理商通過各種方式尋找不同的供貨商,再把供貨商提供的商品轉交給顧客。顧客是不知道代理商背後的供貨商是誰的。這種方式有點類似於目前的「三隻松鼠」等網路直銷平台的邏輯,顧客發送芒果乾的請求給三隻松鼠,三隻松鼠從全國進行供貨商的選擇,拿到貨品後再打上三隻松鼠的logo轉交給顧客,實現反向的代理,代理的是供貨商,顧客不知道具體的供應商是誰(所以才會要求包裝上需要印上供應商的名稱和地址,要不然出問題都不知道找誰。)
Nginx的安裝網路有很多資源,包括Linux和Windows的,在此不表。主要關注一下如何進行配置,來看看 nginx.conf.default 中的配置信息:
可以看到,主要的幾個配置模塊:
下面主要講講經常使用的server以及location的配置。
gzip壓縮中
對於阿里雲上的配置,我們直接使用一級域名 abc.com 解析阿里雲伺服器的IP地址:
G. nginx的反向代理可以直接telnet么
不可以。Nginx的反向代理是一個可以將客戶端請求轉發到內部伺服器的伺服器,而不能用於telnet協議。
H. 如何運用Nginx搭建代理伺服器
如何實現Nginx的反向代理?
這句話什麼意思?
意思是說當客戶機來訪問伺服器的時候,伺服器本身並不出面接待,而是將客戶的請求轉高給手下的子伺服器(小弟)負責接待。
比如:你訪問www..com,其實並不時網路總伺服器接待的你,而是網路的代理伺服器接待的你,不過他們的服務是一樣的,提供同樣的頁面;
如是搭建Nginx服務才能實現這樣的效果呢?
搭建一個最簡單,最基礎nginx代理伺服器,需要一台代理服務,兩檯子伺服器,XX台客戶機來作驗證;
操作流程如下:
第一步、伺服器和客戶機配好IP地址,其中Nginx代理伺服器需要配置兩張網卡,兩個IP地址,一個和客戶機通信,一個和子伺服器通信;
代理伺服器與客戶機和子伺服器都分別配置同網段IP地址;
例如:
代理伺服器:192.168.4.5 192.168.2.5
子伺服器 :192.168.2.100 192.168.2.200
客戶機 :192.168.4.10
這樣配置的好處是: 可以負載均衡,保障用戶的訪問體驗,保障上網速度,同時也保障了,即便有一台伺服器壞掉了,另一台服務可以接待用戶訪問;
第二步、代理伺服器上安裝Nginx服務軟體,兩檯子伺服器上安裝HTTPD服務並寫入相應的網頁,然後啟動服務;
yum -y install httpd ##安裝httpd服務;
echo "羅貴" > /var/www/html/index.html ##寫一個簡單的網頁
./configure --user=nginx --group=nginx --with-http_ssl_mole
make && make install ##編譯安裝Nginx
第三步、修改Nginx的配置文件;
vim /usr /local /nginx /conf /nginx.conf
http { ............... ##在文件中找到http開頭的行,並在http下面隨意找兩行添加下面兩行的內容;
upstream luogui { ##luogui是集群名字,可以自由定義,upstream 上游的意思;翻譯過來就是在上游建立一個名字為luogui的集群,集群中包含下述IP地址;
server 192.168.2.100:80;
server 192.168.2.200:80;
}
server {
listen 80;
server_name www.luogui.com; ##域名,可以自由定義;
location ^/.php$ { ##匹配網頁地址的意思,匹配以 / 開頭.php結尾的網頁文件;
proxy_pass http://luogui; ##通過proxy代理伺服器將用戶的請求轉發給luogui集群伺服器;(註:優先順序最高,系統會優先處理這條命令)
}
}
第四步、測試效果;
firefox http://192.168.4.5 或者 本地測試 curl http://192.168.4.5
結果應該是暫停任何一檯子伺服器,客戶機訪問網頁都沒有問題;
以上.......
(EDN)
祝:開心!
羅貴
2019-04-05於深圳
I. Nginx反向代理常用配置
在計算機中,客戶端A與服務端B進行同行,中間加入中介C進行數據傳遞,則形成了代理。來個淺顯易懂的比喻,三年級二班小明和小花談戀愛,由於小明和小花座位離的太遠,這時候需要小王在中間傳遞紙條,在這個愛情故事中小王在中間充當了代理作用。
正向代理中,客戶端通過代理伺服器從服務端收發數據,即為正向代理。
舉個栗子:有一個區域網,但是只有主機局域訪問外部網路的許可權,現在所有的機器都需要訪問外部網路,通過將主機設置為代理伺服器,讓所有的機器通過主機可以訪問外部網路,即稱為正向代理。
反向代理中,代理伺服器替服務端收發數據,所有的請求與相應都經過反向代理,可以用來實現數據緩存,負載均衡等。
舉個栗子: 張三開了一個保險公司(服務端),一開始公司業務小,一個人接電話就夠了,後來隨著公司擴張,每天無數電話打進來,張三招了一個客服李四(代理),張三把和客戶對接的事情都交給了李四,形成了反向代理。
配置項很多,挑幾個幾個常用的配置依次介紹:location、proxy_set_header、rewrite、proxy_pass
當然還有」!「、」^「匹配,用的比較少,這里不做說明
這里還有很多數據,不一一說明
包含3個參數:
用法示例:
301重定向表示永久性重定向,對於SEO相較302來說比較友好,這里不做過多說明。
nginx doc
nginx rewrite 配置
