可能要用到的软件: libiconv-1.13.tar.gz libmcrypt-2.5.8.tar.gz mcrypt-2.6.8.tar.gz mhash-0.9.9.9.tar.gz memcache-2.2.5.tgz PDO_MYSQL-1.0.2.tgz imagick-3.1.2.tgz pcre-8.21.tar.gz mysql-5.6.17.tar.gz ImageMagick.tar.gz php-5.5.11.tar.gz nginx-1.4.6.tar.gz 系统安装需求:
centos 6.4 *86_64
mini 安装 安装解决依赖关系: yum install -y wget gcc gcc-c++ autoconf libjpeg libjpeg-devel perl perl* perl-CPAN libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers png jpeg autoconf gcc cmake make gcc-c++ gcc ladp ldap* ncurses ncurses-devel zlib zlib-devel zlib-static pcre pcre-devel pcre-static openssl openssl-devel perl libtoolt openldap-devel libxml2-devel ntpdate cmake gd* gd2 ImageMagick-devel jpeg jpeg* pcre-dev* fontconfig libpng libxml2 zip unzip gzip 下载所有使用到的软件: wget http://ftp.gnu.org/gnu/libiconv/libiconv-1.13.tar.gz wget wget http://jaist.dl.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz wget http://jaist.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz wget wget http://pecl.php.net/get/imagick-3.1.2.tgz wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz wget wget https://lnamp-web- NGINX1.4.6: http://nginx.org/download/nginx-1.4.6.tar.gz MYSQL5.6.17 http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.17.tar.gz PHP5.5.11 http://us1.php.net/get/php-5.5.11.tar.gz/from/this/mirror 先前分别在两台机器上编译过两次不同 MYSQL 版本: MYSQL5.6.12和 MYSQL5.6.17 编译命令 都是如下: cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci 完成后,继续下面的操作 cd /usr/local/mysql chown -R mysql:mysql . (为了安全安装完成后请修改权限给 root 用户) scripts/mysql_install_db --user=mysql (先进行这一步再做如下权限 的修改) chown -R root:mysql . (将权限设置给 root 用户,并设置给 mysql 组, 取消其他用户的读写执行权限,仅留给 mysql "rx"读执行权限,其他用户无 任何权限) chown -R mysql:mysql ./data (给数据库存放目录设置成 mysql 用户 mysql 组,并赋予 chmod -R ug+rwx 读写执行权限,其他用户权限一律删除 仅给 mysql 用户权限) 下面的命令是可选的,将 mysql 的配置文件拷贝到/etc cp support-files/my-medium.cnf /etc/my.cnf (原始老版本是此操作, 5.6.12版本的是如下文件地址) cp support-files/my-default.cnf /etc/my.cnf (并给/etc/my.cnf +x 权限 同时删除 其他用户的写权限,仅仅留给 root 和工作组 rx 权限,其 他一律删除连 rx 权限都删除) #修改 my.cnf 配置 vim /etc/my.cnf #[mysqld] 添加: datadir=/data/mysql default-storage-engine=MyISAM 启动 mysql: [c-sharp]view plaincopy bin/mysqld_safe --user=mysql & #启动 mysql,看是否成功 netstat -tnl|grep 3306
[c-sharp]view plaincopy bin/mysqld_safe --user=mysql & #启动 mysql,看是否成功 netstat -tnl|grep 3306 上面是一种启动 mysql 的方法,还有一种简单的方便,如下: [c-sharp]view plaincopy #将 mysql 的启动服务添加到系统服务中 cp support-files/mysql.server /etc/init.d/mysql #现在可以使用下面的命令启动 mysql service mysql start #停止 mysql 服务 service mysql stop #重启 mysql 服务 service mysql restart 将 mysql 服务添加到开机启动项,让 mysql 服务开机启动 [c-sharp]view plaincopy chkconfig --add mysql 修改默认 root 账户密码,默认密码为空 修改密码 cd 切换到 mysql 所在目录 cd /usr/local/mysql #./bin/mysqladmin -u root password 回车在接下来的提示中设置新密码即可。。 #启动 MySQL /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf & #或者 /etc/init.d/mysql start (service mysql start) #测试 MySQL 是否启动 # 1)查看是否有进程 mysql ps -ef | grep mysql # 2)查看端口是否运行 netstat -tnl | grep 3306 # 3)读取 mysql 版本信息
mysqladmin version PHP5.4.8常用编译命令 ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs #此行仅在 apache+php 下使 用,nginx+php 时请去掉 --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --with-freetype-dir --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --enable-session --with-gettext --enable-pdo --with-pdo-mysql
--enable-shared --enable-ftp --enable-exif --with-pear php5.5之后新增下面可选命令 --enable-opcache 线上服务器可以加入以下命令关闭调试模式: --disable-debug php5.5.11 后 无 法 识 别 的 废 旧 编 译 选 项 ( 如 果 提 示 WRING 警 告 无 法 识 别 --with-curlwrappers 无视即可): --with-curlwrappers 使用 NGINX 处理请去掉下面一行,下面一行仅在 APACHE 下使用 --with-apxs2=/usr/local/apache2/bin/apxs 使用 NGINX 可以加入下面两行指定 FPM 运行账户权限: --with-fpm-user=www --with-fpm-group=www PHP 编译选项说明: """ 安装路径 """ --prefix=/usr/local/php """ php.ini 配置文件路径 """ --with-config-file-path=/etc """ 优化选项 """ --enable-inline-optimization --disable-debug --disable-rpath --enable-shared """ 启用 opcache,默认为 ZendOptimizer+(ZendOpcache) """ --enable-opcache """ FPM """ --enable-fpm --with-fpm-user=www --with-fpm-group=www """ MySQL """ --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd """ 国际化与字符编码支持 """ --with-gettext --enable-mbstring --with-iconv
""" 加密扩展 """ --with-mcrypt --with-mhash --with-openssl """ 数学扩展 """ --enable-bcmath """ Web 服务,依赖 libxml """ --enable-soap --with-libxml-dir """ 进程控制 """ --enable-pcntl --enable-shmop --enable-sysvsem """ socket & curl """ --enable-sockets --with-curl """ 压缩与归档 """ --with-zlib --enable-zip --with-bz2 """ GNU Readline 命令行快捷键绑定 """ --with-readline """ 禁用 SQLite 支持扩展 """ --without-sqlite3 --without-pdo-sqlite """ 更多 PHP 扩展与应用库 """ --with-pear 在 Linux 下安装 PHP,源代码方式安装 需要配置很多参数。这里列出常用配置参数,并详细用中文解释说明了。给大家一些参考 编译 PHP 的时候慎用 –with-curlwrappers 参数 ./configure --prefix=/usr/local/PHP --with-apxs2=/usr/local/apache/bin/apxs 版本 php 安装目录 表示使用 apache2.0以上版本,apxs 表示使用的 apache1.0 --with-config-file-path=/usr/local/PHP/etc --with-MySQL=/usr/local/mysql --with-MySQLi=/usr/local/mysql/bin/mysql_config --enable-safe-mode 指定 php.ini 位置 mysql 安装目录,对 mysql 的支持 mysqli 文件目录,优化支持 打开安全模式 --enable-ftp 打开 ftp 的支持
--enable-zip --with-bz2 --with-jpeg-dir --with-png-dir --with-freetype-dir --without-iconv --with-libXML-dir --with-XMLrpc --with-zlib-dir --with-gd --enable-gd-native-ttf --with-curl --with-curlwrappers --with-ttf --with-xsl 软件 --with-gettext --with-pear --enable-calendar --enable-mbstring --enable-bcmath --enable-sockets --enable-exif --enable-magic-quotes --disable-rpath --disable-debug
打开对 zip 的支持 打开对 bz2文件的支持 打开对 jpeg 图片的支持 打开对 png 图片的支持 打开对 freetype 字体库的支持 关闭 iconv 函数,种字符集间的转换 打开 libxml2库的支持 打开 xml-rpc 的 c 语言 打开 zlib 库的支持 打开 gd 库的支持 支持 TrueType 字符串函数库 打开 curl 浏览工具的支持 运用 curl 工具打开 url 流 打开 freetype1.*的支持,可以不加了 打开 XSLT 文件支持,扩展了 libXML2库 ,需要 libxslt 打开 gnu 的 gettext 支持,编码库用到 打开 pear 命令的支持,PHP 扩展用的 打开日历扩展功能 多字节,字符串的支持 打开图片大小调整,用到 zabbix 监控的时候用到了这个模块 打开 sockets 支持 图片的元数据支持 魔术引用的支持 关闭额外的运行库文件 关闭调试模式 --with-mime-magic=/usr/share/file/magic.mime --enable-opcache //PHP5.5X+新增代码加速功能 CGI 方式安装才用的参数 魔术头文件位置 --enable-fpm --enable-fastCGI --enable-force-CGI-redirect --with-ncurses --enable-pcntl mhash 和 mcrypt 算法的扩展 --with-mcrypt --with-mhash --with-gmp --enable-inline-optimization --with-openssl 打上 PHP-fpm 补丁后才有这个参数,CGI 方式安装的启动程序 支持 fastcgi 方式启动 PHP 同上 ,帮助里没有解释 支持 ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库 freeTDS 需要用到的,可能是链接 mssql 才用到 算法 算法 openssl 的支持,加密传输时用到的
--enable-dbase --with-pcre-dir=/usr/local/bin/pcre-config --disable-dmalloc perl 的正则库案安装位置 --with-gdbm --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-zend-multibyte dba 的 gdbm 支持 支持 zend 的多字节 --enable-mbregex --enable-wddx --enable-shmop --enable-soap 准备 PHP 的配置文件 1# cd /home/down/php-5.5.11 2# cp php.ini-production /usr/local/php/etc/php.ini 准备 php_fpm 的配置文件 # cd /usr/local/php/etc/ # cp php-fpm.conf.defaultphp-fpm.conf # vim php-fpm.conf 修改 php-fpm.conf 配置文件 内容去掉如下前面的分号,并根据实际硬件配置进行更改,这里仅做简单配置,下面会有 PHP-FPM 的详细的 优化配置讲解 pid = run/php-fpm.pid error_log = log/php-fpm.log listen = 127.0.0.1:9000 pm.max_children = 40 pm.start_servers = 12 pm.min_spare_servers = 4 pm.max_spare_servers = 20 pm.max_requests = 1000
使用 php-fpm 启动 php (需要注意的是启动配置文件需要给用户组+rx 权限尤其要添加到服务器项的+x 权限,否 则会因没有可执行权限而产生的异常错误) Php-fpm 代码 php5.5X+版本提供了 php-fpm 的管理工具,可以很方便的 start,stop,restart Php-fpm 代码 // 个人习惯把 php 相关命令丢在这 #cd /usr/local/php/sbin/ // 在安装文件中复制该文件 #cp /home/down/php-5.5.11/sapi/fpm/init.d.php-fpm ./ #chmod 755 init.d.php-fpm // start | stop | restart #./init.d.php-fpm start 另一种 PHP-FPM 启动方式: 测试 php/php-fpm 是否安装成功: #测试 php-fpm 配置(实际路径根据自己 PHP 安装路径自行替换) /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/php-fpm 安装成功 [18-Apr-2014 23:20:15] NOTICE: configuration file /usr/local/php/etc/php-fpm.conf test is successful ( 一 点 小 插 曲 : 第 一 次 测 试 时 启 动 时 出 现 如 下 错 误 , vim /usr/local/php/etc/php-fpm.conf 打开找到第52行发现52行的修改注释忘记 加注释符号分号“;”了,OK 搞定
Starting
php-fpm
[18-Apr-2014
23:09:15]
ERROR: [/usr/local/php/etc/php-fpm.conf:52] value is NULL for a ZEND_INI_PARSER_ENTRY [18-Apr-2014 23:09:15] ERROR: failed to load configuration file '/usr/local/php/etc/php-fpm.conf' [18-Apr-2014 23:09:15] ERROR: FPM initialization failed) #启动 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.conf #关闭 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` 为 php-fpm 提供 Sysv init 脚本,并将其添加至服务列表 致使开机自 动启动 # cd/home/down/php-5.5.11 # cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm # cp sapi/fpm/init.d.php-fpm/etc/init.d/php-fpm # chmod +x /etc/init.d/php-fpm # chkconfig --add php-fpm # chkconfig php-fpm on 完成如上操作即可在命令行使用 service php-fpm start | stop | restart 进行 启动| 停止|重启操作 php-fpm 了
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 . 默认 值: 空. PHP-FPM 常见错误及解决办法整理 如果 file_get_contents 请求的远程资源如果反应过慢,file_get_contents 就 会一直卡在那里不会超时。我们知道 php.ini 里面 max_execution_time 可以设 置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起 效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的 request_terminate_timeout 参数。 request_terminate_timeout 默认值为 0 秒,也就是说,PHP 脚本会一直执行 下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这 台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用 户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是 必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获 取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个 请 求 , WebServer 同 样 很 难 避 免 ”502 Bad Gateway” 。 解 决 办 法 是 request_terminate_timeout 设 置 为 10s 或 者 一 个 合 理 的 值 , 或 者 给 file_get_contents 加一个超时参数。 $ctx= stream_context_create(array( 'http'=>array( ) 'timeout'=> 10 //设置一个超时时间,单位为秒 )); file_get_contents($str, 0,$ctx); max_requests 参数配置不当,可能会引起间歇性502错误: pm.max_requests = 1000 设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块 来 说 是 非 常 有 用 的 . 如 果 设 置 为 ’0′ 则 一 直 接 受 请 求 . 等 同 于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0. 这段配置的意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动
重启该进程。 但是为什么要重启进程呢? 一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经 常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不 断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对 请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。 正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否还存在这个问题。 目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内 存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己 的实际情况设置这个值,不能盲目地加大。 话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检 测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占 用量来重启 PHP-CGI 进程,会是更好的一个解决方案。 3,php-fpm 的慢日志,debug 及异常排查神器: request_slowlog_timeout 设置一个超时的参数,slowlog 设置慢日志的存放位 置 1 tail-f/var/log/www.slow.log 上面的命令即可看到执行过慢的 php 过程。 大家可以看到经常出现的网络读取超过、Mysql 查询过慢的问题,根据提示信息 再排查问题就有很明确的方向了。 php-fpm 优化 1、php-fpm 优化参数介绍 他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、 pm.max_spare_servers。 pm:表示使用那种方式,有两个值可以选择,就是 static(静态)或者 dynamic (动态)。 在更老一些的版本中,dynamic 被称作 apache-like。这个要注意看配置文件的
说明。 下面4个参数的意思分别为: pm.max_children:静态方式下开启的 php-fpm 进程数量 pm.start_servers:动态方式下的起始 php-fpm 进程数量 pm.min_spare_servers:动态方式下的最小 php-fpm 进程数 pm.max_spare_servers:动态方式下的最大 php-fpm 进程数量 区别: 如果 dm 设置为 static,那么其实只有 pm.max_children 这个参数生效。 系统会开启设置数量的 php-fpm 进程。 如果 dm 设置为 dynamic,那么 pm.max_children 参数失效,后面3个参数生效。 系统会在 php-fpm 运行开始 的时候启动 pm.start_servers 个 php-fpm 进程, 然后根据系统的需求动态在 pm.min_spare_servers 和 pm.max_spare_servers 之间调整 php-fpm 进程数 2、服务器具体配置 对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟 Apache 一样,运 行的 PHP 程序在执行完成后,或多或少会有内存泄露的问题。 这也是为什么开始的时候一个 php-fpm 进程只占用3M 左右内存,运行一段时间 后就会上升到20-30M 的原因了。 对于内存大的服务器(比如8G 以上)来说,指定静态的 max_children 实际上更 为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。 因为频繁开关 php-fpm 进程也会有时滞,所以内存够大的情况下开静态效果会更 好。数量也可以根据 内存/30M 得到,比如8GB 内存可以设置为100, 那么 php-fpm 耗费的内存就能控制在 2G-3G 的样子。如果内存稍微小点,比如 1G,那么指定静态的进程数量更加有利于服务器的稳定。 这样可以保证 php-fpm 只获取够用的内存,将不多的内存分配给其他应用去使 用,会使系统的运行更加畅通。 对于小内存的服务器来说,比如256M 内存的 VPS,即使按照一个20M 的内存量来 算,10个 php-cgi 进程就将耗掉200M 内存,那系统的崩溃就应该很正常了。 因此应该尽量地控制 php-fpm 进程的数量,大体明确其他应用占用的内存后,给 它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式, 因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较 少的服务器或 VPS 上使用。具体最大数量根据 内存/20M 得到。 比 如 说 512M 的 VPS , 建 议 pm.max_spare_servers 设 置 为 20 。 至 于 pm.min_spare_servers,则建议根据服务器的负载情况来设置,比如服务器上只 是部署 php 环境的话,比较合适的值在5~10之间。
本服务器配置 1、服务器基本信息: 硬盘:数据盘30G、系统盘20G 内存:1.5G CPU:双核 系统:CentOS 6.3 64位 带宽:独享2M 2、部署的应用 Git、SVN、Apache、Tomcat、PHP、Nginx、Mysql、JDK 3、优化后的参数 1 pm = dynamic 2 pm.start_servers = 5 3 pm.min_spare_servers = 2 4 pm.max_spare_servers = 8
NGINX 安装配置 ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_flv_module --with-pcre 检查是否安装成功 cd /usr/local/nginx/sbin ./nginx -t 结果显示: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
启动 nginx cd /usr/local/nginx/sbin 目录下面 输入 ./nginx 启动 nginx 检查是否启动成功 ie 浏览器中输入 http://192.168.15.132 (切换成自己的 IP 地址即可) 停止 nginx pkill -9 nginx 将 NGINX 添加为系统服务: 1、编写脚本,名为 nginx vim /etc/init.d/nginx chmod 755 /etc/init.d/nginx chkconfig --add nginx chkconfig nginx on 更换 NGINX 启动方式 测试是否成功 service nginx start service nginx stop service nginx restart 启动 停止 重启 /etc/init.d/nginx 的内容如下: #!/bin/sh # # nginx - this script starts and stops the nginxdaemon # # chkconfig: - 8515 # description: Nginx is an HTTP(S) server, HTTP(S) reverse # proxy and IMAP/POP3 proxy server # processname: nginx #config: #config: #pidfile: /etc/nginx/nginx.conf /etc/sysconfig/nginx /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network
# Check that networking is up. [ "$NETWORKING" = "no" ] && exit0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && ./etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx start() { [ -x $nginx] || exit 5 [ -f$NGINX_CONF_FILE ] || exit 6 echo -n$"Starting $prog: " daemon$nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval-eq 0 ] && touch$lockfile return$retval } stop() { echo -n$"Stopping $prog: " killproc$prog -QUIT retval=$? echo [ $retval-eq 0 ] && rm -f$lockfile return$retval killall -9 nginx } restart() { configtest|| return $? stop sleep1 start } reload() { configtest|| return $? echo -n$"Reloading $prog: " killproc$nginx -HUP
RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status$prog } rh_status_q() { rh_status>/dev/null2>&1 } case "$1" in start) rh_status_q && exit0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0
;; *) echo $"Usage: $0{start|stop|status|restart|condrestart|try-restart|reload|force-rel oad|configtest}" exit 2 esac ##################################################################### ##### 编辑 nginx 配置文件,整合 nginx 与 php 说明:nginx 默认页面路径已经更改为了/home/var/www; location ~ .php$ { root /home/var/www; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } 添加默认默认页面 index index.php index.htmlindex.htm; 编辑 fastcgi_params 文件,如果为空或不存在该文件则创建并添加如下内容,如 果已有内容则忽略如下步骤 vim /usr/local/nginx/conf/fastcgi_params --如果为空把原有内容更改如下, 不为空则忽略: fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; // 这一句如果默认配置文件里没有请手动添加进去,否则更改站点目录后 PHP 访问 会出现 not found
fastcgi_param fastcgi_param fastcgi_param fastcgi_param fastcgi_param fastcgi_param fastcgi_param fastcgi_param fastcgi_param fastcgi_param
SCRIPT_NAME $fastcgi_script_name; REQUEST_URI $request_uri; DOCUMENT_URI $document_uri; DOCUMENT_ROOT $document_root; SERVER_PROTOCOL $server_protocol; REMOTE_ADDR $remote_addr; REMOTE_PORT $remote_port; SERVER_ADDR $server_addr; SERVER_PORT $server_port; SERVER_NAME $server_name; 更改 NGINX 默认站点目录 vim /usr/local/nginx/conf/nginx.conf (实际配置文件安装路径)注意替换下面的红色部位,具体 NGINX 优化安全设置,以后将单独写文章做设置,敬请期待 将其中的 location / { root html; index index.php index.html index.htm; } 改为 location / { root /home/var/www; index index.php index.html index.htm; } 然后再将 location ~ .php$ { root fastcgi_pass html; 127.0.0.1:9000;
fastcgi_index fastcgi_param
index.php; SCRIPT_FILENAME /script$fastcgi_script_name; include } 改为 location ~ .php$ { root fastcgi_pass fastcgi_params;
/home/var/www; 127.0.0.1:9000; fastcgi_index fastcgi_param index.php; SCRIPT_FILENAME $document_root$fastcgi_script_name; } include fastcgi_params; 然后重启 nginx 即可 更改 index.php 页面内容 vim /home/var/www/index.php <?php phpinfo(); ?> http://127.0.0.1/ 浏览器打开 验证是否 整合 NGINX+PHP-FPM 整合成功 则出现 PHPINFO 页面信息。。。 安装 MEMCACHE,和 OPCACHE 扩展 (因为 php5.5X+版本已经内置了 memcache 和 opcache 扩展,所以不必另行下载, 即可采用以下方式进行编译) 1.memcache 如果需要为 php 增加 memcache 扩展,按如下方法进行:
cd /usr/local/php/bin ./pecl install memcache 安装时会提示是否开启 session 支持,根据需要输入 no 或者 yes,安装后路径 如下: /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache. so 需要手动配置到 php.ini 中,增加如下内容,即表示启用 memcache 扩展: extension=memcache.so 保存后,重启 Apache,查看 http://192.168.36.24/test.php 进行验证。 2.Zend OPCache 为了提高 php 运行速度,可以启用 Zend OPCache,启用方法很简单,安照上面 的方法安装 php,则已经在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/ 下 生 成 了 opcache.so,只需将其配置到 php.ini 中即可。 vim /usr/local/php/etc/php.ini 找到[opcache] 在其下面增加: zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-201 21212/opcache.so 然后打开并配置相应的配置项即可,比如: opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=5000 opcache.revalidate_freq=60 opcache.load_comments=1 保存后,重启 Apache,查看 http://192.168.36.24/test.php 进行验证。会看 到如下信息:
with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies PHP 安装中出现的常见问题及错误解决方法见下方: 出现如下错误 php 安装出错:configure: error: mcrypt.h not found. Please reinstall libmcrypt.,意思是,没有查找到 mcrytp.h,需要安装 libcrytp,在 下面的地址下载 libmarypt: wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/attic/libmcrypt/libmcrypt-2. 5.8.tar.gz 安装: 66 tar -zxvf libmcrypt-2.5.8.tar.gz 67 cd libmcrypt-2.5.7 67 ./configure 70 make 71 make install 然后再安装 PHP centos 6.2 64位版本上安装 LNMP,configure php 的时候出现下面错误而退出 configure: error: Cannot find ldap libraries in /usr/lib 解决办法: cp -frp /usr/lib64/libldap* /usr/lib/ 然后再./configure.. ...重新编译即可 error 1 checking for xml2-config path... configure: error: xml2-config not found. Please check your libxml2 installation. (看提示就明白 是一个 lib 库没装 先用 yum search 名字 看是否能搜到名 字 ,找到名字后 把软件包 开发包装上) 解决办法 yum install libxml2-devel.x86_64 error 2 checking for pkg-config... /usr/bin/pkg-config
configure: error: Cannot find OpenSSL's <evp.h> 这是 ssl 没装 解决办法 yum install openssl.x86_64 openssl-devel.x86_64 -y error 3 checking for BZip2 in default path... not found configure: error: Please reinstall the BZip2 distribution 这是 bzip2软件包没有安装 解决办法 yum install bzip2-devel.x86_64 -y error 4 configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/ curl 和 curl 库文件没有安装 解决办法 yum install libcurl.x86_64 libcurl-devel.x86_64 -y error 5 checking whether to enable JIS-mapped Japanese font support in GD... no checking for fabsf... yes checking for floorf... yes configure: error: jpeglib.h not found GD 库没有安装 解决办法 yum install libjpeg.x86_64 libpng.x86_64 freetype.x86_64 libjpeg-devel.x86_64 libpng-devel.x86_64 freetype-devel.x86_64 -y error 6
checking for stdarg.h... (cached) yes checking for mcrypt support... yes configure: error: mcrypt.h not found. Please reinstall libmcrypt. libmcrypt 库没有安装 ,要是不能用 yun 安装的话 编译安装 就要去下载个 gz 包 自己 (编译安装 ./configure make && make install) error7、configure: error: Cannot find ldap.h 办法: yum install php-ldap.x86_64 -y yum install openldap-devel.x86_64 -y error8 、 configure: error: Don’t know how to define struct flock on this system, set –enable-opcache=no 解决方案:(注:修改后记得执行 chmod gu+x 给 /etc/ld.so.conf.d/local.conf 文件添加可执行权限, 否则无效) vim /etc/ld.so.conf.d/local.conf (local.conf 可以随便起名称,以.conf 为后缀就可) 添加 /usr/local/lib (如果是64位系统 路径请写为 /usr/local/lib) :wq 保存 ldconfig -v 生效(或者 ldconfig) error9、error: Cannot find ldap libraries in /usr/lib 这个可能是由于 libldap32和 libldap64冲突: 解决方法:cp -frp /usr/lib64/libldap* /usr/lib/ 有关 nginx 的 if(!-e)问题与解决方法 在配置 URL 重写时,启动 NGINX 出现如下错误提示: [root@localhost nginx]# service nginx restart nginx: [emerg] unknown directive "if(!-e" in /usr/local/nginx/conf/nginx.conf:48 nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
信息发布:广州名易软件有限公司 http://www.myidp.net
|