1.19-1.22 Nginx的location配置,正向、反向代理

1.19 nginx的location配置

安裝第三方模塊echo-nginx-module

git clone https://github.com/openresty/echo-nginx-module.git
./configure --prefix=/usr/local/nginx --add-module=/path/to/echo-nginx-module

安裝echo模塊操作:

cd /usr/local/src/nginx-1.8.0/
./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/echo-nginx-module
make && make install 
/etc/init.d/nginx restart
# nginx -V
nginx version: nginx/1.8.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
configure arguments: --prefix=/usr/local/nginx --add-module=/usr/local/src/echo-nginx-module

配置寫法:

server {
        listen 80;
        server_name  2.com;
        root /data/t-nginx/2.com;
        location /abc/
          {
                echo 123;
          }
        }

效果 訪問/abc/要輸出echo的信息

curl -x127.0.0.1:80 2.com/abc/1111
123

location語法

location [=|^~|~|~*] /uri/ { …. }

https://coding.net/u/aminglinux/p/nginx/git/blob/master/location/ruler.md 

location優先級及案例

  • =  高於  ^~  高於  ~* 等於 ~  高於  /

http://coding.net/u/aminglinux/p/nginx/git/blob/master/location/priority.md 

場景比較:/與~*

server {
        listen 80;
        server_name  2.com;
        root /data/t-nginx/2.com;
        location /abc/
          {
                echo "/";
          }
        location ~* abc
          {
                echo "~*";
          } 
        }

效果

  •  當匹配到 location /abc/的時候,輸出/

  •  當匹配到 location ~* abc的時候,輸出~*

測試訪問:

curl -x127.0.0.1:80 2.com/abc/1111
~*

實驗證明,同樣的場景~*比/的優先級要高。


場景比較:~與~*

當這2個同時存在,會匹配最先出現的location語法。


場景比較:= 與 ^~

vim 2.com.conf 
server {
        listen 80;
        server_name  2.com;
        root /data/t-nginx/2.com;
        location ^~ abc
          {
                echo "^~";
          }
        location = "/abc/1.php"
          {
                echo "=";
          }
}
# curl -x127.0.0.1:80 2.com/abc/1.php
=

實驗證明,同樣的場景,=比^~的優先級要高。


規則示例

location = "/12.jpg" { ... }

如:

www.aminglinux.com/12.jpg 匹配
www.aminglinux.com/abc/12.jpg 不匹配

不匹配原因:因爲“=”是精準匹配


location ^~ "/abc/" { ... }

如:

www.aminglinux.com/abc/123.html 匹配
www.aminglinux.com/a/abc/123.jpg 不匹配

不匹配原因:因爲是以"/abc/"開頭並匹配


location ~ "png" { ... }

如:

www.aminglinux.com/aaa/bbb/ccc/123.png 匹配
www.aminglinux.com/aaa/png/123.html 匹配

都匹配:~匹配"png"即可


location ~* "png" { ... }

如:

www.aminglinux.com/aaa/bbb/ccc/123.PNG 匹配
www.aminglinux.com/aaa/png/123.html 匹配

都匹配:因爲不區分大小寫匹配,所以有"png"都會匹配


location /admin/ { ... }

如:

www.aminglinux.com/admin/aaa/1.php 匹配
www.aminglinux.com/123/admin/1.php 不匹配

不匹配原因:因爲是匹配uri後/admin/的開頭,so第二個不配。



1.20 nginx正向代理

示意圖

https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/pic.md 

Nginx正向代理

https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md 

正向代理:

用戶和代理服務器在同一個內網環境裏,代理服務器幫用戶去訪問用戶訪問不到的web server

Nginx正向代理配置文件

server {
    listen 80 default_server;
    resolver 119.29.29.29;
    location /
    {
        proxy_pass http://$host$request_uri;
    }
}

解釋:

正向代理配置文件一定要設default_server;

 resolver 119.29.29.29; 解釋dns,這個dns能解析所有公網web,除了被大陸防火牆屏蔽掉的(Facebook,Instagram...)

訪問測試:

 curl 外網

 curl -x127.0.0.1:80 外網


1.21 Nginx反向代理

https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/f_proxy.md 

配置反向代理:

條件:

1 需要代理的server_name

2 server_name的IP或者ip:port


80代理90的域名配置如下:

server
{
    listen 80;
    server_name www.test.com;
    
    location /
    {
        proxy_pass http://127.0.0.1:90/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

90被代理的虛擬主機配置:

server
{
        listen 90 default_server;
        server_name www.test.com;
        root /data/t-nginx/test.com/;
        index index.html ;
}       
mkdir -p /data/t-nginx/test.com
echo "test.com_90" > /data/t-nginx/test.com/index.html

訪問測試:

# curl -x127.0.0.1:90 www.test.com
test.com_90
# curl 127.0.0.1:90
test.com_90

訪問ip:port和從90端口訪問都是一樣。


場景:訪問test.com下,一個是default_server,另一個不是,區別輸出結果

[root@AliKvn vhost]# cat test.com.conf 
server
{
listen 90 ;
server_name www.test.com;
root /data/t-nginx/test.com/;
index index.html ;
}
[root@AliKvn vhost]#test.com-90-default.conf 
server
{
listen 90 default_server;
#server_name www.test.com;
root /data/t-nginx/test.com/;
index index.html ;
 
  location /
          {
    echo "90 default";
}
}

訪問測試:

#curl 127.0.0.1:90 
90 default
# curl -x127.0.0.1:90 www.test.com
test.com_90
# curl -x127.0.0.1:80 www.test.com
test.com_90

當利用80端口去訪問 www.test.com的時候,跟利用90端口去訪問www.test.com是一樣的,證明反向代理已經配置成功了。   

當proxy_pass 後面接的是域名的話,域名需要在本機hosts解析。

proxy_set_header 的Host $host 是對應的,區分爲前端和後端地址。


1.23 nginx反向代理——proxy_pass

不管什麼情況下,proxy_pass的地址,最後最好都加上/


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地址。

$remote_addr 遠程客戶端的IP地址

$proxy_add_x_forwarded_for 記錄代理的IP地址,遠程真實客戶端的IP地址,

例如A-->B-->C-->他們的角色分別是,客戶端、反向代理服務器、真實web服務器。那麼A的地址就是$proxy_add_x_forwarded_for 所記錄的。


可以用如下示例來測試:


示例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;
    }
}


 1.24 Nginx反向代理 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;
    }
}

nginx反向代理——proxy_pass

 管什麼情況下,最好都加上/


緩衝和緩存 https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/bu_ca.md 


Nginx負載均衡

https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/lb.md 




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