在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Nginx代理轉發(fā)實戰(zhàn):零基礎掌握服務器流量分發(fā)技巧

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2024-12-09 12:28 ? 次閱讀

Nginx 是最常用的反向代理工具之一,一個指令 proxy_pass搞定反向代理,對于接口代理、負載均衡很是實用,但 proxy_pass指令后面的參數(shù)很有講究,通常一個“/”都可能引發(fā)一個血案。

location塊里proxy_pass包含或不包含/的示例

在proxy_pass中的代理url后加上/,代理轉發(fā)的url中就不會帶上location中匹配路徑;服務器若是后面沒有/,代理轉發(fā)的url中就會帶上location中的匹配路徑。
假設下面四種 Nginx配置,都用http://192.168.1.8/proxy/test.html進行訪問:
第一種:

location /proxy/ {
    proxy_pass http://127.0.0.1/;
}

代理到URL:http://127.0.0.1/test.html

第二種(相對于第一種,這里最后少一個 / )

location /proxy/ {
    proxy_pass http://127.0.0.1;
}

代理到URL:http://127.0.0.1/proxy/test.html

第三種:

location /proxy/ {
    proxy_pass http://127.0.0.1/aaa/;
}

代理到URL:http://127.0.0.1/aaa/test.html

第四種(相對于第三種,這里最后少一個 / )

location /proxy/ {
    proxy_pass http://127.0.0.1/aaa;
}

代理到URL:http://127.0.0.1/aaatest.html

總結:nginx配置location塊里的 proxy_pass指令時,如果proxy_pass后面的URI包含/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分代理上。

location塊里的 proxy_pass是最常見的。

不影響瀏覽器地址欄的url

設置被代理server的協(xié)議和地址

協(xié)議能夠為http或https

地址能夠為域名或IP

nginx中有兩個模塊都有proxy_pass指令

ngx_http_proxy_module 的 proxy_pass:

語法: proxy_pass URL;
場景: location, if in location, limit_except

說明: 設置后端代理服務器的協(xié)議(protocol)和地址(address),以及l(fā)ocation中可以匹配的一個可選的URI。協(xié)議可以是"http"或"https"。地址可以是一個域名或ip地址和端口,或者一個 unix-domain socket 路徑。
詳見官方文檔:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_passURI

ngx_stream_proxy_module 的 proxy_pass:

語法: proxy_pass address;
場景: server

說明: 設置后端代理服務器的地址。這個地址(address)可以是一個域名或ip地址和端口,或者一個 unix-domain socket路徑。
詳見官方文檔:http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_pass

兩個proxy_pass的關系和區(qū)別

在兩個模塊中,兩個proxy_pass都是用來做后端代理的指令。
ngx_stream_proxy_module模塊的proxy_pass指令只能在server段使用使用, 只需要提供域名或ip地址和端口。可以理解為端口轉發(fā),可以是tcp端口,也可以是udp端口。
ngx_http_proxy_module模塊的proxy_pass指令需要在location段,location中的if段,limit_except段中使用,處理需要提供域名或ip地址和端口外,還需要提供協(xié)議,如"http"或"https",還有一個可選的uri可以配置。

proxy_pass的具體用法

ngx_stream_proxy_module 模塊的 proxy_pass指令

server {
    listen 127.0.0.1:12345;
    proxy_pass 127.0.0.1:8080;
}
 
server {
    listen 12345;
    proxy_connect_timeout 1s;
    proxy_timeout 1m;
    proxy_pass example.com:12345;
}
 
server {
    listen 53 udp;
    proxy_responses 1;
    proxy_timeout 20s;
    proxy_pass dns.example.com:53;
}
  
server {
    listen [::1]:12345;
    proxy_pass unix:/tmp/stream.socket;
}

ngx_http_proxy_module 模塊的 proxy_pass指令

server { 
    listen 80; 
    server_name www.test.com; 
     
    # 正常代理,不修改后端url的 
    location /some/path/ { 
        proxy_pass http://127.0.0.1;     
    } 
     
    # 修改后端url地址的代理(本例后端地址中,最后帶了一個斜線) 
    location /testb { 
        proxy_pass http://www.other.com:8801/; 
    } 
     
    # 使用 if in location 
    location /google { 
        if ( $geoip_country_code ~ (RU|CN) ) { 
            proxy_pass http://www.google.hk; 
        }
     
    } 
     
    location /yongfu/ { 
        # 沒有匹配 limit_except 的,代理到 unix:/tmp/backend.socket:/uri/ 
        proxy_pass http://unix:/tmp/backend.socket:/uri/;; 
        # 匹配到請求方法為: PUT or DELETE, 代理到9080 
        limit_except PUT DELETE { 
            proxy_pass http://127.0.0.1:9080; 
        }
     
    } 
 
}

