Apache运行异常问题

1、 在启动apache时,出现如下警告:

PHP Warning:  PHP Startup:  in Unknown on line 0

没有其他信息了。

虽然暂时没有发现有什么影响,但是还是觉得不爽,要处理掉,先怀疑是扩展程序无法加载,一个个注释打开、启动,终于找到是加载php_curl.dll的问题。

解决办法是:

把php根目录下的libeay32.dll、ssleay32.dll copy to C:\WINDOWS\system32; (对于加载到IIS Isap情况?)

重新启动apache,没有警告了。



2、如果安装的是包含ssl的版本,需要加载

LoadModule authz_core_module modules/mod_authz_core.so

否则访问就会出现

如下错误日记

 [mpm_winnt:notice] [pid 11332:tid 340] AH00354: Child: Starting 64 worker threads.

3.1、网络名不再可用错误解决方法

          在httpd.conf里找到#EnableMMAP Off(禁用内存映射)

          #EnableSendfile Off修改成:EnableMMAP OffEnableSendfile OffAcceptFilter http noneAcceptFilter https none

  1. 2

    “Win32DisableAcceptEx”指令(For 2.2,2.4无效):

    AcceptEx()是微软的WinSock2 API ,通过使用BSD的accept() API 提供性能的改善。很多Windows软件会干扰AcceptEx()操作。

    当遇到像下面的错误:[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.  

    就需要使用这一个指令禁止使用AcceptEx() 。

    关闭AcceptEx() 的同时也随着关闭了EnableMMAP和 EnableSendfile.

  2. 3

    Linux服务器上启用IPv6的时候,使用sendfile会触发网卡上的TCP校验和卸载的bug。当Linux运行在Itanium处理器上时,sendfile将无法处理2GB以上的文件。对于通过网络挂载NFS文件系统的DocumentRoot,内核将无法通过缓冲区服务到网络文件。当出现以上情况的时候,应该禁用sendfile:EnableSendfile Off针对NFS或SMB,这个指令可以被针对目录的设置覆盖:EnableSendfile Off

    还是关闭这两个指令比较好一些。

    END

    注意事项

  • 故障[warn] (OS 64)指定的网络名不再可用的解决办法主要是关闭AcceptEx对于另外两个指令可选则关闭。


3.2、Windows2003下换了Apache 2.2.8之后,发现访问网站特别慢且时断时续

在error日志中发现以下记录:

[Sat Dec 24 17:21:28 2008] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.


----  Pass Test OK, Follow other idea is pool-----

EnableMMAP off
EnableSendfile off


解决办法:
在httpd.conf文件中启用如下扩展
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf

然后在httpd-mpm.conf中添加 Win32DisableAcceptEx 标记,如下:
# WinNT MPM
# ThreadsPerChild: constant number of worker threads in the server process
# MaxRequestsPerChild: maximum   number of requests a server process serves

Win32DisableAcceptEx  (For 2.2,2.4无效)
ThreadsPerChild       150
MaxRequestsPerChild     0

重启Apache



3.3、Apache日志中:[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

在apache配置文件中添加如下语句:
?
<IfModule mpm_winnt.c>
ThreadsPerChild 1000
MaxRequestsPerChild   10000
Win32DisableAcceptEx  (For 2.2,2.4无效)
</IfModule>
停止Apache,再启动。


3.4、参数注释

一般来说,WinNT系统下使用IIS,而Apache在Linux下应用的比较多,但是依然有很多人在WinNT系统下使用Apache而非IIS,可能是基于对Windows系统的熟悉吧。今天就来说一下在Windows系统下如果优化Apache的性能。

mpm_winnt.c 是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。也就是说 mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。


mpm_winnt主要通过ThreadsPerChild和MaxRequestsPerChild两个参数来优化Apache,下面详细来说明一下。

ThreadsPerChild


这个参数用于设置每个进程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为mpm_winnt不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡一个合理的数值。

mpm_winnt上的默认值是64, 最大值是1920. 这里建议设置为100-500之间,服务器性能高的话值大一些,反之值小一些。

MaxRequestsPerChild


该参数表示每个子进程能够处理的最大请求数, 即同时间内子进程数目.设置为零表示不限制, mpm_winnt上的默认值就是0.

官方参考手册中不建议设置为0, 主要基于两点考虑: (1) 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存; (2) 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

因此这个参数的值更大程度上取决于服务器的内存,如果内存比较大的话可以设置为0或很大的数字,否则设置一个小的数值。需要说明的是,如果这个值设置的太小的话会造成Apache频繁重启,在日志文件中会看到如下的文字:

    Process exiting because it reached MaxRequestsPerChild. Signaling the parent

这样一来降低了Apache的总体性能。
另外,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开它:

# 首先需要加载mod_status模块
LoadModule status_module modules/mod_status.so

# 然后设置访问的地址

   SetHandler server-status
   Order deny,allow
   Deny from all
    # 如果限制某个IP访问则设置为 Allow from 192.168.1.1
    Allow from all 综合来说,因为Windows NT下Apache只能启动父子两个进程,因此只能通过增大单个进程的线程数以及单个进程能够处理的最大请求数来进行优化。其他优化的参数同Linux系统下是一样的,大家可以加以参考。下面针对上述两个参数给出一个建议的设置:

ThreadsPerChild 250
MaxRequestsPerChild 5000


4、在Error.log (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

解决方法:

Apache 关闭 AcceptEx() ,这个在Windows平台下适用

方法是在 httpd.conf 内加入 Win32DisableAcceptEx 。

关闭AcceptEx() 的同时也关闭EnableMMAP和 EnableSendfile

具体的操作方法就是:

在httpd.conf里找到

#EnableMMAP Off
#EnableSendfile Off

修改成

<IfModule mpm_winnt.c>

Win32DisableAcceptEx (For 2.2,2.4无效)
EnableMMAP Off
EnableSendfile Off
ThreadsPerChild 1700
MaxRequestsPerChild 0
</IfModule>

然后重新启动动 Apache,“指定的网络名不再可用”再也不出现了


-------------------------------------------

上面那样关闭AcceptEx,也会出现类似问题,Apache还是不能正常运作,error.log 出项了大量的:Sat Dec 24 17:21:28 2006] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.。发现了如下的一种解决办法试了可以,而且在多台服务器上试过,只要出现了AcceptEx 的问题,就能解决,

具体设置为:

1、网上邻居-;本地连接-;属性-;internet协议(TCP/IP)-;属性-;高级-;wins标签-;去掉启用LMhosts查询前的勾. (无效)

2、控制面版-;windows防火墙-;高级标签-;本地连接设置-;服务的标签里勾选安全Web服务器(HTTPS)。 

3、然后退出Apache,再打开启动就可以了 ,一般要先停止,在开启即可

-------------------------------------------

如果 还不管用,
试下重置winsock
命令行中执行:  

netsh winsock reset


4、 AH00127: Cannot map GET /uploads/info/\xd5\xd5\xc6\xac 073.jpg HTTP/1.1 to file

某些带有中文路径的图片

1.在客户端访问时出现403错误

2.服务器报Invalid argument: Cannot map GET错误

通过开启indexes,可以正常访问到图片文件。反现encode后结果不同

这是由于urlencode  不同的编码转换时产生的结果也不同


apache 默认采用utf8

但是程序在编写页面过程中

urlencode(iconv("utf-8","gbk"....))

转成了gbk,需把它再转换回utf-8

猜你喜欢

转载自blog.csdn.net/weixin_38893715/article/details/72844329
今日推荐