主页
软件技术
返回
LNMP之nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache编译安装

        可能要用到的软件:

        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 

        


2015年一级建造师《专业工程管理与实务》复习资料(72)
2015年咨询工程师考试:工程咨询评估
安全工程师辅导:煤矿班组管理制度
金沙江鲁地拉水电站对外公路某隧道工程(实施)施工组织设计
沪昆客运专线某隧道(投标)施工组织设计
[四川]公路隧道施工组织设计(新奥法 二次衬砌 药卷锚杆)
工程实施项目的项目管理常用方法
浅谈关于建筑施工中的安全质量和成本控制分析
信息发布:名易软件http://www.myidp.net