nginx配置與常見錯誤解決方法

nginx配置與常見錯誤解決方法

1、下載:
到官網下載nginx穩定版,解壓到e盤根目錄;
到官網下載php非安裝版,解壓到e盤根目錄。

2、配置:
打開nginx.conf,修改相關位置如下,
location / {
            root   html; #網站根目錄
            index  index.html index.htm index.php;
            autoindex on;  #當網站沒有默認文件時,打開域名可以看到文件目錄結構
        }
location ~ \.php$ {
            #root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  e:/html/$fastcgi_script_name; #php文件存放目錄,測試過相對路徑不行,需要絕對路徑
            include        fastcgi_params;
        }

配置好後打開命令提示符,切換到e:\nginx,啓動nginx命令:start nginx 。(相關介紹可到http://nginx.org/en/docs/windows.html
注意:當修改配置文件後,要nginx -s quit 然後 start nginx 纔有配置後的效果,用 nginx -s reload 沒效果。可能是windows版本的一個bug吧。

配置php.ini,設置extension_die = "ext/",把相關用到的ext擴展dll前面的分號去掉,不然不能正常啓動php-cgi.ext。
啓動php-cgi.exe;切換到e:\php,在命令提示符下輸入php-cgi.exe -b 127.0.0.1:9000。

3、測試:
寫一個打印phpinfo()的php腳本放到html目錄下面,測試php程序是否能夠運行。經過測試成功運行。

========================================================
啓動與停止
1. 啓動Nginx:
D:/nginx-1.0.4/nginx.exe -p D:/nginx-1.0.4
2. 啓動PHP-CGI
D:/php/php-cgi.exe -b 127.0.0.1:9001 -c D:/php/php.ini
爲了方便可以寫到一個批處理文件中,這裏用到了一個RunHiddenConsole,可以在這裏下載:
@echo off
REM Windows 下無效
REM set PHP_FCGI_CHILDREN=5
 
REM 每個進程處理的最大請求數,或設置爲 Windows 環境變量
set PHP_FCGI_MAX_REQUESTS=1000
echo Starting PHP FastCGI...
REM RunHiddenConsole C:/php5/php-cgi.exe -b 127.0.0.1:9000 -c C:/php5/php.ini
D:/nginx-1.0.4/RunHiddenConsole.exe D:/php/php-cgi.exe -b 127.0.0.1:9001 -c D:/php/php.ini
 
echo Starting nginx...
D:/nginx-1.0.4/RunHiddenConsole.exe D:/nginx-1.0.4/nginx.exe -p D:/nginx-1.0.4
exit
3. 停止Nginx
D:/nginx-1.0.4/nginx.exe -p D:\nginx-1.0.4 -s stop
4. 停止PHP-CGI
taskkill /F /IM php-cgi.exe > nul
同樣可以寫到一個批處理文件中:
@echo off
echo Stopping nginx...
REM taskkill /F /IM nginx.exe > nul
D:/nginx-1.0.4/nginx.exe -p D:\nginx-1.0.4 -s stop
 
echo Stopping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul
Nginx配置的路徑問題
由於在Windows下文件路徑可以用”\”, 也可以用”\\”, 也可以用”/”作爲路徑做分隔符。但”\”最容易引發問題,所以要儘量避免使用。
例如下面的配置可以正常運行
root   G:\ezdemo;
但是這樣
root G:\tweb;
就會出現問題,訪問程序時會出現500錯誤。
在logs/error.log裏面會發現這類似這樣的錯誤日誌:
2011/06/16 22:07:28 [crit] 4756#5412: *2 GetFileAttributesEx() "G:  web" failed (123: The filename, directory name, or volume label syntax is incorrect), client: 127.0.0.1, server: php.lab, request: "GET / HTTP/1.1", host: "php.lab"
2011/06/16 22:13:38 [crit] 4756#5412: *5 CreateFile() "G:   pweb/test.html" failed (123: The filename, directory name, or volume label syntax is incorrect), client: 127.0.0.1, server: php.lab, request: "GET /test.html HTTP/1.1", host: "php.lab"
注意到G:後而有一個tab空格,你應該明白怎麼回事了:)
========================================================
關於nginx以服務方式運行原理和實現方法參見 http://bbs3.chinaunix.net/thread-1264548-1-1.html
另在那個帖子中還有一個完整的所用工具和腳步的zip包,照readme.txt 安裝好服務是沒有問題的

本文主要是說說 nginx-0.7.58 以服務方式運行後“nginx -s reload”常見錯誤解決方法
注意,這個 nginx-0.7.58 下載自官方http://nginx.net

1、[alert]: CreateFileMapping(1024, nginx_shared_zone) failed (5: Access is denied)
根據這個提示我分析了一下,應該是權限問題,這時我分別用服務啓動和命令啓動nginx後發現
服務啓動後 nginx 是以 system 身份運行的,而 命令啓動後 nginx 是以 administrator 身份運行的
這樣看問題應該是出在了服務的運行身份上,所以我們應該修改服務的運行身份,具體修改方法:
服務--》NGNIX--》屬性--》登陸--》登陸身份--》選擇此賬戶後賬戶填入administration,再填入密碼
修改完後重啓服務再試 nginx -s reload ,一切正常

2、[error]: OpenEvent("ngx_reload_31796") failed (2: The system cannot find the file specified)
這個應該是最常見的錯誤了,一般引起這個錯誤的主要原因是 nginx 不能處理特定pid的 nginx 進程而造成的
這個錯誤信息中 reload 還有可能是 stop reopen quit,而後面的31796則是當前 logs\nginx.pid 中的值
我碰到這個問題的時候是在我mstsc登陸vps上的win03時,下面是當時複製出的一些信息


D:\httpd\nginx>sc stop nginx
D:\httpd\nginx>sc start nginx
D:\httpd\nginx>tasklist | findstr nginx
nginx.exe                    16360 Console                    0      3,184 K
nginx.exe                    31112 Console                    0      3,512 K
D:\httpd\nginx>start nginx.exe
D:\httpd\nginx>tasklist | findstr nginx
nginx.exe                    16360 Console                    0      3,184 K
nginx.exe                    31112 Console                    0      3,512 K
nginx.exe                    32696 RDP-Tcp#3                  7      3,212 K
nginx.exe                    14988 RDP-Tcp#3                  7      3,524 K
D:\httpd\nginx>

當時我沒有發現有啥問題,以爲是程序的問題,後來我在本地虛擬機上win03上使用沒有碰到此錯誤,一樣的操作爲啥結果會不同?
我就又重新在vps上的win03上做試驗,發現了貓膩,服務啓動和遠程登陸後手動啓動的會話id不同
就拿上面抓的信息爲例子
nginx以服務方式啓動的會話id是0,而我遠程登陸後的會話id是7,所以不能操作會話id 0啓動的nginx
而我遠程登陸後自己手動 start nginx 啓動,這時nginx.exe的會話id就是我現在用的,所以我此時是能正常使用 nginx -s reload 的

綜上所述,這個錯誤是由於不能正常結束特定進程所引起的,也大多數情況是在遠程登陸後操作纔會出現,具體的解決方法未知,最關鍵的問題遠程登陸後如何切換到會話id 0上去
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章