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测试环境。

下面为一个配置的例子:

继续阅读

jks格式的证书转base64的key格式证书

最近发现公司之前申请的SSL证书是tomcat使用的jks格式的私key,但是我现在要放到nginx上使用,所以需要把jks格式的证书转base64的私key格式证书。

网上找了一些资料:

JKS(Java KeyStore)是Java的一个证书仓库,包括授权整数和公钥整数等。JDK提供了一个工具keytool用于管理keystore。转换步骤:

1.使用keytool导出成PKCS12格式:


2. 生成pem证书(包含了key,server证书和ca证书):

继续阅读

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 location匹配规则

location匹配命令

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

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

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;
}