|
可能要用到的軟件: 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 系統(tǒng)安裝需求:
centos 6.4 *86_64
mini 安裝 安裝解決依賴關(guān)系: 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 先前分別在兩臺(tái)機(jī)器上編譯過(guò)兩次不同 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 完成后,繼續(xù)下面的操作 cd /usr/local/mysql chown -R mysql:mysql . (為了安全安裝完成后請(qǐng)修改權(quán)限給 root 用戶) scripts/mysql_install_db --user=mysql (先進(jìn)行這一步再做如下權(quán)限 的修改) chown -R root:mysql . (將權(quán)限設(shè)置給 root 用戶,并設(shè)置給 mysql 組, 取消其他用戶的讀寫執(zhí)行權(quán)限,僅留給 mysql "rx"讀執(zhí)行權(quán)限,其他用戶無(wú) 任何權(quán)限) chown -R mysql:mysql ./data (給數(shù)據(jù)庫(kù)存放目錄設(shè)置成 mysql 用戶 mysql 組,并賦予 chmod -R ug+rwx 讀寫執(zhí)行權(quán)限,其他用戶權(quán)限一律刪除 僅給 mysql 用戶權(quán)限) 下面的命令是可選的,將 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 權(quán)限 同時(shí)刪除 其他用戶的寫權(quán)限,僅僅留給 root 和工作組 rx 權(quán)限,其 他一律刪除連 rx 權(quán)限都刪除) #修改 my.cnf 配置 vim /etc/my.cnf #[mysqld] 添加: datadir=/data/mysql default-storage-engine=MyISAM 啟動(dòng) mysql: [c-sharp]view plaincopy bin/mysqld_safe --user=mysql & #啟動(dòng) mysql,看是否成功 netstat -tnl|grep 3306
[c-sharp]view plaincopy ?? bin/mysqld_safe --user=mysql & ?? #啟動(dòng) mysql,看是否成功 ?? netstat -tnl|grep 3306 上面是一種啟動(dòng) mysql 的方法,還有一種簡(jiǎn)單的方便,如下: [c-sharp]view plaincopy #將 mysql 的啟動(dòng)服務(wù)添加到系統(tǒng)服務(wù)中 cp support-files/mysql.server /etc/init.d/mysql #現(xiàn)在可以使用下面的命令啟動(dòng) mysql service mysql start #停止 mysql 服務(wù) service mysql stop #重啟 mysql 服務(wù) service mysql restart 將 mysql 服務(wù)添加到開(kāi)機(jī)啟動(dòng)項(xiàng),讓 mysql 服務(wù)開(kāi)機(jī)啟動(dòng) [c-sharp]view plaincopy chkconfig --add mysql 修改默認(rèn) root 賬戶密碼,默認(rèn)密碼為空 修改密碼 cd 切換到 mysql 所在目錄 cd /usr/local/mysql #./bin/mysqladmin -u root password 回車在接下來(lái)的提示中設(shè)置新密碼即可。。 #啟動(dòng) MySQL /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf & #或者 /etc/init.d/mysql start (service mysql start) #測(cè)試 MySQL 是否啟動(dòng) # 1)查看是否有進(jìn)程 mysql ps -ef | grep mysql # 2)查看端口是否運(yùn)行 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 時(shí)請(qǐng)去掉 --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 線上服務(wù)器可以加入以下命令關(guān)閉調(diào)試模式: --disable-debug php5.5.11 后 無(wú) 法 識(shí) 別 的 廢 舊 編 譯 選 項(xiàng) ( 如 果 提 示 WRING 警 告 無(wú) 法 識(shí) 別 --with-curlwrappers 無(wú)視即可): --with-curlwrappers 使用 NGINX 處理請(qǐng)去掉下面一行,下面一行僅在 APACHE 下使用 --with-apxs2=/usr/local/apache2/bin/apxs 使用 NGINX 可以加入下面兩行指定 FPM 運(yùn)行賬戶權(quán)限: --with-fpm-user=www --with-fpm-group=www PHP 編譯選項(xiàng)說(shuō)明: """ 安裝路徑 """ --prefix=/usr/local/php """ php.ini 配置文件路徑 """ --with-config-file-path=/etc """ 優(yōu)化選項(xiàng) """ --enable-inline-optimization --disable-debug --disable-rpath --enable-shared """ 啟用 opcache,默認(rèn)為 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 """ 國(guó)際化與字符編碼支持 """ --with-gettext --enable-mbstring --with-iconv
""" 加密擴(kuò)展 """ --with-mcrypt --with-mhash --with-openssl """ 數(shù)學(xué)擴(kuò)展 """ --enable-bcmath """ Web 服務(wù),依賴 libxml """ --enable-soap --with-libxml-dir """ 進(jìn)程控制 """ --enable-pcntl --enable-shmop --enable-sysvsem """ socket & curl """ --enable-sockets --with-curl """ 壓縮與歸檔 """ --with-zlib --enable-zip --with-bz2 """ GNU Readline 命令行快捷鍵綁定 """ --with-readline """ 禁用 SQLite 支持?jǐn)U展 """ --without-sqlite3 --without-pdo-sqlite """ 更多 PHP 擴(kuò)展與應(yīng)用庫(kù) """ --with-pear 在 Linux 下安裝 PHP,源代碼方式安裝 需要配置很多參數(shù)。這里列出常用配置參數(shù),并詳細(xì)用中文解釋說(shuō)明了。給大家一些參考 編譯 PHP 的時(shí)候慎用 –with-curlwrappers 參數(shù) ./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 安裝目錄,對(duì) mysql 的支持 mysqli 文件目錄,優(yōu)化支持 打開(kāi)安全模式 --enable-ftp 打開(kāi) 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
打開(kāi)對(duì) zip 的支持 打開(kāi)對(duì) bz2文件的支持 打開(kāi)對(duì) jpeg 圖片的支持 打開(kāi)對(duì) png 圖片的支持 打開(kāi)對(duì) freetype 字體庫(kù)的支持 關(guān)閉 iconv 函數(shù),種字符集間的轉(zhuǎn)換 打開(kāi) libxml2庫(kù)的支持 打開(kāi) xml-rpc 的 c 語(yǔ)言 打開(kāi) zlib 庫(kù)的支持 打開(kāi) gd 庫(kù)的支持 支持 TrueType 字符串函數(shù)庫(kù) 打開(kāi) curl 瀏覽工具的支持 運(yùn)用 curl 工具打開(kāi) url 流 打開(kāi) freetype1.*的支持,可以不加了 打開(kāi) XSLT 文件支持,擴(kuò)展了 libXML2庫(kù) ,需要 libxslt 打開(kāi) gnu 的 gettext 支持,編碼庫(kù)用到 打開(kāi) pear 命令的支持,PHP 擴(kuò)展用的 打開(kāi)日歷擴(kuò)展功能 多字節(jié),字符串的支持 打開(kāi)圖片大小調(diào)整,用到 zabbix 監(jiān)控的時(shí)候用到了這個(gè)模塊 打開(kāi) sockets 支持 圖片的元數(shù)據(jù)支持 魔術(shù)引用的支持 關(guān)閉額外的運(yùn)行庫(kù)文件 關(guān)閉調(diào)試模式 --with-mime-magic=/usr/share/file/magic.mime --enable-opcache //PHP5.5X+新增代碼加速功能 CGI 方式安裝才用的參數(shù) 魔術(shù)頭文件位置 --enable-fpm --enable-fastCGI --enable-force-CGI-redirect --with-ncurses --enable-pcntl mhash 和 mcrypt 算法的擴(kuò)展 --with-mcrypt --with-mhash --with-gmp --enable-inline-optimization --with-openssl 打上 PHP-fpm 補(bǔ)丁后才有這個(gè)參數(shù),CGI 方式安裝的啟動(dòng)程序 支持 fastcgi 方式啟動(dòng) PHP 同上 ,幫助里沒(méi)有解釋 支持 ncurses 屏幕繪制以及基于文本終端的圖形互動(dòng)功能的動(dòng)態(tài)庫(kù) freeTDS 需要用到的,可能是鏈接 mssql 才用到 算法 算法 openssl 的支持,加密傳輸時(shí)用到的
--enable-dbase --with-pcre-dir=/usr/local/bin/pcre-config --disable-dmalloc perl 的正則庫(kù)案安裝位置 --with-gdbm --enable-sigchild --enable-sysvsem --enable-sysvshm --enable-zend-multibyte dba 的 gdbm 支持 支持 zend 的多字節(jié) --enable-mbregex --enable-wddx --enable-shmop --enable-soap 準(zhǔn)備 PHP 的配置文件 1# cd /home/down/php-5.5.11 2# cp php.ini-production /usr/local/php/etc/php.ini 準(zhǔn)備 php_fpm 的配置文件 # cd /usr/local/php/etc/ # cp php-fpm.conf.defaultphp-fpm.conf # vim php-fpm.conf 修改 php-fpm.conf 配置文件 內(nèi)容去掉如下前面的分號(hào),并根據(jù)實(shí)際硬件配置進(jìn)行更改,這里僅做簡(jiǎn)單配置,下面會(huì)有 PHP-FPM 的詳細(xì)的 優(yōu)化配置講解 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 啟動(dòng) php (需要注意的是啟動(dòng)配置文件需要給用戶組+rx 權(quán)限尤其要添加到服務(wù)器項(xiàng)的+x 權(quán)限,否 則會(huì)因沒(méi)有可執(zhí)行權(quán)限而產(chǎn)生的異常錯(cuò)誤) Php-fpm 代碼 php5.5X+版本提供了 php-fpm 的管理工具,可以很方便的 start,stop,restart Php-fpm 代碼 // 個(gè)人習(xí)慣把 php 相關(guān)命令丟在這 #cd /usr/local/php/sbin/ // 在安裝文件中復(fù)制該文件 #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 啟動(dòng)方式: 測(cè)試 php/php-fpm 是否安裝成功: #測(cè)試 php-fpm 配置(實(shí)際路徑根據(jù)自己 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 出現(xiàn)類似如下提示證明測(cè)試通過(guò),PHP/php-fpm 安裝成功 [18-Apr-2014 23:20:15] NOTICE: configuration file /usr/local/php/etc/php-fpm.conf test is successful ( 一 點(diǎn) 小 插 曲 : 第 一 次 測(cè) 試 時(shí) 啟 動(dòng) 時(shí) 出 現(xiàn) 如 下 錯(cuò) 誤 , vim /usr/local/php/etc/php-fpm.conf 打開(kāi)找到第52行發(fā)現(xiàn)52行的修改注釋忘記 加注釋符號(hào)分號(hào)“;”了,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) #啟動(dòng) 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 #關(guān)閉 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 腳本,并將其添加至服務(wù)列表 致使開(kāi)機(jī)自 動(dòng)啟動(dòng) # 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 進(jìn)行 啟動(dòng)| 停止|重啟操作 php-fpm 了
php-fpm.conf 重要參數(shù)詳解 pid = run/php-fpm.pid #pid 設(shè)置,默認(rèn)在安裝目錄中的 var/run/php-fpm.pid,建議開(kāi)啟 error_log = log/php-fpm.log #錯(cuò)誤日志,默認(rèn)在安裝目錄中的 var/log/php-fpm.log log_level = notice #錯(cuò)誤級(jí)別. 可用級(jí)別為: alert(必須立即處理), error(錯(cuò)誤情況), warning (警告情況), notice(一般重要信息), debug(調(diào)試信息). 默認(rèn): notice. emergency_restart_threshold = 60 emergency_restart_interval = 60s #表示在 emergency_restart_interval 所設(shè)值內(nèi)出現(xiàn) SIGSEGV 或者 SIGBUS 錯(cuò)誤 的 php-cgi 進(jìn)程數(shù)如果超過(guò) emergency_restart_threshold 個(gè),php-fpm 就會(huì)優(yōu) 雅重啟。這兩個(gè)選項(xiàng)一般保持默認(rèn)值。 process_control_timeout = 0 #設(shè)置子進(jìn)程接受主進(jìn)程復(fù)用信號(hào)的超時(shí)時(shí)間. 可用單位: s(秒), m(分), h(小 時(shí)), 或者 d(天) 默認(rèn)單位: s(秒). 默認(rèn)值: 0. daemonize =yes #后臺(tái)執(zhí)行 fpm,默認(rèn)值為 yes,如果為了調(diào)試可以改為 no。在 FPM 中,可以使用 不同的設(shè)置來(lái)運(yùn)行多個(gè)進(jìn)程池。 這些設(shè)置可以針對(duì)每個(gè)進(jìn)程池單獨(dú)設(shè)置。 listen = 127.0.0.1:9000 #fpm 監(jiān)聽(tīng)端口,即 nginx 中 php 處理的地址,一般默認(rèn)值即可??捎酶袷綖? 'ip:port', 'port', '/path/to/unix/socket'. 每個(gè)進(jìn)程池都需要設(shè)置. listen.backlog = -1 #backlog 數(shù),-1表示無(wú)限制,由操作系統(tǒng)決定,此行注釋掉就行。backlog 含義 參考:http://www.3gyou.cc/?p=41 listen.allowed_clients = 127.0.0.1
#允許訪問(wèn) FastCGI 進(jìn)程的 IP,設(shè)置 any 為不限制 IP,如果要設(shè)置其他主機(jī)的 nginx 也能訪問(wèn)這臺(tái) FPM 進(jìn)程,listen 處要設(shè)置成本地可被訪問(wèn)的 IP。默認(rèn)值 是 any。每個(gè)地址是用逗號(hào)分隔. 如果沒(méi)有設(shè)置或者為空,則允許任何服務(wù)器請(qǐng) 求連接 listen.owner = www listen.group = www listen.mode = 0666 #unix socket 設(shè)置選項(xiàng),如果使用 tcp 方式訪問(wèn),這里注釋即可。 user = www group = www #啟動(dòng)進(jìn)程的帳戶和組 pm = dynamic#對(duì)于專用服務(wù)器,pm 可以設(shè)置為 static。 # 如 何 控 制 子 進(jìn) 程 , 選 項(xiàng) 有 static 和 dynamic 。 如 果 選 擇 static , 則 由 pm.max_children 指定固定的子進(jìn)程數(shù)。如果選擇 dynamic,則由下開(kāi)參數(shù)決定: pm.max_children#,子進(jìn)程最大數(shù) pm.start_servers#,啟動(dòng)時(shí)的進(jìn)程數(shù) pm.min_spare_servers#,保證空閑進(jìn)程數(shù)最小值,如果空閑進(jìn)程小于此值,則 創(chuàng)建新的子進(jìn)程 pm.max_spare_servers#,保證空閑進(jìn)程數(shù)最大值,如果空閑進(jìn)程大于此值,此 進(jìn)行清理 pm.max_requests = 1000 #設(shè)置每個(gè)子進(jìn)程重生之前服務(wù)的請(qǐng)求數(shù). 對(duì)于可能存在內(nèi)存泄漏的第三方模塊 來(lái)說(shuō)是非常有用的. 如果設(shè)置為 '0' 則 一 直 接 受 請(qǐng) 求 . 等 同 于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認(rèn)值: 0. pm.status_path =/status #FPM 狀態(tài)頁(yè)面的網(wǎng)址. 如果沒(méi)有設(shè)置, 則無(wú)法訪問(wèn)狀態(tài)頁(yè)面. 默認(rèn)值: none. munin 監(jiān)控會(huì)使用到 ping.path =/ping
#FPM 監(jiān)控頁(yè)面的 ping 網(wǎng)址. 如果沒(méi)有設(shè)置, 則無(wú)法訪問(wèn) ping 頁(yè)面. 該頁(yè)面用 于外部檢測(cè) FPM 是否存活并且可以響應(yīng)請(qǐng)求. 請(qǐng)注意必須以斜線開(kāi)頭 (/)。 ping.response = pong #用于定義 ping 請(qǐng)求的返回相應(yīng). 返回為 HTTP 200 的 text/plain 格式文本. 默認(rèn)值: pong. request_terminate_timeout = 0 # 設(shè) 置 單 個(gè) 請(qǐng) 求 的 超 時(shí) 中 止 時(shí) 間 . 該 選 項(xiàng) 可 能 會(huì) 對(duì) php.ini 設(shè) 置 中 的 'max_execution_time'因?yàn)槟承┨厥庠驔](méi)有中止運(yùn)行的腳本有用. 設(shè)置為 '0' 表示 'Off'.當(dāng)經(jīng)常出現(xiàn)502錯(cuò)誤時(shí)可以嘗試更改此選項(xiàng)。 request_slowlog_timeout = 10s #當(dāng)一個(gè)請(qǐng)求該設(shè)置的超時(shí)時(shí)間后,就會(huì)將對(duì)應(yīng)的 PHP 調(diào)用堆棧信息完整寫入到 慢日志中. 設(shè)置為 '0' 表示 'Off' slowlog = log/$pool.log.slow #慢請(qǐng)求的記錄日志,配合 request_slowlog_timeout 使用 rlimit_files = 1024 #設(shè)置文件打開(kāi)描述符的 rlimit 限制. 默認(rèn)值: 系統(tǒng)定義值默認(rèn)可打開(kāi)句柄是 1024,可使用 ulimit -n 查看,ulimit -n 2048修改。 rlimit_core = 0 #設(shè)置核心 rlimit 最大限制值. 可用值: 'unlimited' 、0或者正整數(shù). 默認(rèn)值: 系統(tǒng)定義值. chroot = #啟動(dòng)時(shí)的 Chroot 目錄. 所定義的目錄需要是絕對(duì)路徑. 如果沒(méi)有設(shè)置, 則 chroot 不被使用. chdir = #設(shè)置啟動(dòng)目錄,啟動(dòng)時(shí)會(huì)自動(dòng) Chdir 到該目錄. 所定義的目錄需要是絕對(duì)路徑. 默認(rèn)值: 當(dāng)前目錄,或者/目錄(chroot 時(shí)) catch_workers_output =yes #重定向運(yùn)行過(guò)程中的 stdout 和 stderr 到主要的錯(cuò)誤日志文件中. 如果沒(méi)有設(shè)
置, stdout 和 stderr 將會(huì)根據(jù) FastCGI 的規(guī)則被重定向到 /dev/null . 默認(rèn) 值: 空. PHP-FPM 常見(jiàn)錯(cuò)誤及解決辦法整理 如果 file_get_contents 請(qǐng)求的遠(yuǎn)程資源如果反應(yīng)過(guò)慢,file_get_contents 就 會(huì)一直卡在那里不會(huì)超時(shí)。我們知道 php.ini 里面 max_execution_time 可以設(shè) 置 PHP 腳本的最大執(zhí)行時(shí)間,但是,在 php-cgi(php-fpm) 中,該參數(shù)不會(huì)起 效。真正能夠控制 PHP 腳本最大執(zhí)行時(shí)間的是 php-fpm.conf 配置文件中的 request_terminate_timeout 參數(shù)。 request_terminate_timeout 默認(rèn)值為 0 秒,也就是說(shuō),PHP 腳本會(huì)一直執(zhí)行 下去。這樣,當(dāng)所有的 php-cgi 進(jìn)程都卡在 file_get_contents() 函數(shù)時(shí),這 臺(tái) Nginx+PHP 的 WebServer 已經(jīng)無(wú)法再處理新的 PHP 請(qǐng)求了,Nginx 將給用 戶返回“502 Bad Gateway”。修改該參數(shù),設(shè)置一個(gè) PHP 腳本最大執(zhí)行時(shí)間是 必要的,但是,治標(biāo)不治本。例如改成 30s,如果發(fā)生 file_get_contents() 獲 取網(wǎng)頁(yè)內(nèi)容較慢的情況,這就意味著 150 個(gè) php-cgi 進(jìn)程,每秒鐘只能處理 5 個(gè) 請(qǐng) 求 , WebServer 同 樣 很 難 避 免 ”502 Bad Gateway” 。 解 決 辦 法 是 request_terminate_timeout 設(shè) 置 為 10s 或 者 一 個(gè) 合 理 的 值 , 或 者 給 file_get_contents 加一個(gè)超時(shí)參數(shù)。 $ctx= stream_context_create(array( 'http'=>array( ) 'timeout'=> 10 //設(shè)置一個(gè)超時(shí)時(shí)間,單位為秒 )); file_get_contents($str, 0,$ctx); max_requests 參數(shù)配置不當(dāng),可能會(huì)引起間歇性502錯(cuò)誤: pm.max_requests = 1000 設(shè)置每個(gè)子進(jìn)程重生之前服務(wù)的請(qǐng)求數(shù). 對(duì)于可能存在內(nèi)存泄漏的第三方模塊 來(lái) 說(shuō) 是 非 常 有 用 的 . 如 果 設(shè) 置 為 ’0′ 則 一 直 接 受 請(qǐng) 求 . 等 同 于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認(rèn)值: 0. 這段配置的意思是,當(dāng)一個(gè) PHP-CGI 進(jìn)程處理的請(qǐng)求數(shù)累積到 500 個(gè)后,自動(dòng)
重啟該進(jìn)程。 但是為什么要重啟進(jìn)程呢? 一般在項(xiàng)目中,我們多多少少都會(huì)用到一些 PHP 的第三方庫(kù),這些第三方庫(kù)經(jīng) 常存在內(nèi)存泄漏問(wèn)題,如果不定期重啟 PHP-CGI 進(jìn)程,勢(shì)必造成內(nèi)存使用量不 斷增長(zhǎng)。因此 PHP-FPM 作為 PHP-CGI 的管理器,提供了這么一項(xiàng)監(jiān)控功能,對(duì) 請(qǐng)求達(dá)到指定次數(shù)的 PHP-CGI 進(jìn)程進(jìn)行重啟,保證內(nèi)存使用量不增長(zhǎng)。 正是因?yàn)檫@個(gè)機(jī)制,在高并發(fā)的站點(diǎn)中,經(jīng)常導(dǎo)致 502 錯(cuò)誤,我猜測(cè)原因是 PHP-FPM 對(duì)從 NGINX 過(guò)來(lái)的請(qǐng)求隊(duì)列沒(méi)處理好。不過(guò)我目前用的還是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否還存在這個(gè)問(wèn)題。 目前我們的解決方法是,把這個(gè)值盡量設(shè)置大些,盡可能減少 PHP-CGI 重新 SPAWN 的次數(shù),同時(shí)也能提高總體性能。在我們自己實(shí)際的生產(chǎn)環(huán)境中發(fā)現(xiàn),內(nèi) 存泄漏并不明顯,因此我們將這個(gè)值設(shè)置得非常大(204800)。大家要根據(jù)自己 的實(shí)際情況設(shè)置這個(gè)值,不能盲目地加大。 話說(shuō)回來(lái),這套機(jī)制目的只為保證 PHP-CGI 不過(guò)分地占用內(nèi)存,為何不通過(guò)檢 測(cè)內(nèi)存的方式來(lái)處理呢?我非常認(rèn)同高春輝所說(shuō)的,通過(guò)設(shè)置進(jìn)程的峰值內(nèi)在占 用量來(lái)重啟 PHP-CGI 進(jìn)程,會(huì)是更好的一個(gè)解決方案。 3,php-fpm 的慢日志,debug 及異常排查神器: request_slowlog_timeout 設(shè)置一個(gè)超時(shí)的參數(shù),slowlog 設(shè)置慢日志的存放位 置 1 tail-f/var/log/www.slow.log 上面的命令即可看到執(zhí)行過(guò)慢的 php 過(guò)程。 大家可以看到經(jīng)常出現(xiàn)的網(wǎng)絡(luò)讀取超過(guò)、Mysql 查詢過(guò)慢的問(wèn)題,根據(jù)提示信息 再排查問(wèn)題就有很明確的方向了。 php-fpm 優(yōu)化 1、php-fpm 優(yōu)化參數(shù)介紹 他們分別是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、 pm.max_spare_servers。 pm:表示使用那種方式,有兩個(gè)值可以選擇,就是 static(靜態(tài))或者 dynamic (動(dòng)態(tài))。 在更老一些的版本中,dynamic 被稱作 apache-like。這個(gè)要注意看配置文件的
說(shuō)明。 下面4個(gè)參數(shù)的意思分別為: pm.max_children:靜態(tài)方式下開(kāi)啟的 php-fpm 進(jìn)程數(shù)量 pm.start_servers:動(dòng)態(tài)方式下的起始 php-fpm 進(jìn)程數(shù)量 pm.min_spare_servers:動(dòng)態(tài)方式下的最小 php-fpm 進(jìn)程數(shù) pm.max_spare_servers:動(dòng)態(tài)方式下的最大 php-fpm 進(jìn)程數(shù)量 區(qū)別: 如果 dm 設(shè)置為 static,那么其實(shí)只有 pm.max_children 這個(gè)參數(shù)生效。 系統(tǒng)會(huì)開(kāi)啟設(shè)置數(shù)量的 php-fpm 進(jìn)程。 如果 dm 設(shè)置為 dynamic,那么 pm.max_children 參數(shù)失效,后面3個(gè)參數(shù)生效。 系統(tǒng)會(huì)在 php-fpm 運(yùn)行開(kāi)始 的時(shí)候啟動(dòng) pm.start_servers 個(gè) php-fpm 進(jìn)程, 然后根據(jù)系統(tǒng)的需求動(dòng)態(tài)在 pm.min_spare_servers 和 pm.max_spare_servers 之間調(diào)整 php-fpm 進(jìn)程數(shù) 2、服務(wù)器具體配置 對(duì)于我們的服務(wù)器,選擇哪種執(zhí)行方式比較好呢?事實(shí)上,跟 Apache 一樣,運(yùn) 行的 PHP 程序在執(zhí)行完成后,或多或少會(huì)有內(nèi)存泄露的問(wèn)題。 這也是為什么開(kāi)始的時(shí)候一個(gè) php-fpm 進(jìn)程只占用3M 左右內(nèi)存,運(yùn)行一段時(shí)間 后就會(huì)上升到20-30M 的原因了。 對(duì)于內(nèi)存大的服務(wù)器(比如8G 以上)來(lái)說(shuō),指定靜態(tài)的 max_children 實(shí)際上更 為妥當(dāng),因?yàn)檫@樣不需要進(jìn)行額外的進(jìn)程數(shù)目控制,會(huì)提高效率。 因?yàn)轭l繁開(kāi)關(guān) php-fpm 進(jìn)程也會(huì)有時(shí)滯,所以內(nèi)存夠大的情況下開(kāi)靜態(tài)效果會(huì)更 好。數(shù)量也可以根據(jù) 內(nèi)存/30M 得到,比如8GB 內(nèi)存可以設(shè)置為100, 那么 php-fpm 耗費(fèi)的內(nèi)存就能控制在 2G-3G 的樣子。如果內(nèi)存稍微小點(diǎn),比如 1G,那么指定靜態(tài)的進(jìn)程數(shù)量更加有利于服務(wù)器的穩(wěn)定。 這樣可以保證 php-fpm 只獲取夠用的內(nèi)存,將不多的內(nèi)存分配給其他應(yīng)用去使 用,會(huì)使系統(tǒng)的運(yùn)行更加暢通。 對(duì)于小內(nèi)存的服務(wù)器來(lái)說(shuō),比如256M 內(nèi)存的 VPS,即使按照一個(gè)20M 的內(nèi)存量來(lái) 算,10個(gè) php-cgi 進(jìn)程就將耗掉200M 內(nèi)存,那系統(tǒng)的崩潰就應(yīng)該很正常了。 因此應(yīng)該盡量地控制 php-fpm 進(jìn)程的數(shù)量,大體明確其他應(yīng)用占用的內(nèi)存后,給 它指定一個(gè)靜態(tài)的小數(shù)量,會(huì)讓系統(tǒng)更加平穩(wěn)一些?;蛘呤褂脛?dòng)態(tài)方式, 因?yàn)閯?dòng)態(tài)方式會(huì)結(jié)束掉多余的進(jìn)程,可以回收釋放一些內(nèi)存,所以推薦在內(nèi)存較 少的服務(wù)器或 VPS 上使用。具體最大數(shù)量根據(jù) 內(nèi)存/20M 得到。 比 如 說(shuō) 512M 的 VPS , 建 議 pm.max_spare_servers 設(shè) 置 為 20 。 至 于 pm.min_spare_servers,則建議根據(jù)服務(wù)器的負(fù)載情況來(lái)設(shè)置,比如服務(wù)器上只 是部署 php 環(huán)境的話,比較合適的值在5~10之間。
本服務(wù)器配置 1、服務(wù)器基本信息: 硬盤:數(shù)據(jù)盤30G、系統(tǒng)盤20G 內(nèi)存:1.5G CPU:雙核 系統(tǒng):CentOS 6.3 64位 帶寬:獨(dú)享2M 2、部署的應(yīng)用 Git、SVN、Apache、Tomcat、PHP、Nginx、Mysql、JDK 3、優(yōu)化后的參數(shù) 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 結(jié)果顯示: 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
啟動(dòng) nginx cd /usr/local/nginx/sbin 目錄下面 輸入 ./nginx 啟動(dòng) nginx 檢查是否啟動(dòng)成功 ie 瀏覽器中輸入 http://192.168.15.132 (切換成自己的 IP 地址即可) 停止 nginx pkill -9 nginx 將 NGINX 添加為系統(tǒng)服務(wù): 1、編寫腳本,名為 nginx vim /etc/init.d/nginx chmod 755 /etc/init.d/nginx chkconfig --add nginx chkconfig nginx on 更換 NGINX 啟動(dòng)方式 測(cè)試是否成功 service nginx start service nginx stop service nginx restart 啟動(dòng) 停止 重啟 /etc/init.d/nginx 的內(nèi)容如下: #!/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 說(shuō)明:nginx 默認(rèn)頁(yè)面路徑已經(jīng)更改為了/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; } 添加默認(rèn)默認(rèn)頁(yè)面 index index.php index.htmlindex.htm; 編輯 fastcgi_params 文件,如果為空或不存在該文件則創(chuàng)建并添加如下內(nèi)容,如 果已有內(nèi)容則忽略如下步驟 vim /usr/local/nginx/conf/fastcgi_params --如果為空把原有內(nèi)容更改如下, 不為空則忽略: 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; // 這一句如果默認(rèn)配置文件里沒(méi)有請(qǐng)手動(dòng)添加進(jìn)去,否則更改站點(diǎn)目錄后 PHP 訪問(wèn) 會(huì)出現(xiàn) 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 默認(rèn)站點(diǎn)目錄 vim /usr/local/nginx/conf/nginx.conf (實(shí)際配置文件安裝路徑)注意替換下面的紅色部位,具體 NGINX 優(yōu)化安全設(shè)置,以后將單獨(dú)寫文章做設(shè)置,敬請(qǐng)期待 將其中的 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 頁(yè)面內(nèi)容 vim /home/var/www/index.php <?php phpinfo(); ?> http://127.0.0.1/ 瀏覽器打開(kāi) 驗(yàn)證是否 整合 NGINX+PHP-FPM 整合成功 則出現(xiàn) PHPINFO 頁(yè)面信息。。。 安裝 MEMCACHE,和 OPCACHE 擴(kuò)展 (因?yàn)?php5.5X+版本已經(jīng)內(nèi)置了 memcache 和 opcache 擴(kuò)展,所以不必另行下載, 即可采用以下方式進(jìn)行編譯) 1.memcache 如果需要為 php 增加 memcache 擴(kuò)展,按如下方法進(jìn)行:
cd /usr/local/php/bin ./pecl install memcache 安裝時(shí)會(huì)提示是否開(kāi)啟 session 支持,根據(jù)需要輸入 no 或者 yes,安裝后路徑 如下: /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/memcache. so 需要手動(dòng)配置到 php.ini 中,增加如下內(nèi)容,即表示啟用 memcache 擴(kuò)展: extension=memcache.so 保存后,重啟 Apache,查看 http://192.168.36.24/test.php 進(jìn)行驗(yàn)證。 2.Zend OPCache 為了提高 php 運(yùn)行速度,可以啟用 Zend OPCache,啟用方法很簡(jiǎn)單,安照上面 的方法安裝 php,則已經(jīng)在 /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 然后打開(kāi)并配置相應(yīng)的配置項(xiàng)即可,比如: 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 進(jìn)行驗(yàn)證。會(huì)看 到如下信息:
with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies PHP 安裝中出現(xiàn)的常見(jiàn)問(wèn)題及錯(cuò)誤解決方法見(jiàn)下方: 出現(xiàn)如下錯(cuò)誤 php 安裝出錯(cuò):configure: error: mcrypt.h not found. Please reinstall libmcrypt.,意思是,沒(méi)有查找到 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 的時(shí)候出現(xiàn)下面錯(cuò)誤而退出 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. (看提示就明白 是一個(gè) lib 庫(kù)沒(méi)裝 先用 yum search 名字 看是否能搜到名 字 ,找到名字后 把軟件包 開(kāi)發(fā)包裝上) 解決辦法 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 沒(méi)裝 解決辦法 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軟件包沒(méi)有安裝 解決辦法 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 庫(kù)文件沒(méi)有安裝 解決辦法 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 庫(kù)沒(méi)有安裝 解決辦法 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 庫(kù)沒(méi)有安裝 ,要是不能用 yun 安裝的話 編譯安裝 就要去下載個(gè) 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 解決方案:(注:修改后記得執(zhí)行 chmod gu+x 給 /etc/ld.so.conf.d/local.conf 文件添加可執(zhí)行權(quán)限, 否則無(wú)效) vim /etc/ld.so.conf.d/local.conf (local.conf 可以隨便起名稱,以.conf 為后綴就可) 添加 /usr/local/lib (如果是64位系統(tǒng) 路徑請(qǐng)寫為 /usr/local/lib) :wq 保存 ldconfig -v 生效(或者 ldconfig) error9、error: Cannot find ldap libraries in /usr/lib 這個(gè)可能是由于 libldap32和 libldap64沖突: 解決方法:cp -frp /usr/lib64/libldap* /usr/lib/ 有關(guān) nginx 的 if(!-e)問(wèn)題與解決方法 在配置 URL 重寫時(shí),啟動(dòng) NGINX 出現(xiàn)如下錯(cuò)誤提示: [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
信息發(fā)布:廣州名易軟件有限公司 http://m.jetlc.com
|