存档

文章标签 ‘apache’

apache错误”[error] (28)No space left on device: Cannot create SSLMutex Configuration Failed”

2015年1月24日 没有评论

线上一台apache挂掉了,上去看,是被OOM了,手工起,发现起不来,error_log里写着:“[error] (28)No space left on device: Cannot create SSLMutex
Configuration Failed

网上说也许是信号量 (semaphores)被用完了。于是

ipcs -s | grep apache

一看,果然一堆,然后

ipcs -s |grep apache | awk '{print $2}'| xargs ipcrm sem

将其全部干掉,再

service httpd start

,搞定!

分类: TroubleShooting 标签: , , ,

apache2.2基于openldap认证仅允许特定组访问nagios

2012年2月21日 没有评论

前面提到过apache 2.2下怎样通过ldap认证,不过那是适合posixGroup的组,我这里用到的是groupOfNames的组,这两种组在ldap里不兼容,因此配ldap的方式也不一样,比如我现在用的是groupOfNames的组,那么我在apache2.2的配置文件里就是这么写的(关键几句):

AuthType basic
AuthBasicProvider ldap
AuthName "Nagios Access"
AuthzLDAPAuthoritative on
AuthLDAPURL ldap://192.168.0.1/ou=employees,dc=xxx,dc=com?uid?sub
require ldap-group cn=SA,cn=tech,ou=groups,dc=xxx,dc=com

这样配了之后,发现一个特别诡异的情况,SA组里的用户倒是可以登陆了,但是各人的权限貌似还不一样,有的连host都看不了,报错说没有权限,但有的又没有问题。最终仔细看了看cgi.cfg这个文件,发现缺省情况下用户是只能看自己是联系人的hosts和services的信息的,除非将cgi.cfg里的nagiosadmin全部替换成*,这样的话,只要通过认证的用户就都能看所有的信息了。

分类: tips, TroubleShooting 标签: , ,

apache里用cgi方式执行perl程序,其CGI模块会影响apache的charset

2011年9月14日 没有评论

  最近在搞rackmonkey的中文问题,本来大家都用utf8编码就啥事儿没有了的。于是就在apache里强制AddDefaultCharset UTF-8,可相当诡异的是,页面输出的时候还是直接跳到iso-8859-1去了,抓了下头,才知道原来apache直接送出一个http头,说“charset=ISO-8859-1”,害得我查半天,最早以为是http认证那块儿改了charset设置,注释掉也不行,最后才搞明白原来这个头是perl程序吐出来的,再大概一翻代码,原来perl程序使用了CGI模块儿,看了下CGI的文档,原来找个模块缺省是吐“charset=ISO-8859-1”的,这样一来,问题好解决了,在程序里调用cgi->header的地方指定charset,或者釜底抽薪,直接将其调用的CGI模块改了,将charset的缺省值改成“UTF-8”,问题即解决。

在apache里干掉Etag

2011年5月5日 没有评论

在经典的yahoo的优化前端的21条中,就明确提到一条:在web server中干掉ETag!这个ETag到底是干嘛用的呢?说白了,这个ETag头信息是用来辨别对象是否发生变化用的,一个对象,当其ETag头信息变了的话,其ETag信息肯定会变;反之亦然。看来这个东西还是有用的,但我们为什么要干掉他呢?这是因为有几点原因:

  1. 功能跟last-modified-since头信息重复
  2. 如果有几个源服务器,很有可能对象是一样的,但是这个ETag也会不一样

  总之,基于如上几种原因,我们决定在apache里干掉ETag信息。操作起来其实非常简单,只需要在apache配置文件里加一句话:

FileETag None

,再重启apache,就OK了

分类: tips 标签: , ,

在apache里配置log文件记录apache请求的头信息

2011年4月28日 没有评论

  最近频发已经上了cdn的域名的源服务器的流量飙升的问题。一看cdn的性能图,命中率极低(<10%),于是就怕是有人恶意攻击cdn的前端,使之不能有效缓存,而把几乎所有的流量都打穿cnd,而直接打回源站点。   于是就想在源服务器上记录下http请求过来的头信息,最早用tcpdump听包,发现鲜果不理想,要么包大小设小了,头信息不全;要么包大小设大了,头信息里无用的信息太多。   最后,翻了翻apache的文档,终于发现,原来apache自己就可以干这个!   最后,我在apache的配置文件里加上一句:

ForensicLog logs/forensic_log

,再重启apache,在文件logs/forensic_log里就开始记录http请求的头信息了。

分类: tips 标签: , , ,

为嘛一般网站都不让用户上传rar的文件

2011年3月5日 没有评论

在lamp的系统里
如果用户上传了各文件叫xxx.php.rar
而这个文件能够被访问的话
很大程度上这个文件会被当作php程序执行!!
原理据说是apache不认识rar的mime type
就会去找倒数第二个扩展名,也就是php的mime type作为这个文件的mime type
如果这台机器上装了apache模块儿mod_php的话
这是会被当作php程序执行的

而恰恰在大多数系统里
mime.conf中并没有关于rar的解释
所以xxx.php.rar就会被当作php程序来执行了

所以
一般网站就算允许用户上传文件,也不允许上传rar文件。

所以,要做用户上传文件类型校验,或者强行改变文件名

分类: tips, TroubleShooting 标签: , , , ,