proxy_pass后,后端服務器的url(request_uri)情況分析

server { 
    listen 80; 
    server_name www.test.com; 
     
    # 情形A (非正則匹配)
    # 訪問 http://www.test.com/testa/aaaa 后端的request_uri為: /testa/aaaa 
    location ^~ /testa/ { 
        proxy_pass http://127.0.0.1:8801; 
    } 
     
    # 情形B (非正則匹配)
    # 訪問 http://www.test.com/testb/bbbb 后端的request_uri為: /bbbb 
    location ^~ /testb/ { 
        proxy_pass http://127.0.0.1:8801/; 
    } 
     
    # 情形C (正則匹配)
    # 下面這段location是正確的 
    location ~ /testc { 
        proxy_pass http://127.0.0.1:8801; 
    } 
     
 
    # 情形D (正則匹配)
    # 下面這段location是錯誤的 
    # nginx -t 時,會報如下錯誤:  
    # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular     
    # expression, or inside named location, or inside "if" statement, or inside     
    # "limit_except" block in /opt/app/nginx/conf/vhost/test.conf:17

    # 當location為正則表達式時,proxy_pass 不能包含URI部分。本例中包含了"/" 
    location ~ /testd { 
        proxy_pass http://127.0.0.1:8801/; # 記住,location為正則表達式時,不能這樣寫!?。?    } 
     
    # 情形E (普通匹配)
    # 訪問 http://www.test.com/ccc/bbbb 后端的request_uri為: /aaa/ccc/bbbb 
    location /ccc/ { 
        proxy_pass http://127.0.0.1:8801/aaa$request_uri; # “$request_uri”一般不寫
    } 
     
    # 情形F (實現(xiàn)URL偽靜態(tài))
    # 訪問 http://www.test.com/namea/ddd 后端的request_uri為: /yongfu?namea=ddd 
    location /namea/ { 
        rewrite /namea/([^/]+) /yongfu?namea=$1 break; 
        proxy_pass http://127.0.0.1:8801; 
    } 
     
    # 情形G (實現(xiàn)URL偽靜態(tài))
    # 訪問 http://www.test.com/nameb/eee 后端的request_uri為: /yongfu?nameb=eee 
    location /nameb/ { 
        rewrite /nameb/([^/]+) /yongfu?nameb=$1 break; 
        proxy_pass http://127.0.0.1:8801/; 
    } 
     
    access_log /data/logs/www/www.test.com.log;
     
}
 
 
 
server { 
    listen 8801; 
    server_name www.test.com; 
     
    # 指定web服務器跟路徑
    root /data/www/test; 
    # 指定web服務默認頁面
    index index.php index.html; 
    # 全部重定向到 /test.php
    rewrite ^(.*)$ /test.php?u=$1 last; 
     
    # 正則匹配以.php結尾的
    location ~ .php$ { 
        try_files $uri =404; 
        fastcgi_pass unix:/tmp/php-cgi.sock; 
        fastcgi_index index.php; 
        include fastcgi.conf; 
    } 
     
    access_log /data/logs/www/www.test.com.8801.log;
     
}

文件: /data/www/test/test.php


通過查看$_SERVER['REQUEST_URI']的值,我們可以看到每次請求的后端的request_uri的值,進行驗證。

小結:
情形A和情形B進行對比,可以知道proxy_pass后帶一個URI,可以是斜杠(/)也可以是其他uri,對后端request_uri變量的影響。
情形D說明,當location為正則表達式時,proxy_pass不能包含URI部分。
情形E通過變量($request_uri, 也可以是其他變量),對后端的request_uri進行改寫。
情形F和情形G通過rewrite配合break標志,對url進行改寫,并改寫后端的request_uri。需要注意,proxy_pass地址的URI部分在情形G中無效,不管如何設置,都會被忽略。

負載均衡實踐

1,Nginx要實現(xiàn)負載均衡需要用到proxy_pass代理模塊配置

2,Nginx負載均衡與Nginx代理不同地方在于,Nginx的一個location僅能代理一臺服務器,而Nginx負載均衡則是將客戶端請求代理轉發(fā)至一組upstream虛擬服務池.

負載均衡配置模塊(proxy_pass)

# ngx_http_upstream_module
 
#語法
Syntax: upstream name { ... }
Default:    —
Context:    http
 
#例子
upstream [連接池的名稱] {
         [存放的IP]
    server [ip1]:[端口] [分發(fā)策略];
    server [ip2]:[端口] [分發(fā)策略];
}
 
server {
    ... ...
    location / {
        proxy_pass http://[連接池的名稱] ;
    }
}

proxy_pass代理模塊配置常用參數(shù)

1)添加發(fā)往后端服務器的請求頭信息

