CGI(Common Gateway Interface)公共网关接口,是HTTP服务器与其他程序通信的工具。CGI使外部程序与Web服务器之间交互成为可能。传统CGI接口方式的主要缺点是性能很差,CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展,因为每次服务器遇到动态程序就需要重新启动解析器来执行解析,然后返回给HTTP服务器。面对大量请求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。因此就诞生了FastCGI。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI是一个可伸缩得、高速得在HTTP服务器和动态脚本语言间通信的接口(FastCGI在linux下是socket)。主要优点是把动态语言和HTTP服务分离开来。FastCGI致力于减少Web服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。
FastCGI接口方式采用C/S架构(Nginx是客户端,PHP是服务端),可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将所得结果返回给浏览器。这种方式可以让HTTP服务器专一的处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。它的使用需要在Web服务器中安装支持组件,目前支持Apache、Nginx、IIS、Lighttpd等。
l、FastcGI是HTTP server和动态脚本语言间通信的接口或者工具
2、FastCGI优点是把动态语言和HTTP server分离开来
3、Nginx和lighttpt以及多数动态语言都支持FastCGI
4、FastCGI接口方式采用C/S结构,客户端和服务端。
5、PHP动态语言服务端可以启动多个FastCGI的守护进程(php-fpm(fcgi Process mangement))
6、http server(nginx fastcgi_pass)==>php动态语言的(php-fpm)
Web 服务器启动时载入初始化FastCGI执行环境 。FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web 服务器的连接。Nginx不支持直接对外部程序的直接调用或解析,所有的外部程序必须通过FastCGI接口来调用,FastCGI在linux下是socket,启动FastCGI进程时,可以配置以ip和UNIX 域socket两种方式启动。为了调用CGI程序,还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或者文件socket。当Nginx将CGI请求发给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的Socket 传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个工作过程
- FastCGI是HTTP服务器和动态脚本语言间通信的接口或者工具
- FastCGI的优点是把动态语言解析和HTTP服务器分离出来
- Apache、Nginx、IIS、Lighttpd以及多数动态语言都支持FastCGI
- FastCGI接口方式采用C/S架构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)。
- PHP动态语言服务端可以启动多个FastCGI的守护进程(例如:php-fpm)
- http服务器通过(例如:Nginx Fastcgi_pass)FastCGI客户端和动态语言FastCGI服务端通信(例如:php-fpm)
- 稳定性,fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑
- 安全性,fastcgi和宿主的server完全独立,fastcgi怎么down也不会把server搞垮
- 性能, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说,,逻辑处理可能只有一小部分,大量的图片等静态IO处理完全不需要逻辑程序的参与
- 扩展性,fastcgi是一个中立的技术标准,完全可以支持任何语言写的处理程序(php、java、python、C++)
- LNMP之PHP-3.27编译安装
ls -l /application/mysql/ /application/nginx/
netstat -lntup|egrep -E “80|3306”
wget 127.0.0.1
mysql -uroot -p
rpm -aq zlib-devel libxml2-devel libjpeg-turbo-devel libiconv-devel
rpm -aq freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
yum install zlib-devel libxml2-devel libjpeg-turbo-devel libiconv-devel -y
yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libtool-ltdl-devel openssl-devel -y
提示:
- 每个lib存在对应*-devel*就表示该lib安装了,相关的包会自动安装好
- 这些lib库也不是必须安装,但是目前企业环境一般都需要安装,否则PHP程序运行时可能无法显示等
- 编译安装libiconv-devel
libiconv-devel yum源中没有,需要编译安装
cd /server/tools/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure –prefix=/usr/local/libiconv
make
make install
cd
由于官方yum源中没有这个软件,所以使用第三方的epol源或者编译安装
- 快速安装
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
ls /etc/yum.repos.d/
yum install -y libmcrypt-devel
- 编译安装
cd /server/tools/
wget http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make
make install
sleep 2
cd libltdl/
./configure –enable-ltdl-install
make
make install
cd
Mhash是基于离散数学原理的不可逆向的php加密方式扩展库,在其默认情况下不开启。mhash可用于创建校验数值,消息摘要,消息验证码,以及无需原文的关键信息保密(如密码)等。Mhash为PHP提供了多种哈希算法,如MD5,SHA1,GOST等。你可以通过MHASH_hashname()来查看支持的算法有哪些。
注意问题:
- 该扩展不能提供最新的哈希算法
- 该扩展原则上运算不可逆
编译安装安装包
http://nchc.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
快速安装
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum list|grep mhash
yum install mhash mhash-devel -y
快速安装(也可以编译安装)
yum install -y mcrypt
echo “/usr/local/lib” >>/etc/ld.so.conf
echo “/application/mysql-5.5.48/lib” >>/etc/ld.so.conf
ldconfig
mkdir ext/phar/phar.phar -p
官方网站:http://cn.php.net/
cd /server/tools/
wget http://cn2.php.net/distributions/php-5.3.27.tar.gz
tar zxvf php-5.3.27.tar.gz
cd php-5.3.27
./configure \
–prefix=/application/php5.3.27 \
–with-mysql=/application/mysql \
–with-iconv-dir=/usr/local/libiconv \
–with-freetype-dir \
–with-jpeg-dir \
–with-png-dir \
–with-zlib \
–with-libxml-dir=/usr \
–enable-xml \
–disable-rpath \
–enable-safe-mode \
–enable-bcmath \
–enable-shmop \
–enable-sysvsem \
–enable-inline-optimization \
–with-curl \
–with-curlwrappers \
–enable-mbregex \
–enable-fpm \
–enable-mbstring \
–with-mcrypt \
–with-gd \
–enable-gd-native-ttf \
–with-openssl \
–with-mhash \
–enable-pcntl \
–enable-sockets \
–with-xmlrpc \
–enable-zip \
–enable-soap \
–enable-short-tags \
–enable-zend-multibyte \
–enable-static \
–with-xsl \
–with-fpm-user=nginx \
–with-fpm-group=nginx \
–enable-ftp
make
make install
ln -s /application/php5.3.27 /application/php
注意:
- 可以./configure –help查看上面个参数的用途
- –with-mysql=/application/mysql这个需要指定mysql的安装路径,安装php需要的mysql的相关内容:也可以不单独安装mysql,即mysql安装包都没有,这种情况可以使用–with-mysql=mysqlnd替代–with-mysql=/application/mysql,PHP软件中已经自带了连接mysql客户端的工具
- –with-fpm-user=nginx、–with-fpm-group=nginx指定PHP-FPM进程管理的用户和组都为nginx,此处最好与Nginx服务用户和组统一
- –enable-ftm激活PHP-FPM方式服务,即FastCGI方式运行PHP服务
- 其他需要mysql相关包场景的PHP对应编译参数
–with-mysqli=mysqlnd
–enable-mysqlnd
–with-pdo-mysql=mysqlnd
- –with-apxs2=/application/apache/bin/apxs#在Apache服务器上安装时要添加此参数
但不能添加此项–with-fpm-user=nginx –with-fpm-group=nginx –enable-fpm
错误1
checking for mcrypt support… yes
checking for libmcrypt version… >= 2.5.6
checking for mcrypt_module_open in -lmcrypt… no
checking for mcrypt_module_open in -lmcrypt… no
configure: error: Sorry, I was not able to diagnose which libmcrypt version you have installed.
解决办法:
- 卸载5.8版本,换2.5.7版本
- 编译安装
错误2
/root/tool/php-5.3.27/ext/xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close’
collect2: ld returned 1 exit status
make: *** [sapi/fpm/php-fpm] 错误 1
解决办法:make ZEND_EXTRA_LIBS=’-liconv’
错误3
Generating phar.php
/home/oldboy/tools/php-5.3.27/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
make: *** [ext/phar/phar.php] 错误 127
解决办法:
find / -name “libmysqlclient.so.18”
/home/oldboy/tools/mysql-5.5.32-linux2.6-x86_64/lib/libmysqlclient.so.18
/application/mysql-5.5.32/lib/libmysqlclient.so.18
echo “/usr/local/lib” >>/etc/ld.so.conf
echo “/application/mysql-5.5.32/lib” >>/etc/ld.so.conf
tail -2 /etc/ld.so.conf
ldconfig
错误4
Generating phar.phar
chmod: 无法访问”ext/phar/phar.phar”: 没有那个文件或目录
make: [ext/phar/phar.phar] 错误 1 (忽略)
Build complete.
Don’t forget to run ‘make test’.
解决办法:mkdir ext/phar/phar.phar -p
错误5
/home/oldboy/tools/php-5.3.27/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
make: *** [ext/phar/phar.php] 错误 127
解决办法:ln -s /application/mysql/lib/libmysqlclient.so.18 /usr/lib64
错误6
./buildconf –force
Forcing buildconf
buildconf:checking installation…
buildconf:autoconf version 2.59 (ok)
buildconf:Your version of autoconf likely contains buggy cache code.
Running vcsclean for you.
To avoid this,install autoconf-2.13.
Can’t figure out your VCS, not cleaning.
解决方法:编译安装autoconf-2.13,再将autoconf-2.13的auotconf文件至/usr/local/autoconf
错误7
configure: error: Unable to locate gmp.h
解决方法:yum install gmp-devel
错误8
Checking for pkg-config… /usr/bin/pkg-config
configure: error: Cannot find OpenSSL’s <evp.h>
解决方法:yum install openssl openssl-devel
错误9
Configure: error: Please reinstall the BZip2 distribution
解决方法:yum install bzip2 bzip2-devel
错误10
Configure: error: Cannot find MySQL header files under /usr.
Note that the MySQL client library is not bundled anymore!
解决方法:
# yum install mysql-devel (For Redhat & Fedora)
# apt-get install libmysql++-dev (For Ubuntu)
错误11
Configure: error: Please reinstall the ncurses distribution
解决方法:yum install ncurses ncurses-devel
错误12
Checking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h’ not found!
解决方法:yum install unixODBC-devel
错误13
Configure: error: Cannot find pspell
解决方法:yum install pspell-devel
错误14
Configure: error: snmp.h not found. Check your SNMP installation.
解决方法:yum install net-snmp net-snmp-devel
错误15
configure:error:Cannot find ldap.h
解决方法:yum install openldap-devel openldap
错误16
checking for libevent >=1.4.11 install prefix… configure: error: Could not find libevent >=1.4.11 in /usr/local/php
解决方法:
安装libevent-1.4.11以上版本至/usr/local
tar xzvf libevent-1.4.14-stable.tar.gz
cd libevent-1.4.14-stable
./configure –prefix=/usr/local
make&&make install
在编译./configure时添加–with-libevent-dir=/usr/local即可
错误17
/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [libphp5.la] 错误 1
解决方法:yum install libtool-ltdl-devel -y
- php-5.5.33编译安装
环境准备同php5.3.27的安装方法
编译参数
tar zxvf php-5.5.33.tar.gz
cd php-5.5.33
./configure \
–prefix=/application/php5.5.33 \
–with-mysql=/application/mysql \
–with-pdo-mysql=mysqlnd \
–with-iconv-dir=/usr/local/libiconv \
–with-freetype-dir \
–with-jpeg-dir \
–with-png-dir \
–with-zlib \
–with-libxml-dir=/usr \
–enable-xml \
–disable-rpath \
–enable-bcmath \
–enable-shmop \
–enable-sysvsem \
–enable-inline-optimization \
–with-curl \
–enable-mbregex \
–enable-fpm \
–enable-mbstring \
–with-mcrypt \
–with-gd \
–enable-gd-native-ttf \
–with-openssl \
–with-mhash \
–enable-pcntl \
–enable-sockets \
–with-xmlrpc \
–enable-soap \
–enable-short-tags \
–enable-static \
–with-xsl \
–with-fpm-user=nginx \
–with-fpm-group=nginx \
–enable-ftp
make
make install
ln -s /application/php5.5.33 /application/php
错误
checking “whether flock struct is BSD ordered”… “no”
configure: error: Don’t know how to define struct flock on this system, set –enable-opcache=no
解决办法:
vi /etc/ld.so.conf编辑这个文件,添加如下
/usr/local/lib
/application/mysql/lib
/usr/lib64
/etc/ld.so.conf,这个文件记录了编译时使用的动态链接库的路径。默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件
- 配置文件解释
[root@lnmp lib]# egrep -v “^$|;” php.ini
[PHP]
engine = On #是否启用PHP解析引擎
short_open_tag = Off #是否使用简介标志
asp_tags = Off #不允许asp类标志
precision = 14 #浮点型数据显示的有效期
output_buffering = 4096 #输出缓冲区大小(字节)。建议值为4096~8192。
zlib.output_compression = Off #是否开启zlib输出压缩
implicit_flush = Off #是否要求PHP输出层在每个输出块之后自动刷新数据
unserialize_callback_func =
serialize_precision = 17 #将浮点型和双精度型数据序列化存储时的精度(有效位数)
allow_call_time_pass_reference = On #是否强迫在函数调用时按引用传递参数(每次使用此特性都会收到一条警告)。php反对这种做法,并在将来的版本里不再支持,因为它影响到了代码的整洁。
safe_mode = Off #安全模式
safe_mode_gid = Off
safe_mode_include_dir = #在安全模式下,该组目录和其子目录下的文件被包含时,将跳过UID/GID检查。换句话说,如果此处的值为空,任何UID/GID不符合的文件都不允许被包含。 这里设置的目录必须已经存在于include_path指令中或者用完整路径来包含。
safe_mode_exec_dir = #安全模式下的可执行文件存放目录
safe_mode_allowed_env_vars = PHP_ #在安全模式下,用户仅可以更改的环境变量的前缀列表(逗号分隔)。允许用户设置某些环境变量,可能会导致潜在的安全漏洞。注意: 如果这一参数值为空,PHP将允许用户更改任意环境变量
safe_mode_protected_env_vars = LD_LIBRARY_PATH在安全模式下,用户不能更改的环境变量列表(逗号分隔)。 这些变量即使在safe_mode_allowed_env_vars指令设置为允许的情况下也会得到保护。
disable_functions = #禁用特定的函数,用逗号分隔
disable_classes = #禁用特定的类,用逗号分隔
zend.enable_gc = On
expose_php = On #在网页头部显示php信息
max_execution_time = 30 #每个脚本最大执行秒数
max_input_time = 60 #允许输入的最长时间,单位是秒,0表示不限制
memory_limit = 128M #一个脚本最大可使用的内存总量
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT #报告出所有的错误,除了原型和警告
display_errors = Off #不显示出错误信息(作为输出的一部分)
display_startup_errors = Off #不显示php启动期间的错误
log_errors = On #在日志文件里记录错误
log_errors_max_len = 1024 #错误日志最大长度
ignore_repeated_errors = Off #是否忽略重复出现的错误
ignore_repeated_source = Off #是否忽略重复出现的资源,
report_memleaks = On #是否报告内存泄漏,选择的是
track_errors = Off #是否记录错误路径
html_errors = On #是否显示html中的错误
variables_order = “EGPCS” #此指令描述了PHP注册GET, POST, Cookie, 环境和内置变量的顺序 (各自使用G, P, C, E 和 S , 一般使用 EGPCS 或 GPC). 注册使用从左往右的顺序, 新的值会覆盖旧的值.
register_globals = Off #是否打开register全局变量
register_long_arrays = On #是否注册老形式的输入数组, HTTP_GET_VARS 和相关数组; 如果你不使用他们,建议为了提高性能关闭他们.
register_argc_argv = On #此指令让PHP确认是否申明 argv&argc 变量 (这些变量会包含GET信息). ; 如果你不使用这些变量,为了提升性能应该关闭此选项.
auto_globals_jit = On #当打开此项, SERVER 和 ENV 变量将在第一次被使用时而不是脚本一开始时创建(运行时),如果这些变量在脚本中没有被使用过, 打开此项会增加一点性能。为了使此指令有效,PHP指令 register_globals, register_long_arrays, 以及 register_argc_argv 必须被关闭.
post_max_size = 8M #PHP可以接受的最大的POST数据大小
magic_quotes_gpc = On #针对GET/POST/Cookie数据打开Magic quotes.
magic_quotes_runtime = Off #针对实时产生的数据打开Magic quotes, 例如从SQL获取的数据, 从exec()返回的数据等等.
magic_quotes_sybase = Off #使用 Sybase 风格的 magic quotes (使用”来引导’替代\’).
auto_prepend_file = #在任何PHP文档之前或之后自动增加文件
auto_append_file =
default_mimetype = “text/html” #PHP内建默认为text/html
file_uploads = On #是否允许文件上传
upload_max_filesize = 2M #上传文件最大大小
max_file_uploads = 20 #单个请求最多能上传的文件数量
allow_url_fopen = On #是否允许将url以文件的形式打开
allow_url_include = Off #是否允许去include/require url
default_socket_timeout = 60 #基于scoket传输的默认时间,单位是秒
doc_root = #PHP的”根目录”。仅在非空时有效。 如果safe_mode=On,则此目录之外的文件一概被拒绝。如果编译PHP时没有指定FORCE_REDIRECT,并且在非IIS服务器上以CGI方式运行, 则必须设置此指令(参见手册中的安全部分)。替代方案是使用的cgi.force_redirect指令
user_dir = #告诉php在使用 /~username 打开脚本时到哪个目录下去找,仅在非空时有效。 也就是在用户目录之下使用PHP文件的基本目录名,例如:”public_html”
extension_dir = “./” #存放扩展库(模块)的目录,也就是PHP用来寻找动态扩展模块的目录
enable_dl = On #是否允许使用dl()函数。dl()函数仅在将PHP作为apache模块安装时才有效。禁用dl()函数主要是出于安全考虑,因为它可以绕过open_basedir指令的限制。
在安全模式下始终禁用dl()函数,而不管此处如何设置。
查看php配置默认模板文件
cd /server/tools/php-5.3.27
ls -l php.ini-*
-rw-r–r– 1 101 101 69606 7月 11 2013 php.ini-development #开发环境
-rw-r–r– 1 101 101 69627 7月 11 2013 php.ini-production #生产环境
工作中常使用php.ini-production,开发环境中更多的是开启日志、调试信息,而生产环境都是关闭状态,避免暴露配置、版本等。拷贝配置文件到php默认目录并改名为php.ini
cp php.ini-production /application/php/lib/php.ini
- pini常用配置参数
1.设置上传文件大小
file_uploads = on
upload_max_filesize = 8M
post_max_size = 8M
注意:post的数值要大于等于upload,否则upload不起作用。
2.设定一个脚本使用的最大内存
memory_limit = 128M
3.启用全局变量
register_gloables = on
注意:有些程序例如OSC需要启用全局变量
4.设置默认编码
default_charset = ‘iso–8859-1’
ps:这个一般不需要设置,因为大部分页面都有制定编码。
5.是否允许打开远程文件
allow_url_fopen = on
6.是否允许包含远程文件(include/require)
allow_url_include = false
7.时区
date.timezone = UTC
ps:php默认采用配置项中的时区,如果项目中涉及时区,请用date_default_timezone_get()/date_default_timezone_set(utc)来设定自己想要的时区。
8.禁用类/方法
disable_classes =
disable_functions =
ps:我的php.ini原来禁用了很多方法,会影响一些功能的使用,比如远程链接之类的。发送email应该回应想到。
9.设置错误报告级别
error_reporting =
ps:日志级别是一些常量,在php.ini中有写,推荐使用 E_ALL | E_STRICT,即所有级别。 10.输出错误信息
display_error = off
ps:是否将错误信息作为输出的一部分,站点发布后应该关闭这项功能,以免暴露信息。
11.定义各个级别系统日志变量
define_syslog_variables = off
ps:建议关闭,以提高性能。
12.错误日志
error_log =
ps:错误日志的位置,必须对web用户可写入,如果不定义则默认写入到web服务器的错误日志中去.
log_errors = on
ps:如上所说,建议将错误日志输出到文件,而不是直接输出到前端。
log_errors_max_length = 1024
ps:错误日志关联信息的最大长度,设为0表示无限长度。
13.默认socket时长
default_socket_timeout = 60
14.脚本最大执行时长
max_execution_time = 30
ps:设定每个脚本的最大执行时长,有助于阻止劣质脚本无限制占用服务器资源;0表示没有限制。
15.脚本最大输入时间
max_input_time = 60
ps:单个脚本最大输入时长
16.文件上传临时目录
upload_tmp_dir =
ps:php进程用户可写目录,如果不设置,则采用系统临时目录。(tmp)
17.输出后自动刷新数据
implicit_flush = off
ps:是否在echo();printf();等输出数据块之后刷新;对性能影响严重,只建议在调试状态下开启。
- 生产场景配置
root@192.168.1.235# cat php_conf/php.ini |egrep -v “^;|^$”
[PHP]
engine = On
short_open_tag = On
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 3
max_input_time = 800
memory_limit = 128M
error_reporting = E_ALL
display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL
error_log=/data/log/php/phperror.log
log_errors_max_len = 0
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = On
variables_order = “GPCS”
request_order = “GP”
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 500M
auto_prepend_file =
auto_append_file =
default_mimetype = “text/html”
doc_root =
user_dir =
extension_dir = “/data/webserver/php/lib/php/extensions/no-debug-non-zts-20100525/”
extension=”yaf.so”
extension=”yar.so”
yaf.library =”/home/www/ekwing/lib/”
yaf.cache_config = 1
extension=”ffmpeg.so”
extension=”mongo.so”
extension=”imagick.so”
extension=”memcache.so”
extension=”pdo_mysql.so”
extension=”redis.so”
[opcache]
zend_extension = “/data/webserver/php/lib/php/extensions/no-debug-non-zts-20100525/opcache.so”
opcache.force_restart_timeout=3600
opcache.memory_consumption=4096
opcache.optimization_level=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=32531
opcache.revalidate_freq=60 ;检测php文件变动频率 单位秒 多少秒检测下php文件是否变动
opcache.fast_shutdown=1
opcache.enable=1
opcache.enable_cli=1
enable_dl = Off
fastcgi.logging = 0
file_uploads = On
upload_max_filesize = 1024M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
date.timezone = Asia/Shanghai
[filter]
[iconv]
[intl]
[sqlite]
[sqlite3]
sqlite3.extension_dir =”/data/webserver/sqlite/lib”
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=”/home/mysql/mysql/tmp/mysql.sock”
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -fservice@moyi365.com -t -i
mail.add_x_header = On
[SQL]
sql.safe_mode = Off
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = “%Y-%m-%d %H:%M:%S”
ibase.dateformat = “%Y-%m-%d”
ibase.timeformat = “%H:%M:%S”
[MySQL]
mysql.allow_local_infile = On
mysql.allow_persistent = On
mysql.cache_size = 2000
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = Off
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.save_path = “/dev/shm/session”
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = “a=href,area=href,frame=src,input=src,form=fakeentry”
[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off
[Assertion]
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir=”/tmp”
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[mcrypt]
[dba]
[curl]
- 配置PHP服务php-fpm.conf(进程管理)
- php-fpm.conf重要参数详解
pid = run/php-fpm.pid #pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
error_log = log/php-fpm.log #错误日志,默认在安装目录中的var/log/php-fpm.log
log_level = notice #错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s #表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。
process_control_timeout = 0 #设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
daemonize = yes #后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
listen = 127.0.0.1:9000 #fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置.
listen.backlog = -1 #backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41
listen.allowed_clients = 127.0.0.1 #允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接
listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket设置选项,如果使用tcp方式访问,这里注释即可。
user = www
group = www
#启动进程的帐户和组
pm = dynamic #对于专用服务器,pm可以设置为static。如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #子进程最大数
pm.start_servers #启动时的进程数
pm.min_spare_servers #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ‘0’ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
pm.status_path = /status #FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
ping.path = /ping #FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
ping.response = pong #用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
request_terminate_timeout = 0 #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ‘0’ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。
request_slowlog_timeout = 10s #当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ‘0’ 表示 ‘Off’
slowlog = log/$pool.log.slow #慢请求的记录日志,配合request_slowlog_timeout使用
rlimit_files = 1024 #设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
rlimit_core = 0 #设置核心rlimit最大限制值. 可用值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值.
chroot = #启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
chdir = #设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
catch_workers_output = yes #重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
- 老男孩视频讲解
cd /application/php/etc/
ls
pear.conf php-fpm.conf.default
cp php-fpm.conf.default php-fpm.conf
左边生产环与默认配置比较,右边为默认值
mkdir /app/logs -p
/application/php/sbin/php-fpm #启动服务,没有提示,启动成功
netstat -lnt|grep php-fpm|grep -v grep|wc -l #查看启动进程,去掉主进程总共16个
17
netstat -lntup|grep php-fpm #查看启动端口
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2130/php-fpm
注:php-5.5.33与php-5.3.27的服务配置文件php-fpm.conf、引擎配置文件php.ini配置过程不变,配置内容基本相似
- php-fpm的启动参数
#测试php-fpm配置
/usr/local/php/sbin/php-fpm -t
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t
#启动php-fpm
/usr/local/php/sbin/php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.con
#关闭php-fpm
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
#重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
注意:这里仅为快速安装,详细过程参考《LNMP之PHP介绍及安装》
yum install zlib-devel libxml2-devel libjpeg-turbo-devel libiconv-devel -y
yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libtool-ltdl-devel openssl-devel -y
cd /server/tools/
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure –prefix=/usr/local/libiconv
make
make install
cd
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
ls /etc/yum.repos.d/
yum install -y libmcrypt-devel
yum install mhash mhash-devel mcrypt -y
cd /server/tools/
wget http://cn2.php.net/distributions/php-5.3.27.tar.gz
tar zxvf php-5.3.27.tar.gz
cd php-5.3.27
./configure \
–prefix=/application/php5.3.27 \
–with-apxs2=/application/apache/bin/apxs \
–with-mysql=/application/mysql \
–with-xmlrpc \
–with-openssl \
–with-zlib \
–with-mcrypt \
–with-mhash \
–with-mcrypt \
–with-mhash \
–with-freetype-dir \
–with-gd \
–with-jpeg-dir \
–with-png-dir \
–with-iconv-dir=/usr/local/libiconv \
–enable-short-tags \
–enable-sockets \
–enable-zend-multibyte \
–enable-soap \
–enable-mbstring \
–enable-static \
–enable-gd-native-ttf \
–with-curl \
–with-xsl \
–enable-ftp \
–with-libxml-dir
make
make install
ln -s /application/php5.3.27 /application/php
cp php.ini-production /application/php/lib/php.ini
无论是apacbe还是nginx,php.ini都是适合的。而php-fpm.conf适合nginx+FastCGI的配置。首先选择产品环境的php.ini
常见四种软件:eAccelerator、Zend、xcache、apc,详细配置请看相关文档
mount -t tmpfs tmpfs /dev/shm -o size=256m
mount -t tmpfs /dev/shm/ /tmp/eaccelerator
提示:
1、上传图片缩略图临时处理的目录,如:/tmp
2、其他加速器临时目录,如:/tmp/eaccelerator
php的安全模式是个非常重要的php内嵌的安全机制,能够控制一些php中的函数执行,比如system(),同时把很多文件操作的函数进行了权限控制。
safe_mode = Off #是否启用安全模式;打开时,php将检查当前脚本的拥有者是否和被操作的文件的拥有者相同,默认是没有打开的,我们把它打开如下
safe_mode = On
当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。建议设置为:safe_mode_gid=Off
如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操作的时候。php5.3.27默认为safe_mode_gid=Off。
如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括System()等在那的能够执行命令的php函数,或者能够查看php信息的phpinfo()等函数,那么我们就可以禁止它们,方法如下:
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作
disable_functions = chdir,chroot,dir,getcwd,opendir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,就能够抵制大部分的phpshell了:该参数默认为disable_functions =
我们为了防止黑客获取服务器中php版本的信息,可以关闭该信息泄露在http头中,该参数默认配置如下:
expose_php = On #是否泄露PHP被安装在服务器上的事实(在http头中加上其签名);它不会有安全上的直接威胁,但它使得客户端知道服务器上安装了PHP。
修改为Off
expose_php = Off
在php中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:
该参数默认配置如下:所以不用改
register_globals = Off
;是否将E,G,P,C,S变量注册为全局变量。
;打开该指令可能会导致严重的安全问题,除非你的脚本经过非常仔细的检查。
;推荐使用预定义的超全局变量:$_ENV,$_GET,$_POST,$_COOKIE,$_SERVER
;该指令受variables_order指令的影响。
;PHP6中已经删除此指令。
当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var,那么就要用$_GET[‘var’]来进行获取,这个php程序员要注意。
提示:关闭此项可能会导致老的php程序出问题,请根据情况处理。
如果php程序没有指明需要register_globals的话,最好把register_globals设置为Off,这样可以避免很多安全问题的
SQL注入是非常危险的问题,轻则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini中有一个设置:
magic_quotes_gpc = Off
这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把’转为\’等,这对防止sql注入有重大作用:所以我们推荐设置为:
magic_quotes_gpc = On
一般php在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示。
该参数默认配置如下:
display_errors = Off
;是否将错误信息作为输出的一部分显示给终端用户。应用调试时,可以打开,方便查看错误。
;在最终发布的web站点上,强烈建议你关掉这个特性,并使用错误日志代替(参看下面)。
;在最终发布的web站点打开这个特性可能暴露一些安全信息;
;例如你的web服务上的文件路径、数据库规划或别的信息。
php5.3.27默认为display_errors = Off,所以不用改
如果你确实是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:
error_reporting = E_WARNING & E_ERROR
当然,最好是关闭错误提示
建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因:php5.3.27默认为开
log_errors = On
同时也要设里错误日志存放的目录,建议根apache的日志存在一起:
error_log = /app/logs/php_errors.log #默认注释
注意:给文件必须允许apache用户和组具有写的权限。
设置每个脚本运行的最长时间
当无法上传较大的文件或者后台备份数据经常超时,此时需要调整如下设置
max_execution_time = 30
;每个脚本最大允许执行时间(秒),0表示没有限制
;这个参数有助于阻止劣质脚本无休止的占用服务器资源。
;该指令仅影响脚本本身的运行时间,任何其它花费在脚本运行之外的时间,如用System()/sleep()函数的使用、数据库查询、文件上传等,都不包括在内。
;在安全棋式下,你不溯ini_set()在运行时改变这个设置
每个脚本使用的最大内存
memory_limit = 128M
;一个脚本所能够申请到的最大内存字节数(可以使用K和M作为单位)。
;这有助于防止劣质脚本消耗完服务器上的所有内存。
;要能够使用该指令必须在编译时使用”–enable-memory-limlt”配置选项。
;如果要取消内存限制.则必须将其设为-1
;设置了该指令后,memory_get_usage()函数将变为可用。
每个脚本等待输入数据最长时间
max_input_time = 60
;每个脚本解析输入数据(POST,GET,upload)的最大允许时间(秒)。
;-1表示不限制
上载文件的最大许可大小
upload_max_filesize = 2M
;上载文件的最大许可大小,自己改吧,一些图片论坛需要这个更大的值。
1、禁止打开远程地址,记得最近出的php include的那个漏洞吗?就是在一个php程序中indude了变量,那么入侵者就可以利用这个控制服务器在本地执行远程的一个php程序,例如phpshell,默认开启所以我们关闭这个
allow_url_fopen = Off
2、设定gi.fix_pathinfo=0防止Nginx文件类型错误解析漏洞。默认为1
;session.save_handler = files
;存储和检素与会话关联的数据的处理器名字。默认为文件(‘files’);
;如果想要使用自定义的处理器(如基于数据库的处理器),可用”user”;设为”memcache”则可以使用memcache作为会话处理器(需要指定”–enable-memcache-session”编译选项)
;session.save_path = “/tmp”
;传递给存储处理器的参数。对于files处理器,此值是创建会话数据文件的路径。
修改为如下设置
session.save_handler = memcached
session.save_path = ” 192.168.80.105:11211″
官网文档:http://php.net/manual/en/memcached.sessions.php
下面仅仅是修改的部分,可以根据实际情况另外修改
[root@nginx etc]# vi php-fpm.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = error
rlimit_files = 32768
events.mechanism = epoll
listen.owner = nginx
listen.group = nginx
pm.max_children = 1024
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 15s;
pm.max_requests = 2048
slowlog = /app/logs/$pool.log.slow
request_slowlog_timeout = 10
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
请求一个PHP程序时,PHP引擎会解析该程序,并将其编译为特定操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由PHP引擎执行并丢弃.操作码缓存将保存这个编译后的操作码,并在下一次调用该页面时重用它。这会节省很多重复编译的时间。
为了提高PHP引擎的执行效率,PHP缓存加速器设计的目的是缓存PHP解析过的操作码,这样同样的请求访问过来,PHP引擎就不需要解析转换了,可以直接调用PHP的作码,这样就提高了web服务的响应速度,从而提升了用户的访问体验。
在LAMP环境中使用的是libphp5.so响应并处理php程序的请求、响应执行的流程大概如下:
- apache接收客户php程序请求
- apache将php程序请求程序传递给so
- so定位磁盘上的php文件,并加载到内存中。
- so编译源代码成为opcode树。
- so执行opcode树
在LNMP环境中,php引擎不在使用libphp5.so模块了,而是独立启动了FCGI进程,监听响应并处理php程序的请求、响应执行的流程大概如下:
- Nginx接收客户php程序请求
- Nginx根据扩展名判断将php程序请求传递给解析PHP的FCGI
- PHP FPM进程读取站点磁盘上的php文件,并加载到内存中
- PHP FPM编译PHP源代码成为opcode树
- PHP FPM的引擎执行opcode树进程
PHP缓存加速器解决的就是上述第4步问题,将opcode内容进行缓存,目的是防止PHP每次请求都里复编译解析PHP程序代码,因为在高访问量的网站上,大量的重复编译会消耗很多资源和事件,所以这里面的瓶颈就是PHP的里复编译既影响了响应速度,又加重了服务器的负载,为了解决此问题,PHP加速器就这样诞生了。
eaccelerator、xcache、Zend、apc
建议选择eaccelerator、xcache,二选一,xcache>eaccelerator
原因:xcache更快、开发更活跃。
lamp/lnmp基础web环境准备
在安装php扩展及缓存加速之前,需要安装好lamp/lnmp的基本环境,例如:看见出现phpinfo的界面为确认php的正常安装,同时最好可以编写一个调用数据库的程序,例如:test_mysql.php,确认MySQL数据库也是正常的.在前面的课程里,我们己经详细讲解了lamp/lnmp的安装及配置及产品应用
/application/nginx/sbin/nginx -V #nginx
cat /application/apache/build/config.nice #Apache
/application/php/bin/php -i| grep configure #php
grep CONFIGURE_LINE /application/mysql/bin/mysqlbug #mysql5.5之前
VISUAL=vim; export VISUAL;/application/mysql/bin/mysqlbug #mysql5.5之后
yum install perl-CPAN -y
echo $LC_ALL
echo ‘export LC_ALL=C’ >> /etc/profile
source /etc/profile
echo $LC_ALL
此节不操作可能会遇到如下问题
[root@apache ~]# /usr/local/webserver/php/bin/phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = “zh_CN.GB2312;zh_CN.UTF-8;en_US;en_US.UTF-8”
are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = “zh_CN.GB2312;zh_CN.UTF-8;en_US;en_US.UTF-8”
are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).
A PHP opcode cache / optimizer / accelerator
eaccelerator是一个自由的开放源代码的php加速、优化和动态内容缓存的扩展模块,它可以提升php程序的缓存性能,降低PHP程序在解析时对服务器的性能开销。eaccelerator还有对PHP优化的作用,加快其执行效率。使PHP程序代码执效率能提高1-10倍。
eAccelerator的前身其实是truk-mmcache,因为开发truk-mmcache的人被Zend给招安了,所以开发已Accelerator的人继承了truk-mmcache的一些特性,设计出eAccelerator加速器。
无论如何在系统上安装eAccelerator,都有一些配里选项需要注意。配里文件通常是/etc/php.d/eacceleotor.ini。eaccelotor.shm_size定义共享高速缓存的大小,编译后的脚本就存储在这里。该值的单位是兆字节(MB)。根据您的应用程序确定恰当的大小。
eAccelerator提供了一个脚本来显示缓存的状态,其中包含内存占用,64MB是个不错的选择(eaccelerator.shm_size=”64″).如果您选择的值未被接受,那么必须修改内核的最大共享内存的大小.向/etc/sysctl.conf添加kernel.shmmax=67108864,运行sysctl -p来使设置生效。kemel.shmmax值的单位是字节。
如果共享内存的分配超出极限,eAccelerator必须将旧脚本从内存中清除.默认情况下,这是被禁用的;eaccelerator.shm_ttl=”60″指定:当eAccelerator用完共享内存时,60秒内未被访问的所有脚本都将被清除。
另一种流行的eaccelerator替代工具是Alternative PHP cache(APC)。zend的厂商也提供了一种商业操作码缓存。
官网地址:http://eaccelerator.net/
Check out the documentation at http://github.com/eaccelerator/eaccelerator/wiki
The mailing list is available at http://groups.google.com/group/eaccelerator
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
cd /server/tools/
rz上传nginx-php-ext-soft.zip工具包
unzip nginx-php-ext-soft.zip
cd nginx-php-ext-soft
tar jxf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6
/application/php/bin/phpize
./configure –enable-eaccelerator=shared –with-php-config=/application/php/bin/php-config
make
make install
cd ..
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
xcache是一个又快又稳定的PHP opcode缓存器。经过良好的测试并在大流量/高负载的生产机器上稳定运行.经过(在linux上)测试并支持所有现行PHP分支的最新发布版本,如PHP_4_3 PHP_4_4 PHP_5_0 PHP_5_1 PHP_5_2 HEAD(6.x),并支持线程安全/Windows,与同类opcode缓存器相比更胜一筹,比如能够快速跟进PHP版本.详情请参http://xcache.lighttpd.net。
Xcahce的2个特点:
将PHP代码进行编译(表现类似于.NET和JAVA的编译,内部机制不同),这样可以不用重复读取PHP文件,加速整个程序的运行效率;
可以缓存数据到内存中,直接可以用,例如你的一些不会经常改动的数据,只用一次从数据库读取出来后保存到Xcache中,就不用再去读取数据库了(理想环境下)。
tar jxf xcache-1.3.2.tar.bz2
cd xcache-1.3.2
/application/php/bin/phpize
./configure –enable-xcache –with-php-config=/application/php/bin/php-config
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..
Zend Optimizer使用优化代码的方法来提高PHPv5.1-v5.2应用程序的执行速度。实现的原理是对那些在被最终执行之前由运行编译器(run-Time compiler)产生的代码进行优化。一般情况下,执行使用Zend Optimizer的PHP程序比不使用的要快40%到100%:这意味着网站的访问者可以更快的浏览网页,从而完成更多的事务,创造更好的客户满意度。
更快的响应同时也意味着可以书省硬件投资,并增强网站所提供的服务。zend OPtimizer能给PHP用户带来很多益处,特别是那些运营网站的人。快速运行PHP程序可以显著降低服务器的CPU负载,并可以减少一半的反应时间,也就是从访问者点击链接到服务器开始读取页面之间的时间。
由于对PHPv5.2之后的版本无效安装方法这里不再叙述
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度
Menlcache分为服务端软件(名字如:memcached-1.4.3.tar.gz)和客户端插件(名字如:memcache-2.2.5.tgz)两部分,本文就是客户端插件在php服务中的安装
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure –with-php-config=/application/php/bin/php-config
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..
PDO扩展为PHP访问数据库定义了一个轻最级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询并获取数据。下载地址:http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz(技巧谷歌搜索关键字
tar zxf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
/application/php/bin/phpize
./configure –with-php-config=/application/php/bin/php-config –with-pdo-mysql=/application/mysql
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..
注意:如果本地没有安装mysql,可以修改–with-pdo-mysql=mysqlnd,也可以在编译安装php时添加此参数及–with-mysql=mysqlnd #有待测试
ImageMagick是一套功能强大、稳定而且免费的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片,还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成.同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。现在,ImageMagick的主要精力集中在性能、减少bug以及提供稳定的API和ABI上。
1.将图片从一个格式转换到另一个格式,包括直接转换成图标。
2.改变尺寸、旋转、锐化(sharpen)、减色、图片特效
3.缩略图片的合成图(a montage of image thurnbnails)
4.适于web的背景透明的图片
5.将一组图片作成gif动画,直接convert
6.将几张图片作成一张组合图片,montage
7.在一个图片上写字或画图形,带文字阴影和边框渲染
8.给图片加边框或框架
9.取得一些图片的特性信息
10,几乎包括了gimp可以作到的常规插件功能。甚至包括各种曲线参数的渲染功能.只是那命令的写法,够复杂。
tar zxvf ImageMagick.tar.gz
cd ImageMagick-6.5.1-2
./configure
make
make install
cd ..
如果出现如下情况
Can’t locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 24.
BEGIN failed–compilation aborted at Makefile.PL line 24.
make[1]: *** [PerlMagick/Makefile] Error 2
make[1]: Leaving directory `/home/oldboy/tools/ImageMagick-6.5.1-2′
make: *** [all] Error 2
解决办法:yum install perl-CPAN -y
- 安装amqp扩展
安装rabbitmq-c依赖包
yum install libtool autoconf
安装rabbitmq-c ( 最好下载 0.5的,0.6安装可能会报错)
wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.5.0/rabbitmq-c-0.5.0.tar.gz
tar zxf rabbitmq-c-0.5.0.tar.gz
cd rabbitmq-c-0.5.0
autoreconf -i
./configure –prefix=/usr/local/rabbitmq-c
make
make install
安装PHP扩展 amqp
wget http://pecl.php.net/get/amqp-1.6.1.tgz
tar zxvf amqp-1.6.1.tgz
cd amqp-1.6.1
/data/webserver/php/bin/phpize
./configure –with-php-config=/data/webserver/php/bin/php-config –with-amqp –with-librabbitmq-dir=/usr/local/rabbitmq-c
make
make install
编辑php.ini文件,增加amqp扩展支持
vim /data/webserver/php/etc/php.ini #添加如下
extension=amqp.so
重启php-fpm。然后通过phpinfo()查看是否支持amqp扩展
测试
<?php
$conn_args = array(
‘host’ => ‘192.168.1.106’,
‘port’ => ‘5672’,
‘login’ => ‘liwenbin’,
‘password’ => ‘123456’,
‘vhost’=>’/’
);
$q_name = ‘helloworld’; //队列名
//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die(“Cannot connect to the broker!\n”);
}
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName($q_name);
//阻塞模式接收消息
echo “Message:\n”;
while(True){
$q->consume(‘processMessage’);
//$q->consume(‘processMessage’, AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答
echo $msg.”\n”; //处理消息
sleep(190);
}
特别提示:imagick插件工作需要ImageMagick软件的支持,所以,必须要先安装ImageMagick,否则会报错。
一个可以供PHP调用ImageMagick功能的PHP扩展。使用这个扩展可以使PHP具备和ImageMagick相同的功能。
装了ImageMagick-6.5.1-2图像程序后,再装php的扩展imagick插件,才能使用ImageMagick-6.5.1-2提供的api来进行图片的创建与修改、压缩等操作,都集成在imagick这个扩展中
tar zxvf imagick-2.3.0.tgz
cd imagick-2.3.0
/application/php/bin/phpize
./configure –with-php-config=/application/php/bin/php-config
make
make install
ll /application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cd ..
cd /application/php/lib/
cp php.ini php.ini.ori
vim php.ini修改; extension_dir = “./”为
extension_dir = “/application/php5.3.27/lib/php/extensions/no-debug-non-zts-20090626/”
在配置文件结尾添加如下
extension = memcache.so
extension = pdo_mysql.so
extension = imagick.so
配置完成后对于lamp重启apache,对于lnmp重启php-fpm
/application/apache/bin/apachectl graceful #重启apache
pkill php-fpm #关闭php-fpm,或者
ps -ef|grep php-fpm|awk ‘{print $2}’|xargs kill
/application/php/sbin/php-fpm #启动php-fpm
mkdir /tmp/eaccelerator
#此目录可以用tmpfs内存文件系统来存储,SSD固态硬盘。
chown -R apache.apache /tmp/eaccelerator #lamp环境
chown -R nginx.nginx /tmp/eaccelerator #lnmp环境
cat >> /application/php/lib/php.ini<<EOF
[eaccelerator]
extension=eaccelerator.so
eaccelerator.shm_size=”64″
eaccelerator.cache_dir=”/tmp/eaccelerator”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.filter=””
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”3600″
eaccelerator.shm_prune_period=”3600″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″
EOF
注意:如果配置了zend,那么[eaccelerator]段配置要放在zend的内容配置前
/application/php/bin/php -v #查看是否生效
ls /tmp/eaccelerator/ #查看是否有文件
重启apache或者php-fpm然后访问phpinfo网页发现会有缓存文件
find /tmp/eaccelerator/ -type f
提示:xcache和eaccelerator功能相近,安装一个即可。本文考虑文章完整,作为知识点来讲解。
echo >>php.ini
echo ‘;xcache config by oldboy 20120418———————-‘ >>php.ini
vi /server/tools/nginx-php-ext-soft/xcache-1.3.2/xcache.ini #仅修改下面几行
3 ;zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
6 ;zend_extension_ts = c:/php/extensions/php_xcache.dll
8 extension = xcache.so
25 xcache.size = 128M
31 xcache.ttl = 86400
注意:生产环境需要根据硬件条件具体修改
cat /server/tools/nginx-php-ext-soft/xcache-1.3.2/xcache.ini >>/application/php/lib/php.ini
检查:发现和eAccelerator冲突,所以生产场景只用一个
[root@nginx extra]# /application/php/bin/php -v
PHP Warning: Cannot load module ‘XCache’ because conflicting module ‘eAccelerator’ is already loaded in Unknown on line 0
PHP 5.3.27 (cli) (built: May 11 2016 02:36:17)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
with eAccelerator v0.9.6, Copyright (c) 2004-2010 eAccelerator, by eAccelerator
测试:访问phpinfo文件查看插件信息
PHP EXT module | 说明 | 备注 |
eaccelerator-0.9.5.2 | 适合php5.3以前的版本,性能优化用 | 可选php扩展插件 |
eaccelerator-0.9.6 | 适合php5.3版本,性能优化用 | 可选php扩展插件 |
ImageMagick.tar.gz | 常用图像处理程序,属功能应用 | 非php扩展插件 |
imagick-2.3.0.tgz | 需要先装图像处理程序,属功能应用 | 可选php扩展插件 |
memcache-2.2.5.tgz | memcache客户端(和服务端要区别) | 可选php扩展插件 |
PDO_MYSQL-1.0.2.tgz | php数据库访问插件,属功能应用 | 可选php扩展插件 |
zendOPtimizer | 性能优化用 | 可选php扩展插件 |
xcache-1.3.2 | 性能优化用 | 可选php扩展插件 |
- 生产环境插件的安装建议
- 功能性插件,如果开发人员没需求,可以暂时不考虑安装,如:PDO_MYSQL、memcache,imagick。
- 优化性插件eaccelerator,xcache,zendOPtimizer,可以任意3选二安装,或安装任一种,具体情况看实际业务需求,及根据实际测试结果来安装,老男孩老师在使用中也是这么用的,效果都还好。更深入的测试留给大家了,用数据说话很里要。
- PHP加速插件的测试对比
请求时间(秒) | 单次请求时间(毫秒) | 最大内存占用(MB) | 最小内存占用(MB) | |
None | 10.41 | 96.08 | 24 | 24 |
APC | 30.45 | 32.84 | 21 | 21 |
eAccelerator | 31.26 | 31.99 | 23 | 18 |
XCache | 30.28 | 33.02 | 29 | 19 |
1、通过测试得出eAccelerator在请求时间和内存占用综合方面是最好的。
2、通过测试得出使用加速器比无加速器在请求时间快了3倍左右。
3、通过各个官方观察,XCache是更新最快的,这也说明最有发展的。
以上是总结结果,你也许会问我到底用那个加速器好呢?我只能告诉你,首先,用一定比不用好,其次每个加速器还有一些可以调优的参数,所以要根据你的系统环境而定,然后,我个人觉得你可以详细研究下eAccelerator和XCache,这两款潜力还是很大的,