How to use Name-Based Virtual Hosting to identify different SSL virtual hosts?

2010年2月21日 没有评论

怎样用基于域名的虚拟主机来标识不同的ssl的虚拟主机呢?
奇了怪了
前面不是已经否定了这个可能性了吗
怎么还出来Howto的问题呢?
不是我不明白,这世界变化快
原来的ssl协议是不支持的
但自打tls出来
支持个叫SNI(Server Name Indication)的feature之后
做基于域名的ssl的虚拟主机已经不再是天方夜谭
让我们还以apache+mod_ssl为例来说明问题
我们先看官方文档怎么说的

It is possible, but only if using a 2.2.12 or later web server, built with 0.9.8j or later OpenSSL. This is because it requires a feature that only the most recent revisions of the SSL specification added, called Server Name Indication (SNI).

这一段是摘自于最新的apache官方文档
写的很明白
只要apache的版本大于等于2.2.12
OpenSSL的版本大于等于0.9.8j
就可以支持
顺手再写个ssl虚机的例子:

<VirtualHost 127.0.0.1:443>
    SSLEngine On
    ServerName sni.ssl.xxx.com:443
    DocumentRoot /var/www/htdocs/
    SSLCertificateChainFile /var/www/ssl/root.pem
    SSLCertificateFile /var/www/ssl/root.crt
    TransferLog /var/www/logs/access.log
</VirtualHost>

Why can’t I use SSL with name-based/non-IP-based virtual hosts?

2010年2月12日 没有评论

以前用mod_ssl+apache配ssl服务器碰到过这个问题
别人直接用ip:443端口直接访问
就显示了缺省的https的站点
按照我们配http服务器的逻辑
肯定是想把443端口和某一个域名绑定起来用的
这样别人不知道域名就无法访问到真正的https站点内容
但是直接在apache里用

这样搞是不行的
系统总是只认第一个虚机
然后把所有https到443端口的访问都丢到里面
看了下(apache)官方的文档
里面是这样解释的:

Why can’t I use SSL with name-based/non-IP-based virtual hosts?
The reason is very technical, and a somewhat “chicken and egg” problem. The SSL protocol layer stays below the HTTP protocol layer and encapsulates HTTP. When an SSL connection (HTTPS) is established Apache/mod_ssl has to negotiate the SSL protocol parameters with the client. For this, mod_ssl has to consult the configuration of the virtual server (for instance it has to look for the cipher suite, the server certificate, etc.). But in order to go to the correct virtual server Apache has to know the Host HTTP header field. To do this, the HTTP request header has to be read. This cannot be done before the SSL handshake is finished, but the information is needed in order to complete the SSL handshake phase. Bingo!

金步国同学翻译如下:
为什么不能在基于域名的虚拟主机上使用SSL?
原因很技术化,有点类似于”鸡和蛋”的问题。SSL协议层位于HTTP协议层之下,HTTP协议是被封装在SSL协议中的,当一个SSL连接(HTTPS)请求到来的时候,Apache/mod_ssl必须和客户端协商SSL协议参数(握手),所以,mod_ssl必须查看虚拟主机的配置信息(例如允许使用哪些加密算法、服务器证书是哪个等等),然后才能完成SSL会话通道的建立;但另一方面,为了确切知道究竟应该查看哪个虚拟主机,Apache又必须知道HTTP请求头的Host字段的内容,而这在完成SSL握手之前是不可能知道的。

apache的LogLevel可以在虚机(virtual host)的设置里用

2009年6月15日 没有评论

今天用到LogLevel于VirtualHost中了
查了文档确认了一下
特此记录

nginx的超级功能模块儿:empty gif

2008年9月5日 没有评论

nginx是个http的服务器和代理服务器
我们拿过来做web server
nginx有个特别的模块儿:empty_gif
当你请求的url资源跟你设置为empty_gif的匹配上的话
服务器直接返回给你一个1×1的空白图片
看出来了吧
这里最大特点在于:
服务器根本不去查所请求资源的情况,而是直接返回一个很小的、内存中的图片
这正是我们应用所要的
我们的客户端产品经常会有些信息发回来
比如有个用户刚点播了某个节目
有个用户刚点了客户端的某个广告什么的
客户端都会通过请求特定web服务器的特定资源
而且还带有特定的参数
这边喉动态的程序通过分析web服务器的access_log
就能大致了解用户行为
以前的web服务器是用1.3.xx的apach去掉了n多无用的模块儿后做的
在pingback来的量大的时候是有些性能问题的
这下nginx的empty_gif模块儿
仿佛就是为我们的需求定做的
我们的web服务器不需要正确返回,甚至于不需要返回
他只需要接受请求,并写到log里就行
有了nginxempty_gif
web服务器都可以不读盘了

高兴之余
我又想到
其实如果假设pingback请求的都是同一个资源
比如a.gif
那么就算是用apache的话
系统存在这个a.gif,其是一个1×1的空白gif图
那么除了第一次访问以外
以后每次访问其也是从内存里读(不用读盘)
这样其实跟nginxempty_gif是一样的!

说到这里
再说说nginx用作我们的pingback的web服务器的缺点
就是nginx不能disable掉KeepAlive
我们的pingback都所以一条一条单独的
根本就不需要服务器开keepalive
但nginx不支持disable掉keepalive
55555555555555555555