語法:    proxy_set_header field value;
默認:    proxy_set_header Host $http_host;
         proxy_set_header Connection close;
位置:    http, server, location

示例:
# 用戶請求的時候HOST的值是game1.test.com, 那么代理服務會像后端傳遞請求的還是game1.test.com
proxy_set_header Host $http_host;
# 將$remote_addr的值放進變量X-Real-IP中,$remote_addr的值為客戶端的ip(請求來源,多層代理則現(xiàn)實最近一層的)
proxy_set_header X-Real-IP $remote_addr;
# 客戶端通過代理服務訪問后端服務, 后端服務通過該變量會記錄真實客戶端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2)代理到后端的TCP連接、響應、返回等超時時間

#nginx代理與后端服務器連接超時時間(代理連接超時)
語法: proxy_connect_timeout time;
默認: proxy_connect_timeout 60s;
位置: http, server, location
 
#nginx代理等待后端服務器的響應時間
語法:    proxy_read_timeout time;
默認:    proxy_read_timeout 60s;
位置:    http, server, location
 
#后端服務器數(shù)據(jù)回傳給nginx代理超時時間
語法: proxy_send_timeout time;
默認: proxy_send_timeout 60s;
位置: http, server, location

3)proxy_buffer代理緩沖區(qū)

#nignx會把后端返回的內容先放到緩沖區(qū)當中,然后再返回給客戶端,邊收邊傳, 不是全部接收完再傳給客戶端
語法: proxy_buffering on | off;
默認: proxy_buffering on;
位置: http, server, location
 
#設置nginx代理保存用戶頭信息的緩沖區(qū)大小
語法: proxy_buffer_size size;
默認: proxy_buffer_size 4k|8k;
位置: http, server, location
 
#proxy_buffers 緩沖區(qū)
語法: proxy_buffers number size;
默認: proxy_buffers 8 4k|8k;
位置: http, server, location

常用的參數(shù)配置

方法一:直接寫到 http, server, location 塊里面
[root@lb01 conf.d]# vi game.conf

upstream game {
    server 172.16.1.8:80;
    server 172.16.1.7:80;
}

server {
    server_name game1.test.com;
    listen 80;

    location / {
        proxy_pass http://game;
        # 用戶請求的時候HOST的值是game1.test.com, 那么代理服務會像后端傳遞請求的還是game1.test.com
        proxy_set_header Host $http_host;
        # 將$remote_addr的值放進變量X-Real-IP中,$remote_addr的值為客戶端的ip
        proxy_set_header X-Real-IP $remote_addr;
        # 客戶端通過代理服務訪問后端服務, 后端服務通過該變量會記錄真實客戶端地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # nginx代理與后端服務器連接超時時間(代理連接超時)
        proxy_connect_timeout 10s;
        # nginx代理等待后端服務器的響應時間 
        proxy_read_timeout 10s;
        # 后端服務器數(shù)據(jù)回傳給nginx代理超時時間
        proxy_send_timeout 10s;
        # nignx會把后端返回的內容先放到緩沖區(qū)當中,然后再返回給客戶端,邊收邊傳, 不是全部接收完再傳給客戶  
        proxy_buffering on;
        # 設置nginx代理保存用戶頭信息的緩沖區(qū)大小
        proxy_buffer_size  8k;
        # proxy_buffers 緩沖區(qū) 
        proxy_buffers 8 8k;
        # 狀態(tài)標記
        proxy_next_upstream http_404  http_500  http_502  http_503  http_504  http_403  http_429;
    }
}

方法二:寫到單獨的文件里,然后 include 到目標位置
[root@lb01 conf.d]# vi proxy_params

