适用于:
Oracle HTTP Server –版本: 10.1.2.0.2 到 10.1.3.5.0 – 发行版本: AS10gR2 到 AS10gR3
Oracle Solaris on SPARC (64-bit)
Oracle Solaris on x86-64 (64-bit)
Oracle Solaris on SPARC (32-bit)
Sun Solaris SPARC (64-bit)
Sun Solaris x86-64 (64-bit)
Sun Solaris SPARC (32-bit)
Solaris Operating System (SPARC) (64-bit)
Solaris Operating System (x86-64)
HTTP Server
问题描述:
当用httpd.conf文件指定的文档权限尝试访问静态网页时Apache/Apache/logs/error_log文件中有错误信息:
[error] [client 138.77.23.156] [ecid: 1090701619555, 1] (24)打开的文件特多:文件权限拒绝服务使用/usr/local/oracle/product/oas/10.1.2.0.2/Apache/Apache/htdocs/index.html.en
[error] [client 138.77.23.156] [ecid: 72058839358375268,2] (24) 打开的文件特多:文件权限拒绝服务使用/usr/local/oracle/product/oas/10.1.2.0.2/Apache/Apache/htdocs/index. html.en
浏览器上会出现http403禁止访问
原因:
Solaris 操作系统只允许打开256个标准输入输出流, 而文件描述符却小于256.因此应用程序在处理大量fopen()请求时很快就会用完这些文件描述符。对32位机的应用程序来说,扩大这个限制还是不可行的,因为这样会导致程序出现兼容性问题(在SunOS 4.x以后兼容性已经不再是问题了)。文件句柄dup被用来处理大于256的文件描述符,以此来为fopen释放资源. 但是程序的标准输入输出流最大值仍然被限制为256.如果用尽了这些文件描述符将导致前面提到的错误。
解决方案
1) 确保操作系统配置文件/etc/system设定的资源限制允许如下:
* 设置硬限制值(rlim_fd_max) 和软限制值 (rlim_fd_cur)以此允许进程并发处理多于1024的文件描述符
set rlim_fd_max=2048
set rlim_fd_cur=1536
* rlim_fd_cur 是"ulimit" 的值 , 可以使用命令 "ulimit -n" 查看其值
2) 通过命令 "opmnctl" 和"dcmctl" 来检查文件最多打开数目
以下命令为"nofiles(descriptors)"设定了一个足够大的值:
% ulimit -a
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) unlimited
coredump(blocks) unlimited
nofiles(descriptors) 1536
vmemory(kbytes) unlimited
3) 重新测试一遍,检查错误是否还存在.
4)如果仍然有错误,那么请做如下修改:
a) 使目录中包含默认的 "opmnctl" 脚本并且备份:
% cd $ORACLE_HOME/opmn/bin/opmnctl
% cp opmnctl opmnctl.orig
b) 使用适当的编辑器比如vi 或emacs编辑默认的"opmnctl" 脚本,将ulimit -n 1024
替换为
MAX_FILE_DES=`ulimit -n`
if [ "${MAX_FILE_DES}" -lt "1024" ]
then
ulimit -n 1024
fi
c) 保存到"opmnctl" 文件.
5) 如果以上修改后仍然出现错误那么请加上以下几行到apachectl 脚本.
ulimit -n 3000
LD_PRELOAD_32=/usr/lib/extendedFILE.so.1 ; export LD_PRELOAD_32
以上apachectl 脚本的修改是 Solaris 10操作系统的一个重要应用.