centos安装nginx/apache/mysql/php备忘

在centos6.x 上编译安装php时,如果指定编译参数  --wity-mcrypt  会需要安装 libmcrypt-devel这个包才可以。但是当使用yum install  libmcrypt-devel 的时候,会提示无这个包。这是因为centos6.x 默认的yum源不在包含这个资源。需要第三方资源。解决办法为:
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与我们现在要添加的api号是不同的,但不妨碍我们使用。
确定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

擦,httpd竟然不是running。于是各种检查系统与httpd.conf配置,不行,google之,各种牛头不对马嘴的回答。最终,在 这里打到了答案。
解决方法的核心是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 ]

再次检查httpd状态

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参数的说明
FcgidProcessTableFile

Description: shared memory file path
Syntax: FcgidProcessTableFile pathname
Default: FcgidProcessTableFile logs/fcgid_shm
Context: server config
Status: External
Module: mod_fcgid
mod_fcgid在unix中用来与httpd进程的共享内存,以维持运行状态。此指令指定共享内存文件的名称
FcgidIPCDir

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
模块使用的AF_UNIX socket或命名的管道,取决于平台,用以与FASTCGI程序通信。指令指定socket或命名管道需要在哪个路径中建立。
这两个参数存在一个问题,就是路径一定要建立在/var/run下面。比如
FcgidProcessTableFile /var/fun/httpd/fcgidsock
FcgidIPCDir /var/run/httpd/fcgid_shm
不然mod_fcgid会自己到/var/run路径查找,如果path不存在则不会启动fcgid模块,当然,它不会提醒你目录有问题,而是出现...[emeg](17)file exists:mod_fcgid:can't create shared memory xxx bytes的错误。这点apache官方中的mod_fcgid指南并没有说明。
这个问题我找了很久才清楚。希望有此错误的朋友,上面的提醒可以帮到你。

[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

#!/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
那么/usr/local/bin/php-wrapper必须有执行权限

chmod og+x /usr/local/bin/php-wrapper

还有最好禁止php运行子进程,设置PHP_FCGI_CHILDREN=0,最最需要注意的是,不要开启APC,因为它们的共享内存会冲突。APC发展至今已经穷途末路了,不需要使用。

你可能感兴趣的:(apache)