http://www.lishiming.net/data/attachment/forum/month_1211/epel-release-6-7.noarch.rpm
然后再
yum install -y libmcrypt-devel
如果有依赖实在解决不了,只能下载个源码包了。下载地址:
http://www.lishiming.net/data/attachment/forum/libmcrypt.tar.bz2
[添加mysqli.so]
安装完php后,它会提供一个phpize工具帮助用户继续添加php扩展。需要注意的是,你事先要进入该扩展的目录,一般这些扩展在解压缩后的php-x.x.x目录里面。
$ cd /root/lamp/php-5.2.3/ext/mysqli进入到mysqli的目录。
再用phpize生成configure文件:
$ /usr/local/php/bin/phpize
提示已经生成configure文件Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
确定php-config与mysql_config的位置
$ ./configure --with-php-config=/usr/local/php/bin/php-config
--with-mysqli=/usr/bin/mysql_config
$ make
$ make test
$ make install
Installing shared extensions: /usr/local/php/lib/php/extensions/debug-non-zts-20060613/
然后在/etc/php.ini加上一句:extension=/usr/local/php/lib/php/extensions/debug-non-zts-20060613/mysqli.so
注意:由于新编译的mysqli与php mysqlnd api no.不符,不能直接调用/usr/lib/php/modules里面的mysqli.so。而是需要我们指定。重新启动apache/php-fpm/nginx即可看到已经加载mysqli成功。
当然你也可以将编译好的so文件直接移动到/usr/lib/php/modules目录。对于已经存在的库,应该停止nginx/apache/php并删除原模块文件,再编译。如重新编译gd.so
1、先进入php源文件库目录
$cd /var/download/php-5.4.29/ext/gd
2、执行产生模块编译文件(通过phpize工具)$ /usr/local/php/bin/phpize
3、编译模块$./configure --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
--with-jpeg-dir=/usr/lib/libpng12 --with-jpeg-dir=/usr/lib/libjpeg
--with-xpm-dir=/usr/lib/libXpm --with-freetype-dir=/usr/lib/libfreetype
--enable-gd-native-ttf --with-t1lib
对于libpng12、libXpm这些系统库找不到的话可以先通过$yum -y install libpng12 libXpm
安装,并记下它们的位置(一般都在/usr/lib下面)4、检查并编译
$make test && make && make install
5、将生成的so移动到/usr/lib/php/modules下面$mv /usr/local/php/lib/php/extensions/debug-non-zts-20060619/gd.so /usr/lib/php/modules
是否覆盖,选y[httpd:Syntax error on line xx ... cannot load ... .so into server ... permission denied]
在加载httpd.conf时提示so插件不能加入服务,保护拒绝。这是因为这些编译的so文件保留原来的安全策略或继承了安装目录的安全性策略,被SELinux拒绝了。这里分二种情况,如果原来的文件没有安全性脉络则可以通过restorecon撤消缺省的安全性脉络。
restorecon -Rv -n /usr/apache/modules/mod_rewrite.so第二种情况是原来的源文件有其它的安全性脉络,而没有继承原来的缺省的安全性,则需要通过chcon来更改:
chcon -Rtf httpd_sys_content_t xxx.so
或chcon -Rtf texrel_shlib_t mod_rewrite.so
具体的content参数输入(如果没有semanage则需yum install)# semanage fcontext -l |grep httpd_sys
查看。这时你可以在/usr/apache/modules里查看各个so库文件的文件属性了ls -laZ不出意外,各个文件的安全性都没问题。但还是别高兴得太早。
# service httpd start
cannot restore segment prot after reloc: Permission denied
某些文件还是拒绝了!我等菜菜鸟还是别折腾了。直接/usr/sbin/setenforce 0
降低SELinux的安全性检查算了。[不能访问apache?]
更改httpd的SELinux设置
setsebool -P httpd_enable_homedirs 1
setsebool -P httpd_read_user_content 1
setsebool -P httpd_use_nfs 1
查看更改内容getsebool -a | grep httpd
更改DocumentRoot目录权限,注意,因为对于files方式工作的session,它还需要写权限chomd -Rcf o+wr /www/html更改php-cgi权限
chomd -Rcf u+x /usr/local/php/bin/php-cgi
检查mod_fcgid的模块名是否正确LoadModule fcgid_module modules/mod_fcgid.so
// ...other code
<IfModule fcgid_module>
FcgidInitialEnv PHPRC /etc/php.ini
...
</IfModule>
主目录/www/html是否添加了ExecCGI选项<Directory /www/html>
AddHandler fcgid-script .fcgi .php
AddType application/x-httpd-php .php
Options Indexes FollowSymLinks Includes ExecCGI
...
</Directory>
在调试阶段,最好添加一个mod_status.so模块,以对照配置LoadModule status_module modules/mod_status.so
...
<IfModule status_module>
ExtendedStatus On
</IfModule>
<Location /server-info>
SetHandler server-info
//...other code
Allow from 127.0.0.1
</Location>
然后在浏览器中输入127.0.0.1/server-info查看apache配置[httpd dead but subsys locked]
今天,除了看看快播、装了2小时而又出错的实况2013外。几乎花了整整一天的时间解决centos 6.5上的各种各样的apache问题。可以httpd dead but subsys locked的问题只出现在通过yum install的apache。
好了,安装完apache后,启动查看
# sudo service httpd start
Starting httpd: [ OK ]
# service httpd status
httpd dead but subsys locked
解决方法的核心是pid问题。打开httpd.conf,没有发现httpd.pid,但它又确实存在,在哪?在我的安装目录
/var/local/apache/run/httpd.pid
这个pid与subsys/httpd运行的是对不上的。更改之,httpd.conf添加PidFile /var/run/httpd.pid
然后,找到/etc/sysconfig/httpd,改写(去掉注释)PIDFILE=/var/run/httpd.pid
关闭原来的httpd进程# killall -9 httpd
删掉httpd进程中的锁定#rm -rf /var/lock/subsys/httpd
可以重启httpd了# service httpd restart
Stopping httpd: [ FAILED ]
Starting httpd: [ OK ]
service httpd status
httpd (pid 3037) is running...
[file exists:mod_fcgid:can't create shared memory]问题
这个问题困扰了我好几天。答案却很简单。
正题。mod_fcgid是apache一个很重要的模块,它可以解决apache处理web请求的方式。之前apache处理php请求时,是每个请求启动一个进程,脚本处理完毕结束进程,这种方式效率低、当大访问量时资源占用多。后来有人发明了一种fastcgi的方式,通过一个长贮的进程池来集中分配request,request之间共享内存,而进程独立,它与server独立,起到一个分发request给server的作用。它具有资源占用低,效率高的优点,常为现代web server所用。mod_fcgid现为apache团队在维护,稳定性有保障。
说说mod_fcgid中FcgidProcessTableFile与FcgidIPCDir参数的说明
FcgidProcessTableFilemod_fcgid在unix中用来与httpd进程的共享内存,以维持运行状态。此指令指定共享内存文件的名称
Description: shared memory file path
Syntax: FcgidProcessTableFile pathname
Default: FcgidProcessTableFile logs/fcgid_shm
Context: server config
Status: External
Module: mod_fcgid
FcgidIPCDir模块使用的AF_UNIX socket或命名的管道,取决于平台,用以与FASTCGI程序通信。指令指定socket或命名管道需要在哪个路径中建立。
Description: directory for AF_UNIX sockets (Unix) or pipes (Windows)
Syntax: FcgidIPCDir pathname
Default: FcgidIPCDir logs/fcgidsock
Context: server config
Status: External
Module: mod_fcgid
这两个参数存在一个问题,就是路径一定要建立在/var/run下面。比如
FcgidProcessTableFile /var/fun/httpd/fcgidsock不然mod_fcgid会自己到/var/run路径查找,如果path不存在则不会启动fcgid模块,当然,它不会提醒你目录有问题,而是出现...[emeg](17)file exists:mod_fcgid:can't create shared memory xxx bytes的错误。这点apache官方中的mod_fcgid指南并没有说明。
FcgidIPCDir /var/run/httpd/fcgid_shm
这个问题我找了很久才清楚。希望有此错误的朋友,上面的提醒可以帮到你。
[403 forbidden]禁止访问错误
*unix Apache 我可不提供随便的服务 :)
不能正常访问原因有很多,需要提醒的一句是,有可能你设置了index文件,但在DocumentRoot下又没有放置,比如缺少index.php,这时需要注释掉
<Directory /var/www/html>
#Options Indexes
# Or
Options -Indexes
</Directory>
[mod_fcgid error reading data from fastcgi server]错误
这是一个很简单的错误,那就是FcgidWrapper的对象没有执行权限,如果你是按照官方的方法配置的
PHP wrapper script - /usr/local/bin/php-wrapper那么/usr/local/bin/php-wrapper必须有执行权限
#!/bin/sh
# Set desired PHP_FCGI_* environment variables.
# Example:
# PHP FastCGI processes exit after 500 requests by default.
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
# Replace with the path to your FastCGI-enabled PHP executable
exec /usr/local/bin/php-cgi
chmod og+x /usr/local/bin/php-wrapper
还有最好禁止php运行子进程,设置PHP_FCGI_CHILDREN=0,最最需要注意的是,不要开启APC,因为它们的共享内存会冲突。APC发展至今已经穷途末路了,不需要使用。