全是网上资料,放一起,方便查找。
描述下目前遇到的问题:
win2003 sp2 系统。装上IIS6后,html正常访问,但是aspx页就是访问不了,日志文件也不做任何问题的记录。
万般无奈,能找到的办法都上了。目前只剩最后2个解决办法:
1.下载一个SP2系统iso,提取里面的 i386再装一次IIS,如果不行只能采取第二种方法了
2.换个盘重装系统。然后继续。。。
--------------------------------------
已经解决。采用的上面第一次方法,下载wIN2003 SP2系统用这个i386重装IIS6,然后运行aspnet_regiis -i -enable ,成功!(17:43:26)
以下为网络收集的部分解决方法:
1.WEB 服务扩展里的ASP和ASP.NET是否开启
2.运行下 aspnet_regiis -i
3.重装IIS
4.重装系统
5.权限问题:
设置网站根目录权限,
设置IIS DCOM权限,
设置网站属性中的 主目录选项卡中访问权限,目录安全性中身份验证方法。
权限的用户,一般是2个:IUSR_机器名 和 NETWORK SERVICE (xp中为aspnet)
6.由于我的系统是windows2003+sp2,所以我猜想可能是由于sp2造成IIS解释asp.net 2.0时出错(因为,Html网页能打开),于是,我就在一台没有打sp2补丁的windows2003系统上进行同样的IIS设置与网站配置,结果发现aspx网页能够正常运行。这让我回想起当时在windows2003+sp2的平台下安装IIS时出现找不到iisadmin.mfl文件,后来是通过利用c:\windows\servicePackfiles\i386中的iisadmin.mfl将IIS安装完成了。是不是就是由于这个原因引起的呢?因为对于windows2003+sp2的平台利用原有的windows2003是无法安装好IIS的(找不到iiaadmin.mfl文件),于是我将windows2003系统的sp2补丁解压生成一个i386目录,然后再安装IIS,当安装IIS出现找不到iisadmin.mfl文件时,利用sp2解压后的i386目录中的iisadmin.mfl文件安装完成IIS,之后再重新利用aspnet_regiis.exe -i注册,在web服务扩展中允许asp.net 2.0,并按相同的方式进行网站的配置,结果aspx可以正常浏览了。至此,从而判断开始是由于iisadmin.mfl文件的引用不正确才造成windows2003+sp2平台的IIS中不能正常浏览aspx网页。
我们先来看下nginx.conf
server
{
listen 80;
server_name www.a.com;
index index.html index.htm index.php;
root /data/htdocs/www.a.com/;
#limit_conn crawler 20;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
}
server
{
listen 80;
server_name www.b.com;
index index.html index.htm index.php;
root /data/htdocs/www.b.com/;
#limit_conn crawler 20;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
}
nginx在80端口接受到访问请求后,会把请求转发给9000端口的php-cgi进行处理
而如果修改php.ini中open_basedir= ../../../../../ ,针对两个不同的网站,www.a.com , www.b.com都会把请求发送给9000处理,而如果先访问www.a.com那么../../../../../就会变成A网站的根目录地址,然后这时候如果你访问www.b.com,那么open_basedir仍然是A网站的根目录,但是对于B来说,又是不允许访问的,所以就造成了,第二个站点打开以后会出现no input files,那么有什么解决办法呢?
我们可以把不同的虚拟主机发送到不同的php-cgi端口进行处理,当然响应的php-fpm配置文件中的open_basedir也不同。。我们来看看怎么配置。。
首先,nginx.conf配置如下
server
{
listen 80;
server_name www.a.com;
index index.html index.htm index.php;
root /data/htdocs/www.a.com/;
#limit_conn crawler 20;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
}
server
{
listen 80;
server_name www.b.com;
index index.html index.htm index.php;
root /data/htdocs/www.b.com/;
#limit_conn crawler 20;
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
include fcgi.conf;
}
}
注意:www.a.com 的请求发送到9000端口 , www.b.com的请求发送到9001端口,依次类推
nginx配置修改了,相对的,php-fpm.conf也要修改
每个站点建一个conf
A站点
#cp /usr/local/webserver/php/etc/php-fpm.conf /usr/local/webserver/php/etc/www.a.com.conf
#vi /usr/local/webserver/php/etc/www.a.com.conf
找到php_defines,添加
<value name="open_basedir">/data/htdocs/www.a.com:/tmp:/var/tmp</value>
B站点
#cp /usr/local/webserver/php/etc/php-fpm.conf /usr/local/webserver/php/etc/www.b.com.conf
#vi /usr/local/webserver/php/etc/www.b.com.conf
找到php_defines,添加
<value name="open_basedir">/data/htdocs/www.b.com:/tmp:/var/tmp</value>
找到listen_address,修改为
<value name="listen_address">127.0.0.1:9001</value> 注意这里的端口号
最后要修改php-fpm启动脚本
#vi /usr/local/webserver/php/sbin/php-fpm
注释掉原来的 #$php_fpm_BIN --fpm $php_opts,添加
$php_fpm_BIN --fpm --fpm-config /usr/local/webserver/php/etc/www.a.com.conf
$php_fpm_BIN --fpm --fpm-config /usr/local/webserver/php/etc/www.b.com.conf
启动服务
#/usr/local/webserver/php/sbin/php-fpm restart
查看端口
#netstat -tln
开了9000 9001分别处理两个站点请求
两个php-cgi主进程加载不同的conf文件,这样就完美解决了虚拟主机webshell能跨目录的问题
当然,启动之前记得conf里面的max_children,开启php-cgi子进程数,相应要减少一些,以免造成内存不足
文章来源:DoDo's Blog
原文地址:http://www.sectop.com/post/35.html
location ~ ^/upload/.*\.(php|php5)$
{
deny all;
}
其中upload换为你要设置的目录名字
这条规则的含义是匹配请求连接中开头是/upload/,中间匹配任意字符,结尾匹配.php或者.php5的页面,最后利用deny all禁止访问,这样就防止了上传目录的脚本执行权限