nginx的add_header及proxy_set_header命令需注意的地方

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配置文件测试的。

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

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

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

继续阅读

nginx使用map配置AB测试环境

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

下面为一个配置的例子:

继续阅读

NGINX中proxy_redirect的作用

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

例一:

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

抓包发现服务器给客户端的跳转指令里加了端口号,如 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/”的内容替换成“/”再发给客户端,就解决了。

继续阅读

nginx+php-fpm中使用alias需要注意的地方

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

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

fastcgi.conf文件如下:

发现其中SCRIPT_FILENAME有点问题: 继续阅读

nginx虚拟目录alias需注意的地方

今天配置awstats,awstats创建出的文件目录在/home/awstats下,在nginx中加入配置后狂报404,发现还是忽略了root和alias的区别,特将修改配置记录如下:
1.失败:server {
server_name  test.com;
charset utf-8,GB2312;
index  index.html;
        location / {
root html;
access_log logs/access.log main;
}
        location ~ ^/awstats/ {
root  /home/awstats/;
index  index.html;
access_log off;
error_log off;
charset gb2312;
}
2.失败: server {
server_name  test.com;
charset utf-8,GB2312;
index  index.html;
        location / {
root html;
access_log logs/access.log main;
}
        location ~ ^/awstats/ {
alias  /home/;
index  index.html;
access_log off;
error_log off;
charset gb2312;
}

关于nginx做反向代理http 认证的问题

使用nginx做反向代理,当后端服务器需要认证时,需要把认证的http header也传到后端服务器上去,配置为:
proxy_set_header Authorization $http_authorization;
这样配置后,服务器会发出一个认证窗口出来,提示用户输入用户名密码。

如果不想让用户输入用户名密码,可用下面的配置:
proxy_hide_header WWW-Authenticate; //隐藏发给用户的认证http header,相当于不提示用户输用户名密码了。
proxy_set_header Authorization “Basic dXNlcjpwYXNzd29yZA==”; //发送httpd 认证 header给后端服务器。

dXNlcjpwYXNzd29yZA==是base64(user:pass)得到的。

解释一下上面两个http header:

WWW-Authenticate: 这是GET的时候带的,服务器发给客户端的。表明客户端请求实体应该使用的授权方案

示例:WWW-Authenticate: Basic

Basic是基本的http认证方式,除此之外还有NTLM等,NTLM是微软的,nginx目前不支持。

Authorization 这个是用户输入用户名和密码后,POST到服务器的时候带的。HTTP授权的授权证书
示例:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

继续阅读

load balancer后端nginx封IP的方法

周末发现在个IP恶意访问,我们就想先封掉这个IP地址。

我们的环境是前端有个load balancer,后端有几台WEB服务器。load balancer上不好封IP地址,那就只能配置在后端WEB服务器的nginx上了。

很简单,我很快就配置上去了,如下面这样的:

继续阅读