Nginx的代理

Nginx的代理

正向代理
相當於加一個代理去訪問服務
比如國外的網站很多都被禁用,而香港那邊的服務器可以訪問,這時需要在客戶端加上這個香港服務器的代理,就可以訪問國外網站

Nginx的代理

Nginx的代理

反向代理
客戶端請求代理的服務器,代理的服務器轉發到真實的服務器

Nginx的代理

Nginx的代理

Nginx正向代理配置
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md

Nginx正向代理使用場景並不多見。
需求場景1:
如果在機房中,只有一臺機器可以聯網,其他機器只有內網,內網的機器想用使用yum安裝軟件包,在能能聯網的機器上配置一個正向代理即可。

Nginx正向代理配置文件
server {
listen 80 default_server;
resolver 119.29.29.29;
location /
{
proxy_pass http://$host$request_uri;
}
}

Nginx正向代理配置執行說明
resolver
語法:resolver address;

address爲DNS服務器的地址,國內通用的DNS 119.29.29.29爲dnspod公司提供。 國際通用DNS 8.8.8.8或者8.8.4.4爲google提供。
其他可以參考 http://dns.lisect.com/

示例:resolver 119.29.29.29;

default_server
之所以要設置爲默認虛擬主機,是因爲這樣就不用設置server_name了,任何域名解析過來都可以正常訪問。

proxy_pass
該指令用來設置要代理的目標url,正向代理服務器設置就保持該固定值即可。關於該指令的詳細解釋在反向代理配置中。

Nginx反向代理
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/f_proxy.md
緩衝和緩存 https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/bu_ca.md

Nginx反向代理配置
Nginx反向代理在生產環境中使用很多的。

場景1:
域名沒有備案,可以把域名解析到香港一臺雲主機上,在香港雲主機做個代理,而網站數據是在大陸的服務器上。

示例1:

server 
{
    listen 80;
    server_name aminglinux.com;

    location /
    {
        proxy_pass http://123.23.13.11/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

配置說明

  1. proxy_pass
    
    在正向代理中,已經使用過該指令。
    格式很簡單: proxy_pass  URL;
    其中URL包含:傳輸協議(http://, https://等)、主機名(域名或者IP:PORT)、uri。

示例如下:
proxy_pass http://www.aminglinux.com/;
proxy_pass http://192.168.200.101:8080/uri;
proxy_pass unix:/tmp/www.sock;

對於proxy_pass的配置有幾種情況需要注意。
示例2:
location /aming/
{
proxy_pass http://192.168.1.10;
...
}

示例3:
location /aming/
{
proxy_pass http://192.168.1.10/;
...
}

示例4:
location /aming/
{
proxy_pass http://192.168.1.10/linux/;
...
}

示例5:
location /aming/
{
proxy_pass http://192.168.1.10/linux;
...
}

假設server_name爲www.aminglinux.com
當請求http://www.aminglinux.com/aming/a.html的時候,以上示例2-5分別訪問的結果是

示例2:http://192.168.1.10/aming/a.html

示例3:http://192.168.1.10/a.html

示例4:http://192.168.1.10/linux/a.html

示例5:http://192.168.1.10/linuxa.html


2. proxy_set_header

proxy_set_header用來設定被代理服務器接收到的header信息。

語法:proxy_set_header field value;
field爲要更改的項目,也可以理解爲變量的名字,比如host
value爲變量的值

如果不設置proxy_set_header,則默認host的值爲proxy_pass後面跟的那個域名或者IP(一般寫IP),
比如示例4,請求到後端的服務器上時,完整請求uri爲:http://192.168.1.10/linux/a.html

如果設置proxy_set_header,如 proxy_set_header host $host;
比如示例4,請求到後端的服務器完整uri爲:http://www.aminglinux.com/linux/a.html

proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用來設置被代理端接收到的遠程客戶端IP,如果不設置,則header信息中並不會透傳遠程真實客戶端的IP地址。
可以用如下示例來測試:

示例6(被代理端)
server{
listen 8080;
server_name www.aminglinux.com;
root /tmp/123.com_8080;
index index.html;
location /linux/ {
echo "$host";
echo $remote_addr;
echo $proxy_add_x_forwarded_for;
}
}

示例7(代理服務器上)
server {
listen 80;
server_name www.aminglinux.com;

location /aming/
{
proxy_pass http://192.168.1.10:8080/linux/;
proxy_set_header host $host;
proxy_set_header X-Real-IP      $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}


3、proxy_redirect

該指令用來修改被代理服務器返回的響應頭中的Location頭域和“refresh”頭域。
語法結構爲:
proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;

示例8:
server {
listen 80;
server_name www.aminglinux.com;
index index.html;

location /
{
proxy_pass http://127.0.0.1:8080;
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://www.aminglinux.com/aming
結果會返回301,定向到了 http://www.aminglinux.com:8080/aming/

注意:返回301有幾個先決條件

  1. location後面必須是/;
  2. proxy_pass後面的URL不能加uri,只能是IP或者IP:port結尾,並不能以/結尾;
  3. 訪問的uri必須是一個真實存在的目錄,如,這裏的aming必須是存在的
  4. 訪問的時候,不能以/結尾,只能是 www.aminglinux.com/aming

雖然,這4個條件挺苛刻,但確實會遇到類似的請求。解決方法是,加一行proxy_redirect http://$host:8080/ /;

示例9:
server {
listen 80;
server_name www.aminglinux.com;
index index.html;

location /
{
proxy_pass http://127.0.0.1:8080;
proxy_set_header host $host;
proxy_redirect http://$host:8080/ /;
proxy_set_header X-Real-IP      $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章