nginx的add_header及proxy_set_header命令有三个地方可以配置,分别是http,server,location。我们一般对其优先级的理解是location->server->http。

这没有错,但是这个优先级是指令级别的(不包括指令后面的参数),也就是说:假设在http和server内都有add_header,那么只有server内的生效,忽略http内的add_header,而不管在这两个地方配置新增的header是不是一样。

proxy_set_header也是一样的效果。所以个人推测有很多nginx指令可能都是这样的规则。

另个在同一级别也有坑,对于add_header,如果同一个域名的两个不同location加了不同的add_header,那么只有最后一个location内的生效。这个我没有亲测,详细的可以看下面的参考链接。

阅读全文

nginx配置维护页面

经常性的,在版本上线时,我们需要配置一个维护页面,以便让用户看到。而同时自己还需要能访问。

也就是说在维护的同时,还需要指定的IP能访问。

以下就是一个nginx配置维护页面的例子:

其中:

/weihu/是维护页面的URL,应该在/data/www下建一个weihu的目录,把维护页面index.html放到这个目录内.

103.214.84.224|101.231.194.4|180.168.251.235为允许访问的IP地址。

最终效果:当用户访问真实的URL时,会显示跳转至/weihu/

阅读全文

最近在配置nginx时,发现了一个问题,是关于nginx配置文件测试的。

如下的nginx配置,在upstream没有配置的情况下:

    location /frontend-gateway/ {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        set $globalTicket $pid--$remote_addr-$request_length-$connection;
        proxy_set_header globalTicket $globalTicket;

        proxy_pass http://o2o-frontend-gateway/;
    }

我们通过nginx -t测试可以发现,是可以测试通过的。

[root@sh-o2o-nginx-router-online-04 vhost.d]# /usr/local/nginx/sbin/nginx -t
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

照说要报错才对。初步怀疑是把o2o-frontend-gateway当成一个域名了?

阅读全文

nginx使用map配置AB测试环境

通过使用nginx的map可以配置按照不同的值(如URL参数,POST值,cooke,http头等等…),来转到不用的后端主机,以实现简单的AB测试环境。

下面为一个配置的例子:

# underscores_in_headers on;
#当使用超过一个map时,下面两个参数需要调大,否则会报错
map_hash_max_size 262144;
map_hash_bucket_size 262144;

#定义3个upstream用于AB测试,用于显示不同的内容,相应下面有建3个虚拟主机端口与此对应
upstream def {
        server 127.0.0.1:8080;
}

upstream a {
        server 127.0.0.1:8081;
}

upstream b {
        server 127.0.0.1:8082;
}

# 定义map,$cookie_aid是指从cookie内取aid的值,当cookie内aid的值为"12345"时,$upserver为a,$upserver我这边是用的是upstrem的名称,其它类似
map $cookie_aid $upserver {
        default                          "def";
        "12345"                          "a";
        "67890"                          "b";
}
# 从$http_pid内取值,是从http header内取pid的的值,当http header内pid的值为"12345"时,$headerpid 为a,其它类似
map $http_pid $headerpid {
        default                          "def";
        "12345"                          "a";
        "67890"                          "b";
}
# 从$host内取值,$host对应的是用户访问的域名,当域名的值为12345.abtest-b.xxxxx.com时,$bserver 为a,其它类似
map $host $bserver {
		12345.abtest-b.xxxxx.com       "a";
		67890.abtest-b.xxxxx.com       "b";
		.abtest-b.xxxxx.com            "def";
		default                        "def";
}
# 从$arg_userid内取值,$arg_userid对应的是用户访问的URL上所带的参数userid的值,当userid的值为12345时,$userid为a,其它类似
map $arg_userid $userid {
        default                          "def";
        "12345"                          "a";
        "67890"                          "b";
}

server {
        listen 80;
        server_name abtest.xxxxx.com;
        charset utf-8;
        root /data/www/a/;
        access_log /data/log/nginx/abtest.internal.weimobdev.com_access.log main;
        error_log /data/log/nginx/abtest.internal.weimobdev.com_error.log info;

        location / {
                # 通过以下的if语句,实现多个变量的判断,当cookie内取aid的值判断完后,再判断http header内pid的值
                if ( $upserver = "def" ) {
                         set $upserver  $headerpid;
                }
                # 由于$upserver我这边是用的是upstrem的名称,所以可以直接转发
                proxy_pass http://$upserver;   
        }
}

server {
        listen 80;
        server_name abtest-b.xxxxx.com *.abtest-b.xxxxx.com;
        charset utf-8;
        root /data/www/a/;
        access_log /data/log/nginx/abtest-b.xxxxx.com_access.log main;
        error_log /data/log/nginx/abtest-b.xxxxx.com_error.log info;

        location / {
                # 通过以下的if语句,实现多个变量的判断,当$host内的域名判断完后,再判断URL上所带的参数userid的值
                if ( $bserver = "def" ) {
                         set $bserver $userid;
                }
                # 
                proxy_pass http://$bserver;
        }
}

server {
        listen 8080;
        charset utf-8;
        root /data/www/default/;
        access_log /data/log/nginx/default.log;
}

server {
        listen 8081;
        charset utf-8;
        root /data/www/a/;
        access_log /data/log/nginx/a.log;
}

server {
        listen 8082;
        charset utf-8;
        root /data/www/b/;
        access_log /data/log/nginx/b.log;
}

阅读全文

NGINX中proxy_redirect的作用

NGINX的proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改。以例子说明:

例一:

   server {
       listen       80;
       server_name  test.abc.com;
       location / {
            proxy_pass http://10.10.10.1:9080;
       }
   }

这段配置一般情况下都正常,但偶尔会出错, 错误在什么地方呢?

抓包发现服务器给客户端的跳转指令里加了端口号,如 Location: http://test.abc.com:9080/abc.html 。因为nginx服务器侦听的是80端口,所以这样的URL给了客户端,必然会出错.针对这种情况, 加一条proxy_redirect指令: proxy_redirect http://test.abc.com:9080/ / ,把所有http://test.abc.com:9080/的内容替换成/再发给客户端,就解决了。

   server {
       listen       80;
       server_name  test.abc.com;
       proxy_redirect http://test.abc.com:9080/ /;
       location / {
            proxy_pass http://10.10.10.1:9080;
       }
   }

阅读全文

nginx location匹配规则

location匹配命令

~      #波浪线表示执行一个正则匹配,区分大小写
~*    #表示执行一个正则匹配,不区分大小写
^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      #进行普通字符精确匹配
@     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

location 匹配的优先级(与location在配置文件中的顺序无关)

= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

阅读全文

今天在配置zabbix,之前zabbix是使用apache+php的,现在想换成nginx+php-fpm,nginx配置如下:

        location /zabbix/ {

            alias           /usr/share/zabbix/;
            index           index.php;
            error_page      403 404 502 503 504  /zabbix/index.php;

            location ~ .php$ {
                expires        epoch;
                fastcgi_pass   unix:/tmp/php-cgi.sock;
                fastcgi_index  index.php;
                include        fastcgi.conf;
            }

            location ~ .(jpg|jpeg|gif|png|ico)$ {
                access_log  off;
                expires     33d;
            }

        }

发现通过WEB访问zabbix PHP程序时,显示是404未找到文件的错误。

阅读全文

作者的图片

阿辉

容器技术及容器集群等分布式系统研究

容器平台负责人

上海