# 用戶請求的時候HOST的值是game1.test.com, 那么代理服務會像后端傳遞請求的還是game1.test.com
proxy_set_header Host $http_host;
# 將$remote_addr的值放進變量X-Real-IP中,$remote_addr的值為客戶端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客戶端通過代理服務訪問后端服務, 后端服務通過該變量會記錄真實客戶端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# nginx代理與后端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 10s;
# nginx代理等待后端服務器的響應時間 
proxy_read_timeout 10s;
# 后端服務器數(shù)據(jù)回傳給nginx代理超時時間
proxy_send_timeout 10s;
# nignx會把后端返回的內容先放到緩沖區(qū)當中,然后再返回給客戶端,邊收邊傳, 不是全部接收完再傳給客戶  
proxy_buffering on;
# 設置nginx代理保存用戶頭信息的緩沖區(qū)大小
proxy_buffer_size  8k;
# proxy_buffers 緩沖區(qū) 
proxy_buffers 8 8k;
# 狀態(tài)標記
proxy_next_upstream http_404  http_500  http_502  http_503  http_504  http_403  http_429;

[root@lb01 conf.d]# vi game.conf

upstream game {
    server 172.16.1.8:80;
    server 172.16.1.7:80;
}

server {
    server_name game1.test.com;
    listen 80;

    location / {
        proxy_pass http://game;
        include proxy_params
    }
}

方法二的好處顯而易見:維護一處,多處生效,類似于模板。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9579

    瀏覽量

    86935
  • nginx
    +關注

    關注

    0

    文章

    161

    瀏覽量

    12432

