要用到的軟件:
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.4.21.tar.gz
nginx-1.4.6.tar.gz
系統安裝需求:
centos 6.4 *86_64 mini安裝
1 安裝解決依賴關係:
yum install -y wget gcc gcc-c++ autoconf libjpeg libjpeg-devel perl perl* perl-CPAN libpng libpng-devel freetype freetype-devel lib2 lib2-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 lib2-devel ntpdate cmake gd* gd2 ImageMagick-devel jpeg jpeg* pcre-dev* fontconfig libpng lib2 zip unzip gzip
yum install libxml2 libxml2-develphp
2 下載全部使用到的軟件:
wget http://ftp.gnu.org/gnu/libiconv/libiconv-1.13.tar.gz
wget http://lcmp.googlecode.com/files/libmcrypt-2.5.8.tar.gz
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 http://vps.googlecode.com/files/PDO_MYSQL-1.0.2.tgz
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 http://mynginx.googlecode.com/files/ImageMagick.tar.gz
wget https://lnamp-web-server.googlecode.com/files/eaccelerator-eaccelerator-42067ac.tar.gz
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_INNO_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用戶)
s/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-lib-dir /
--enable- /
--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-rpc /
--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 服務,依賴 lib """
--enable-soap /
--with-lib-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 php 安裝目錄
--with-apxs2=/usr/local/apache/bin/apxs 表示使用apache2.0以上版本,apxs表示使用的apache1.0版本
--with-config-file-path=/usr/local/PHP/etc 指定php.ini位置
--with-MySQL=/usr/local/mysql mysql安裝目錄,對mysql的支持
--with-MySQLi=/usr/local/mysql/bin/mysql_config mysqli文件目錄,優化支持
--enable-safe-mode 打開安全模式
--enable-ftp 打開ftp的支持
--enable-zip 打開對zip的支持
--with-bz2 打開對bz2文件的支持
--with-jpeg-dir 打開對jpeg圖片的支持
--with-png-dir 打開對png圖片的支持
--with-freetype-dir 打開對freetype字體庫的支持
--without-iconv 關閉iconv函數,種字符集間的轉換
--with-lib-dir 打開lib2庫的支持
--with-rpc 打開-rpc的c語言
--with-zlib-dir 打開zlib庫的支持
--with-gd 打開gd庫的支持
--enable-gd-native-ttf 支持TrueType字符串函數庫
--with-curl 打開curl瀏覽工具的支持
--with-curlwrappers 運用curl工具打開url流
--with-ttf 打開freetype1.*的支持,能夠不加了
--with-xsl 打開XSLT 文件支持,擴展了lib2庫 ,須要libxslt軟件
--with-gettext 打開gnu 的gettext 支持,編碼庫用到
--with-pear 打開pear命令的支持,PHP擴展用的
--enable-calendar 打開日曆擴展功能
--enable-mbstring 多字節,字符串的支持
--enable-bcmath 打開圖片大小調整,用到zabbix監控的時候用到了這個模塊
--enable-sockets 打開 sockets 支持
--enable-exif 圖片的元數據支持
--enable-magic-quotes 魔術引用的支持
--disable-rpath 關閉額外的運行庫文件
--disable-debug 關閉調試模式
--with-mime-magic=/usr/share/file/magic.mime 魔術頭文件位置
--enable-opcache //PHP5.5X+新增代碼加速功能
CGI方式安裝才用的參數
--enable-fpm 打上PHP-fpm 補丁後纔有這個參數,CGI方式安裝的啓動程序
--enable-fastCGI 支持fastcgi方式啓動PHP
--enable-force-CGI-redirect 同上 ,幫助裏沒有解釋
--with-ncurses 支持ncurses 屏幕繪製以及基於文本終端的圖形互動功能的動態庫
--enable-pcntl freeTDS須要用到的,多是連接mssql 纔用到
mhash和mcrypt算法的擴展
--with-mcrypt 算法
--with-mhash 算法
--with-gmp
--enable-inline-optimization
--with-openssl openssl的支持,加密傳輸時用到的
--enable-d
--with-pcre-dir=/usr/local/bin/pcre-config perl的正則庫案安裝位置
--disable-dmalloc
--with-gdbm dba的gdbm支持
--enable-sigchild
--enable-sysvsem
--enable-sysvshm
--enable-zend-multibyte 支持zend的多字節
--enable-mbregex
--enable-wddx
--enable-shmop
--enable-soap
準備PHP的配置文件
1
2
# cd /home/down/php-5.5.11
# cp php.ini-production /usr/local/php/etc/php.ini
準備php_fpm的配置文件
1
2
3
4
# 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腳本,並將其添加至服務列表 導致開機自動啓動
1
2
3
4
5
6
# 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加一個超時參數。
1
2
3
4
5
6
7
$ctx = stream_context_create(array(
'http'=>array(
'timeout'=> 10 //設置一個超時時間,單位爲秒
)
));
file_get_contents($str, 0,$ctx);
錨點2,max_requests參數配置不當,可能會引發間歇性502錯誤:
1
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優化
錨點一、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進程數
錨點二、服務器具體配置
對於咱們的服務器,選擇哪一種執行方式比較好呢?事實上,跟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之間。
錨點本服務器配置 錨點一、服務器基本信息:
硬盤:數據盤30G、系統盤20G
內存:1.5G
CPU:雙核
系統:CentOS 6.3 64位
帶寬:獨享2M
錨點二、部署的應用
Git、SVN、Apache、Tomcat、PHP、Nginx、Mysql、JDK
錨點三、優化後的參數
1
2
3
4
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
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添加爲系統服務:
一、編寫腳本,名爲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 starts and stops the nginxdaemon
#
# chkconfig: - 8515
# deion: Nginx is an HTTP(S) server, HTTP(S) reverse/
# proxy and IMAP/POP3 proxy server
# processname: nginx
#config: /etc/nginx/nginx.conf
#config: /etc/sysconfig/nginx
#pidfile: /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=$(name $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-reload|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 _FILENAME /s$fastcgi__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 _FILENAME $document_root$fastcgi__name; //這一句若是默認配置文件裏沒有請手動添加進去,不然更改站點目錄後PHP訪問會出現not found
fastcgi_param _NAME $fastcgi__name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param 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 html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param _FILENAME /$fastcgi__name;
include fastcgi_params;
}
改成
location ~ /.php$ {
root /home/var/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param _FILENAME $document_root$fastcgi__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-20121212/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 2-config path...
configure: error: 2-config not found. Please check your lib2 installation.
(看提示就明白 是一個lib庫沒裝 先用 yum search 名字 看是否能搜到名字 ,找到名字後 把軟件包 開發包裝上)
解決辦法
yum install lib2-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)
error七、configure: error: Cannot find ldap.h
辦法:
yum install php-ldap.x86_64 -y
yum install openldap-devel.x86_64 -y
error八、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)
error九、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
一,nginx的url重寫問題
vim /usr/local/nginx/conf/nginx.conf
if (!-e $request_filename){
//此處旋轉url重寫的規則
}
重起時,老師報如上紅色部分錯誤。。
二,解決方法
緣由是這樣的:if和(之間必須有個空格。(小插曲,還好我有谷歌,百度就是坑,全市灌水SEO垃圾站,仍是國外的網站靠譜,若是你遇到問題,儘可能用谷歌翻譯成英文到國外網站上去找答案,一找一個準~)
因爲時間關係 PHP和NGINX安裝後的詳細配置部分暫時省略,後期添加,敬請期待
html
實例php-apache:mysql
./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-config-file-path=/usr/local/php/etc \
--enable-pdo \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-lib-dir \
--enable- \
--enable-opcache \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--with-curlwrappers \
--enable-mbregex \
--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-rpc \
--enable-zip \
--enable-soap \
--enable-session \
--with-gettext \
--enable-shared \
--enable-ftp \
--enable-exif \
--with-pear \
--with-bz2 \
--with-readline \nginx