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 

相关文章
相关标签/搜索