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

1.19 nginx的location配置php

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

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

配置寫法:linux

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

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

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

location語法git

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

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

location優先級及案例web

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

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 

相關文章
相關標籤/搜索