nginx配置与常见错误解决方法

作者: bjash
发布时间:2015-07-13 10:55:06

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上去

标签: Nginx
来源:http://blog.csdn.net/bjash/article/details/8596554

推荐: