标签:nginx


nginx代理过程中修改user_agent


关于User_agent是啥,就不多介绍了,简单说就是客户端的标识,比如chrome浏览器有chrome浏览器的标识,手机客户端也有手机客户端的标识。

有些特殊场景需要指定一个固定的user_agent,来模拟某个客户端。这时候,就可以借助Nginx的反向代理来实现。Nginx配置文件如下:

server {
    listen 8000;
    server_name localhost;
    access_log  log/access-8000.log;
    error_log  log/error-8000.log;

    location / {
        set $ua "lalallalalla x33xx33";
        proxy_pass   http://127.0.0.1:8081/;
        proxy_set_header User-Agent $ua;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}

再来看看访问日志:

127.0.0.1 - - [19/Nov/2020:11:56:55 +0800] "GET /build/framework/js/7eaf6.chunk.js HTTP/1.0" 200 42870 "http://192.168.0.62:8000/" "lalallalalla x33xx33"
127.0.0.1 - - [19/Nov/2020:11:56:55 +0800] "GET /uusafe/gloab/rest/saas/all HTTP/1.0" 200 536 "http://192.168.0.62:8000/" "lalallalalla x33xx33"

已经将user_agent修改为了自定义的了。


nginx的alias和root的区别


假设,网站的域名为 http://abc.com/,下面分别写两个配置来说明alias和root的区别。

location /123/ {

root /data/wwwroot/abc.com;

}

location /123/ {

alias /data/dir/;

}

上面两段配置,如果访问的链接地址为 http://abc.com/123/1.jpg

第一段会访问服务器上的/data/wwwroot/abc.com/123/1.jpg

第二段配置会访问服务器上的/data/dir/1.jpg

总结一下,用root时,要加上location后面的目录/123/,用alias时,不加/123/目录。

另外还需要注意下面要求:

1) 使用alias时,后面跟的目录结尾必须要加/

2) alias只能在location中使用


nginx的location优先级


在nginx配置文件中,location主要有这几种形式:

1. 正则匹配 location ~ /abc { }

2. 不区分大小写的正则匹配 location ~* /abc { }

3. 匹配路径的前缀,如果找到停止搜索 location ^~ /abc { }

4. 精确匹配 location = /abc { }

5.普通路径前缀匹配 location /abc { }

 

先说优先级

4 > 3 > 2 > 1 > 5

 

再来解释一下各个格式

location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}

location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}

location /documents/ {

# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}

location ~ /documents/Abc {

# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}

location ^~ /images/ {

# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {

# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}

location /images/ {

# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}

location /images/abc {

# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}

location ~ /images/abc/ {

# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}​

 

再来分析一下A-H配置的执行顺序。

1. 下面2个配置同时存在时

location = / {
[ configuration A ]
}

location / {
[ configuration B ]
}

此时A生效,因为=/优先级高于/

 

2. 下面3个配置同时存在时

location  /documents/ {
[ configuration C ]
}

location ~ /documents/ {

[configuration CB]

}

location ~ /documents/abc {
[ configuration CC ]
}

当访问的url为/documents/abc/1.html,此时CC生效,首先CB优先级高于C,而CC更优先于CB

 

3. 下面4个配置同时存在时

location ^~ /images/ {
[ configuration D ]
}

location /images/ {
[ configuration F ]
}

location /images/abc {
[ configuration G ]
}

location ~ /images/abc/ {
[ configuration H ]
}​

当访问的链接为/images/abc/123.jpg时,此时D生效。虽然4个规则都能匹配到,但^~优先级是最高的。

若^~不存在时,H优先,因为~/images/ > /images/

而/images/和/images/abc同时存在时,/images/abc优先级更高,因为后者更加精准

 

4. 下面两个配置同时存在时

location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}

location ~ /images/abc/ {

[ configuration H ]
}​

当访问的链接为/images/abc/123.jpg时,E生效。因为上面的规则更加精准。


nginx代理一堆域名


需求背景:  内网有一台机器不能连外网,所以没有办法使用yum,考虑过使用iptables nat 转发上网,但因为一些原因,放弃使用。所以想到nginx代理,原理很简单。

A 不能访问 1网站, B可以访问,A和B可以内网通信,所以可以让B作为A的代理。 并且可以限定访问的来源IP,配置文件如下:

server {
listen       80;
server_name aaa.com bbb.com  ccc.com ddd.com eee.com;

location / {
resolver 119.29.29.29;
proxy_pass       http://$host;
proxy_set_header Host      $host;
proxy_set_header X-Real-IP $remote_addr;
allow 192.168.5.0/24;
deny all;
}
}

说明:这里的119.29.29.29 为一个DNS的ip,用resolver来指定。

假如B机器内网ip为 192.168.5.11,只需要在A上加一条hosts

192.168.5.11 aaa.com bbb.com ccc.com ddd.com eee.com


nginx 代理tomcat,自定义404页面


需求背景是:

网站基于java,使用tomcat搭建环境,使用nginx作为前端代理。若不做特殊处理,当访问出现404时,将会返回tomcat的404页面,现要求404页面为nginx的自定义页面,并非tomcat自带的404页面。

nginx的配置文件内容如下:

server {

listen 80;

server_name www.xxx.com;

proxy_intercept_errors  on;

recursive_error_pages   on;

location / {

error_page 404 @404;

proxy_pass      http://127.0.0.1:8080;

proxy_set_header Host   $host;

}

location @404 {

root /tmp/111/;

error_page 404 /404.html;

}

}

其中红色字体的两行配置非常关键,404.html的位置在/tmp/111/404.html。

proxy_intercept_errors  on; 当上游服务器响应头回来后,可以根据响应状态码的值进行拦截错误处理,与error_page 指令相互结合。用在访问上游服务器出现错误的情况下。

recursive_error_pages   on; 可以让下面的location @404生效。