原文標題:Nginx代理轉發(fā)實戰(zhàn):零基礎掌握服務器流量分發(fā)技巧

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Nginx服務器的搭建步驟

    ①搭建Nginx服務器②SSL加密網(wǎng)站③基于域名虛擬主機
    發(fā)表于 04-07 16:20

    全內存轉發(fā)服務器

    全內存轉發(fā)服務器
    發(fā)表于 01-04 13:49 ?0次下載

    構建實戰(zhàn)Nginx+IIS構筑Web服務器集群負載均衡

    構建實戰(zhàn)Nginx+IIS構筑Web服務器集群負載均衡
    發(fā)表于 09-05 10:56 ?4次下載
    構建<b class='flag-5'>實戰(zhàn)</b>:<b class='flag-5'>Nginx</b>+IIS構筑Web<b class='flag-5'>服務器</b>集群負載均衡

    介紹一款輕量級的Web服務器、反向代理服務器Nginx

    所謂反向代理,很簡單,其實就是在location這一段配置中的root替換成proxy_pass即可。root說明是靜態(tài)資源,可以由Nginx進行返回;而proxy_pass說明是動態(tài)請求,需要進行轉發(fā),比如
    的頭像 發(fā)表于 03-26 10:36 ?1w次閱讀
    介紹一款輕量級的Web<b class='flag-5'>服務器</b>、反向<b class='flag-5'>代理服務器</b><b class='flag-5'>Nginx</b>

    Nginx架構介紹 Nginx服務器模型分析

    Nginx是一款免費的、開源的、高性能、模塊化、輕量級的HTTP服務器、反向代理服務器以及電子郵件(IMAP/POP3)代理服務器。
    的頭像 發(fā)表于 01-10 16:32 ?9363次閱讀
    <b class='flag-5'>Nginx</b>架構介紹 <b class='flag-5'>Nginx</b><b class='flag-5'>服務器</b>模型分析

    怎么樣才能使用Nginx服務器配置自己的網(wǎng)站

    Nginx是一款輕量級、高性能的反向代理Web服務器,有著占有內存小、并發(fā)能力強的特點,在網(wǎng)頁ai服務器中表現(xiàn)較好,也是很受很多網(wǎng)站的選擇使用,包括百度、騰訊、新浪、淘寶等。
    發(fā)表于 03-27 08:00 ?0次下載
    怎么樣才能使用<b class='flag-5'>Nginx</b><b class='flag-5'>服務器</b>配置自己的網(wǎng)站

    詳解Nginx高性能的HTTP和反向代理服務器

    Nginx 是一個高性能的 HTTP 和反向代理服務器,特點是占用內存少,并發(fā)能力強,事實上 Nginx 的并發(fā)能力確實在同類型的網(wǎng)頁服務器中表現(xiàn)較好。
    的頭像 發(fā)表于 03-16 11:23 ?2637次閱讀

    【技術分享】如何在嵌入式Linux平臺上使用Nginx搭建RTMP流媒體服務器

    的高性能的HTTP和反向代理web服務器,它同時也是基于事件驅動開發(fā)的異步高性能跨平臺服務器。 Nginx-RTMP是基于Nginx框架的模
    的頭像 發(fā)表于 01-05 15:15 ?771次閱讀

    【技術分享】如何在嵌入式Linux平臺上使用Nginx搭建RTMP流媒體服務器

    的HTTP和反向代理web服務器,它同時也是基于事件驅動開發(fā)的異步高性能跨平臺服務器。Nginx-RTMP是基于Nginx框架的模塊開發(fā),很
    的頭像 發(fā)表于 01-13 09:27 ?1510次閱讀
    【技術分享】如何在嵌入式Linux平臺上使用<b class='flag-5'>Nginx</b>搭建RTMP流媒體<b class='flag-5'>服務器</b>?

    nginx使用學習之正、反向代理

    ,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。 簡單一點:通過代理服務器來訪問服務器
    的頭像 發(fā)表于 11-13 10:54 ?1319次閱讀
    <b class='flag-5'>nginx</b>使用學習之正、反向<b class='flag-5'>代理</b>

    Nginx的配置文件如何設置頭信息保留真實IP不丟失

    Nginx 配置中設置頭信息以保留客戶端的真實 IP 地址通常是在使用反向代理的場景中需要的。當 Nginx 作為反向代理時,客戶端的真實 IP 地址可能會在
    的頭像 發(fā)表于 11-30 10:54 ?2193次閱讀

    Apache服務器Nginx服務器

    Apache和Nginx都是常見的開源Web服務器軟件,它們用于處理HTTP請求并提供網(wǎng)站和應用程序的服務。下面是對Apache和Nginx的一些基本特點的比較: 一、Apache H
    的頭像 發(fā)表于 01-22 16:48 ?721次閱讀

    如何使用nginx反向代理功能?保姆級教程!

    一關于nginxnginx是一款高性能的開源Web服務器軟件,也可以用于反向代理、負載均衡等,并且具有高性能、低內存消耗等優(yōu)點。本文我們主要講解關于nginx的反向代理功能,并在
    的頭像 發(fā)表于 06-21 08:21 ?912次閱讀
    如何使用<b class='flag-5'>nginx</b>反向<b class='flag-5'>代理</b>功能?保姆級教程!

    Python中代理服務器的配置與應用

    在網(wǎng)絡通信中,代理服務器作為一種重要的網(wǎng)絡中間件,充當著客戶端和目標服務器之間的中間人角色。它能夠接收來自客戶端的請求,并將這些請求轉發(fā)給目標服務器,然后將
    的頭像 發(fā)表于 11-12 07:13 ?408次閱讀

    Nginx實戰(zhàn)全攻略

    Nginx 是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3 代理服務器。它以其高并發(fā)處理能力、穩(wěn)定性、豐富的功能模塊和低內存消耗而聞名。
    的頭像 發(fā)表于 03-31 10:44 ?1552次閱讀
    <b class='flag-5'>Nginx</b><b class='flag-5'>實戰(zhàn)</b>全攻略
    主站蜘蛛池模板: 亚洲第一视频在线观看 | 狠狠丁香激情久久综合 | 久久精品屋 | 苦瓜se影院在线视频网站 | 久操精品在线观看 | 久久夜色精品国产尤物 | 日韩色天使综合色视频 | 日本免费黄色 | 美女网站视频色 | 性生大片免费观看无遮挡 | 看全色黄大色大片免费久久怂 | 涩狠狠狠狠色 | 日本一区高清视频 | 天天干天天操天天做 | 狠狠干b | 韩国美女丝袜一区二区 | 一级毛片美国一级j毛片不卡 | 国内精品免费视频精选在线观看 | 欧美黄色一级视频 | 视频在线播放免费 | 欧美一级免费观看 | 久久www免费人成高清 | 日本免费不卡视频一区二区三区 | 日本精品一在线观看视频 | 久久6免费视频 | 二区在线播放 | 丁香五月欧美成人 | 亚洲经典乱码在线播 | 水果视频色版 | 国产伦理一区二区三区 | 男人的天堂色偷偷 | 在线观看网址你懂得 | 日本在线亚洲 | 伊人yinren6综合网色狠狠 | 成人午夜免费视频 | 国产呦系列呦交 | 国产爽视频| 婷婷综合久久 | 五月婷婷丁香在线观看 | 欧美a在线 | 琪琪see色原在线20 |