今天在开发时突然apache无法启动了。表现为,输入 httpd -X 后片刻自动退出, 同时在error_log中有如下内容:
[Fri Aug 15 10:54:31 2008] [emerg] (28)No space left on device: Couldn't create accept lock
df一下发现不是磁盘空间的问题。Google了一下就找到了解决方案,原来是系统的信号量(?)不够用了。 用以下命令可以查看所有的信号量:
# ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x00000000 19234816 nobody 600 1 0x00000000 19267585 nobody 600 1 0x00000000 19300354 nobody 600 1 0x00000000 19398659 nobody 600 1 0x00000000 19431428 nobody 600 1 0x00000000 19464197 nobody 600 1 0x00000000 19562502 nobody 600 1
然后用这行命令删除所有的信号量即可:
ipcs -s | grep nobody | perl -lane 'print `ipcrm sem $F[1]`'
今天说说Apache的优化。为什么要优化?因为服务器资源不够用。 资源有很多方面,但根据木桶理论,只要有一种资源不够用, 整个服务器的性能就会受到影响(所谓瓶颈)。
服务器资源
那么服务器的资源包括哪些?对于网站来说主要是CPU、TCP连接数这两者。 CPU表现在任务数上,在Linux下使用平均负载(loadavg)来衡量。 可通过以下命令来查看(参考这篇文章):
cat /proc/loadavg
对于单CPU的服务器,loadavg高于1,表明任务队列出现了等待,CPU忙不过来了。 超过2以上就会明显感到性能降低了。
TCP连接数可通过以下命令查看:
netstat -ant | grep :80 | wc -l
如果要实时监控服务器资源,可参考OpenNMS项目。
注1:内存不算,低廉的价格使得网站服务器很少有因为内存不够而down掉的。
注2:CPU%是瞬时的CPU使用率,通常无法反映出整体负载。
这个话题似乎是老调重弹了,也有很多人给出了相应的方法。我的方法如下:
RewriteCond %{REQUEST_URI} !^/wp-includes/images/noimage.png$ [NC]
RewriteCond %{HTTP_REFERER} !^http://[0-9a-z]+\.inspiremedia\.org/.*$ [NC]
RewriteRule \.(jpg|gif|png|zip|gz|rar)$ http://tech.inspiremedia.org/wp-includes/images/noimage.png [R,L]
主要功能位于第二行,当请求的HTTP_REFERER头不输入本站所在的域时,则执行第三行的重写规则,重定向至 noimage.png。 第二行最后的[NC]表示匹配时忽略大小写。第一行用于防止死循环。
2006-12-26
接受建议,将重写规则仅适用于 wp-content/uploads 下的文件。
RewriteCond %{HTTP_REFERER} !^http://[0-9a-z]+\.inspiremedia\.org/.*$ [NC]
RewriteRule wp-content/uploads/.*\.(jpg|gif|png|zip|gz|rar)$ http://tech.inspiremedia.org/wp-includes/images/noimage.png [R,L]
本文参考了 mod_perl 的官方文档之一, 但并不是原文档的翻译。
阅读全文 »下载并安装 httpd 2.2。
$ tar xjvf httpd-2.2.3.tar.bz2 $ cd httpd-2.2.3/ $ ./configure --enable-rewrite --enable-so $ make $ sudo make install
下载并安装 mysql-3.23。
$ sudo tar xzvf mysql-3.23.58-pc-linux-i686.tar.gz -C /usr/local/mysql $ sudo groupadd mysql $ sudo useradd -d /usr/sbin -s /bin/false -g mysql mysql $ sudo chown -R mysql.mysql /usr/local/mysql $ cd /usr/local/mysql $ sudo ./scripts/mysql_install_db $ sudo cp support-files/mysql.server /etc/init.d/mysql $ /etc/init.d/mysqld start
下载并安装 php 5.1.6。
$ sudo apt-get install flex bison libxml2-dev
$ tar xjvf php-5.1.6.tar.bz2
$ cd php-5.1.6/
$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-gd
--with-gettext --with-mysql --with-zlib-dir=/usr/lib
--with-mysql=/usr/local/mysql
本文介绍了在Windows下安装Apache、PHP、mod_perl、mod_python、subversion的方法。
阅读全文 »
Windows+Apache2下安装php5的方法:
1. 解压php到某个地方
2. 修改apache的httpd.conf,添加如下几行:
LoadModule php5_module "c:/php/php5apache2.dll" AddType application/x-httpd-php .php PHPIniDir "C:/php"
3. 将php目录下的php5ts.dll复制到%PATH%环境变量指定的地方,比如C:\Windows\system32下,或者与apache.exe放到同一目录下
4. 修改php目录下的php-dist.ini为php.ini
5. 编辑php.ini,修改extension_dir为“php所在的路径” + \ext
Apache的默认配置是会显示服务器信息的,比如访问一个服务器上不存在的页面,Apache会返回“Not Found”的错误,这个错误页面的最下方写着“Apache/2.0.55...”等等关于服务器的信息。这无疑为入侵者提供了可用的信息。
使用下面的配置可以使其仅显示Apache的字样:
ServerTokens Prod
而使用下面的配置可以干脆不显示服务器信息:
ServerSignature Off
发文日期:2006/4/7
在Windows环境下,由于这三个软件的编译环境不同,造成结合上的一些版本限制。使用的编译器有两种:MSVC和VC.NET。
Apache: 最新版本为 2.2.0(VC.NET),前一版本为2.0.55(MSVC)。
Python: 2.3系列的最新版本为2.3.5(MSVC);2.4系列的最新版本为2.4.2(VC.NET)。
subversion:最新版本为1.3.1(MSVC)。由于编译环境不同,该版本所附带的 mod_dav_svn.so 不支持Apache 2.2.0,仅支持 2.0.55;subversion的python binding也是不支持Python 2.4系列,仅支持Python 2.3系列。
因此,如果你仅仅是要绑定 Apache 和 Python,那么 Apache 2.0.x + Python 2.3.x 的组合或者是 Apache 2.2.x + Python 2.4.x 的组合都可以;但是如果还要绑定subversion,那么就只能选择 Apache 2.0.x + Python 2.3.x + subversion 1.3.1了。
估计subversion在近期内会推出使用 VC.NET 编译的版本。
本文将介绍Windows下subversion作为Apache module的安装方法。
阅读全文 »
