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.twubdg.tw/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 標簽:

無覓相關文章插件,快速提升流量

30选5怎么中奖