nginx php Primary script unknown

2014年3月10日 没有评论

在centos6.4 x86_64上成功编译安装nginx 1.4、php 5.4后,成功启动nginx和php-fpm后,访问php提示错误,同时在错误日志中看到:

Primary script unknown ...

其中nginx配置片段如下:

location ~ \.php$ {
    root           /rootToWebFolderPath;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /rootToWebFolderPath/$fastcgi_script_name;
    include        fastcgi_params;
}

上述配置是正常工作在nginx 1.2、php 5.3下。所以怀疑是其他地方配置有误,一番折腾,问题依旧,再次网上搜索,看到其中一篇文章中提到 fastcgi_param 配置不是使用觉得路径,而是采用了变量($document_root)的方式。尝试修改配置为:

location ~ \.php$ {
    root           /rootToWebFolderPath;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

此时nginx、php正常工作了。注意:上述两处配置中的 fastcgi_param 区别

分类: Linux, nginx 标签:

Nginx could not build the server_names_hash 错误

2014年3月10日 没有评论

在给nginx 配置了一个超长的域名后,通过 /usr/local/nginx/sbin/ngnix -t 检查配置文件时出现一下错误:

could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32

解决办法是在nginx的配置文件的http段中增加如下配置:

server_names_hash_bucket_size 64;

如果已经存在,需要加大后面的数值,注意:该数值是32的倍数为宜。

具体信息可以参看nginx官网:http://nginx.org/cn/docs/http/server_names.html

分类: Linux, nginx 标签:

nginx add header 指令

2013年9月22日 没有评论

nginx配置文件通过使用add_header指令来设置response header,response header一般都是以key:value的形式,例如:“Content-Encoding:gzip、Cache-Control:no-store”,设置的命令为:

add_header Cache-Control no-store
add_header Content-Encoding gzip

但是有一个十分常用的response header比较特性,就是Content-Type,可以在它设置了类型的同时还会指定charset,例如:“text/html; charset=utf-8”,由于其存在分号,而分号在配置文件中作为结束符,所以在配置的时候需要用引号把其引起来,配置如下:

add_header  Content-Type 'text/html; charset=utf-8';

另外由于没有单独设置charset的key,所以要设置响应的charset就需要使用Content-Type来指定charset。

分类: nginx 标签: ,

nginx 配置禁止访问目录或文件

2013年8月1日 没有评论

要禁止某个或一类资源,只需要增加一个location,然后在其中使用deny all即可。

禁止访问扩展名为bat的文件,配置如下:

location ~* /\.bat {
    deny all;
}

禁止访问configs目录,以及其下所有子目录或文件,配置如下:

location ^~ /configs/ {
    deny all;
}

注意上述configs后面的斜杠不能少,否则所有以configs开头的目录或文件都将禁止访问。

分类: nginx 标签:

nginx location 指令匹配顺序

2013年8月1日 没有评论

location指令是server段中的一个指令,可以对不同路径或不同文件类型进行特殊处理。例如用的比较多的就是针对网站的静态内容设置缓存。由于一个server段中可以有多个location,而http请求最终只能使用其中的一个,所以有必要弄清nginx是如何选择location的。

location 指令语法如下:

location [=|^~|~|!~|~*|!~*] uri {

}

上述配置中[]内为可选配置,但只能使用其中一个。关于具体含义,可以参考:nginx 匹配操作符。uri可以是普通字符串或正则表达式。

匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。

一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

总结下来location指令的匹配顺序为:
1、“=”前缀指令匹配,如果匹配成功,停止其他匹配
2、普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用“^~”前缀,则停止其他匹配。
3、正则表达式指令匹配,按配置文件里的顺序,成功就停止其他匹配。
4、如果第3步中有匹配成功,则使用该结果,否则使用第二步中的匹配结果。

分类: nginx 标签:

nginx proxy 配置不当导致500错误

2012年12月6日 没有评论

访问网站提示500错误,通过查看日志,获得错误信息为:

2012/12/06 16:10:52 [alert] 11679#0: *9189 1024 
worker_connections are not enough while connecting to upstream, 
client: 127.0.0.1, server: xxx.netingcn.com, 
request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:80/", host: "xxx.netingcn.com"

对于上述错误网上很多人提到,大部分情况是在生产环境中由于并发太多造成的。解决办法就是修改配置文件中的worker_connections值,将其调大。但是今天在本机的nginx中配置一个proxy,完全没有外界的访问的情况也提示上述错误,试着修改worker_connections也没有解决问题。proxy配置大致如下:

server {
    listen       80;
    server_name  yyy.netingcn.com;

    location / {
        root   /var/www/netingcn.com;
        index  index.html index.php;
    }
}

server {
    listen       80;
    server_name  xxx.netingcn.com;

    location / {
        proxy_pass              http://yyy.netingcn.com/;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
    }
}

原本的目的是想把所有请求xxx.netingcn.com代理到yyy.netingcn.com,也许你会纳闷,干嘛要这么麻烦,直接在第一个的server_name中添加xxx.netingcn.com不就完事。这里只是一个举例,由于正式环境下有特殊情况,不能那么配置,所有才会想到用proxy的方式。

上述配置造成的500错误可以肯定排除是worker_connections太小的原因,仔细配置,发现“proxy_set_header Host $http_host;”这个才是罪魁祸首,因为它造成死循环了,当请求xxx时,由于proxy到yyy,本来nginx是交给server yyy,来处理的,但是header里面的host还是xxx,nginx根据配置里面的server_name,找到 xxx,因此就显示了死循环,也就会报前面提到的那个错了。问题已经定位到了,解决就很简单,直接去掉proxy_set_header Host $http_host;这行配置就行了。

分类: nginx 标签:

nginx 配置子域名的重定向

2012年9月17日 没有评论

目前很多网站可以为用户分配一个自己定义的二级域名,例如:myname.netingcn.com,但实际访问的地址可能为www.netingcn.com/user.php?uid=myname。要使其能正常工作,首先在DSN解析那里需要配置泛域名解析,接下来在nginx配置文件中设置rewrtie即可。nginx配置如下:

server {
    listen      80;
    server_name *.netingcn.com;
	...
	if ($host ~* ^(......)\.netingcn\.com) {
	    set $sub_name $1;
	    rewrite ^/ /user.php?uid=$sub_name last;
	}
	...

这里假设所有的6个字符的子域名都是用户自定义域名,然后对其进行rewrite。另外可以通过set指令把表达式中的某些信息存放在一个变量中,而后可以使用它。

nginx 匹配操作符

2012年9月17日 没有评论

nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能。例如:防止rewrite、盗链、对静态资源设置缓存以及浏览器限制等等。由于nginx配置中有if指令,但是没有对应else指令,所以判断要分为匹配和不匹配。字符串表达式支持正则表达式,能设定大小写是否敏感。因此共有四个操作符,如下:

  • ~     区分大小写(大小写敏感)匹配成功,可用正则表达式
  • ~*   不区分大小写匹配成功,可用正则表达式
  • !~    区分大小写匹配失败,可用正则表达式
  • !~*  不区分大小写匹配失败,可用正则表达式
  • =     精确匹配普通字符串,匹配成功后停止匹配其他规则
  • ^~  匹配成功后停止匹配其他规则
分类: nginx 标签:

nginx日志分割

2012年7月10日 3 条评论

nginx日志本身不能通过配置来进行分割,如果要进行分割,需要通过写一个简单的脚本来实现这个功能。以前我一直都是用cp命令来做的,例如:

#/bin/bash
nginxLog="/usr/local/nginx/logs/access.log"
logBakFile="/usr/local/nginx/logs/"$(date "+%F")/"bak_"$(date "+%H-%M-%S")".log"

if [ ! -d ${logBakFile%/*} ]
then
    mkdir -p ${logBakFile%/*}
fi

cp $nginxLog $logBakFile 2>&1 >/dev/null
cat /dev/null > $nginxLog

原理很简单,就是通过cp命令拷贝一份当前的日志,拷贝完后清空当前日志。当然,如果nginx的并发量很大,可能会造成日志丢失情况。

今天无意中看到另外一种分割日志的方法,主要是通过mv命令来实现,我感觉可能比我以前的实现要好一些,特此记录一下。上述脚本可以修改为:

#/bin/bash
nginxLog="/usr/local/nginx/logs/access.log"
logBakFile="/usr/local/nginx/logs/"$(date "+%F")/"bak_"$(date "+%H-%M-%S")".log"

if [ ! -d ${logBakFile%/*} ]
then
    mkdir -p ${logBakFile%/*}
fi

mv $nginxLog $logBakFile 2>&1 >/dev/null
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

先用mv命令把日志备份,然后使用kill -USR1 让nginx 重新打开日志文件。虽然这样也可能丢失日志,但mv命令执行肯定要cp快,所以相当来说要安全一些。

可以把上述脚本加入到crontab中,这样就可以实现按天、按小时等一些时间规则来进行日志分割

分类: Linux, nginx 标签: ,

window版nginx的常用操作命令

2012年6月8日 没有评论

nginx不止有linux版本,同时也提供window的版本,对应window版本,下载一个压缩包,解压后即可。运行nginx只需要双击nginx.exe就行了。在命令提示行下执行 nginx -h,会看到如下一些帮助信息:

nginx version: nginx/1.2.1
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: NONE)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file

其中使用最多的可能是参数”-t” 和“-s”, 当修改配置文件后可以使用”-t”来检查配置文件是否有错误。“-s”可以实现nginx的退出、重启等操作。

nginx -s quit	安全退出
nginx -s stop	强制退出
nginx -s reload	修改配置文件后,重启nginx使配置文件生效
分类: nginx 标签:

无觅相关文章插件,快速提升流量