nginx安装在没有其他需求或者问题发现以前是很简单的,configure && make && make install,下面是配置和使用
首先php-fpm是可以启动的,启动成功后,应该可以使用命令netstat -an |grep 9000看到端口监听,启动时如果提示你缺少一个配置文件,这个配置文件php的etc下有默认的文件,重命名或者拷贝即可。
接下来我就像启动nginx呀,在此多说一句,由于/usr/local/**/sbin这些自定义的安装目录没有添加到path,所以启动的时候总是得带路径,这个可以在 ~/.bash_profile的PATH参数中引入这些目录,大家应该都知道的了。
PATH=$PATH:$HOME/bin:/usr/local/php5.6/sbin:/usr/local/nginx/sbin
默认的配置文件nginx.conf是可以启动的,但估计是不能直接访问的,起码针对php来说。这个配置我也觉得比较麻烦,我也是一步一步坎坷的走的。
首先是得匹配php-fpm,这一段默认是注释掉的,先打开注释
location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }
然后网站肯定有一个目录,参考别人的配置,在server下添加一个root,调试肯定需要看日志的,也添上,这个目录需要你提前建好。
server { listen 80; server_name localhost; #charset koi8-r; root /var/local/www/; index index.php; access_log /var/local/log/host.access.log; error_log /var/local/log/host.error.log;
重新启动nginx,命令 nginx -s stop && nginx,不建议使用nginx -s reload。
此时,访问localhost,你可能看到了网页,但是不是你自己的phpinfo信息,而是两个超链接 “直播,点播”,这是因为下面的location内容:
location / { root html; index index.html index.htm; }
此时,网站目录被指定到了nginx安装目录的html下,默认访问的就是index.html,你可以到/usr/local/nginx/html下面去看这个文件。修改方法就是去掉这个root,或者把上层的root移到这个地方替换,我也不知道哪种方法好。
在我们一个项目中,location是这么配置的,好复杂:
location / { if (!-e $request_filename) { rewrite ^/v1.1/Public/(.*)$ /v2.x/Public/index.php/$1 last; rewrite ^/(.*)/$ /index.php/$1/index.html last; rewrite ^/(.*)$ /index.php/$1 last; break; } }
我暂时使用简单的location调试,此时访问默认的80端口提示的是 :“403 Forbidden”几个大字,明显是权限的问题了。此时也可以看日志文件了,日志的提示是这样的
[error] 13981#0: *1 directory index of "/var/local/www/" is forbidden, client: 192.168.80.28, server: localhost, request: "GET / HTTP/1.1", host: "192.168.80.201"
这个目录没有访问权限,我不想全部用root用户来操作业务网站,所以我修改了nginx和php-fpm的配置文件,让启动用户和组都是我的个人用户zht
nginx的用户设置在nginx.conf最开始的地方
#user nobody; user zht;
php-fpm的在php安装目录的etc下, php-fpm.conf,查找user即可找到
; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. user = zht group = zht
修改完成后,重启,用ps -ef可以查看nginx和php-fpm的操作用户:
zht 14476 13656 0 13:26 pts/4 00:00:00 grep --color=auto ngixn [zht@localhost conf]$ ps -ef |grep nginx root 13980 1 0 13:23 ? 00:00:00 nginx: master process nginx zht 13981 13980 0 13:23 ? 00:00:00 nginx: worker process zht 14478 13656 0 13:26 pts/4 00:00:00 grep --color=auto nginx [zht@localhost conf]$ ps -ef |grep php-fpm root 8271 1 0 11:40 ? 00:00:00 php-fpm: master process (/usr/local/php5.6/etc/php-fpm.conf) zht 8272 8271 0 11:40 ? 00:00:00 php-fpm: pool www zht 8273 8271 0 11:40 ? 00:00:00 php-fpm: pool www zht 14480 13656 0 13:26 pts/4 00:00:00 grep --color=auto php-fpm
可以看到,他们的maser都是root,就是由root启动的,但是worker都是zht,但问题是我已经把/var/local/下的www目录赋予zht用户了,为什么还提示forbidden呢。
经过我不短的一段时间的排查,排查后又经过测试,引起上述问题的直接原因是location /下的index没有放置index.php。简单而完整的配置如下:
server { listen 80; server_name localhost; root /var/local/www/; index index.php; access_log /var/local/log/www.access.log; error_log /var/local/log/www.error.log; location / { index index.php index.html index.htm; } location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; } }
将location下的root删除,在server层下添加网站目录,index添加index.php,fastcgi_param里边的/script修改为$document_root/。
location /下的index如果不带有index.php,会提示forbidden,根本原因我暂时不明确,还希望高手告知呀,但这个地方是需要注意的。
另外你可能会遇到如下错误
*1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.80.28, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.80.201"
"Primary script unknown"一般就是fastcgi找不到文件了,基本就是那个SCRIPT_FILENAME的/script没有修改为你的网站目录,即变量$document_root。
另附上我们一个项目中的location相关配置
location / { if (!-e $request_filename) { rewrite ^/v1.1/Public/(.*)$ /v2.x/Public/index.php/$1 last; rewrite ^/(.*)/$ /index.php/$1/index.html last; rewrite ^/(.*)$ /index.php/$1 last; break; } } location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 1h; }