CentOS 6: # yum -y install httpd php php-mysql mysql-serverjavascript
CentOS 7: # yum -y install httpd php php-mysql mariadb-serverphp
httpd 2.4 支持php-fpm # yum -y install httpd php-fpm php-mysql mariadb-servercss
CentOS 6:
PHP-5.3.2-:默認不支持fpm機制;須要自行打補丁並編譯安裝
httpd-2.2:默認不支持fcgi協議,須要自行編譯此模塊
解決方案:編譯安裝httpd-2.4, php-5.3.3+html
CentOS 7:
httpd-2.4:rpm包默認編譯支持了fcgi模塊;
php-fpm包:專用於將php運行於fpm模式;java
PHP配置文件:
服務配置文件(配置PHP服務進程):/etc/php-fpm.conf, /etc/php-fpm.d/*.conf
php環境配置文件:/etc/php.ini, /etc/php.d/*.ini
/etc/php-fpm.conf
`include=/etc/php-fpm.d/*.conf`python
[global]
pid = /run/php-fpm/php-fpm.ipd
error_log = /var/log/php-fpm/error.log
log_level = notice
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0
daemonize = no 運行前臺用於測試mysql
`/etc/php-fpm.d/www.conf`
[www]
listen = 127.0.0.1:9000 若單獨主機,監聽與外部httpd主機通訊的地址
;listen.backlog = -1 後援隊列,-1無限制,鏈接池滿了的時候,等待隊列的長度
listen.allowed_clients = 127.0.0.1 容許哪一個httpd的地址發起請求linux
鏈接池:
pm = static|dynamic
static:ftpm固定數量的子進程;
pm.max_children;最大併發鏈接數
dynamic:子進程數據以動態模式管理
pm.start_servers:開始啓動進程數
pm.min_spare_servers:最少空間進程數
pm.max_spare_servers:最多空間進程數
;pm.max_requests = 500:每一個進程最大請求鏈接數
;pm.status_path = /status
;ping.path = /ping
;php_admin_value[error_log] = off程序員
# httpd -M | grep fcgi
# cd /etc/httpd/conf.modules.d/
# vim 00-proxy.conf
fcgi
# cd ..
# vim conf/htpd.conf
# vim conf.d/fcgi.confweb
建立session目錄,並確保運行php-fpm進程的用戶對此目錄有讀寫權限
# mkdir /var/lib/php/session
# chown apache.apache /var/lib/php/session
(1)配置httpd,添加/etc/httpd/conf.d/fcgi.conf配置文件,內容相似:
中心主機配置:
DirectoryIndex index.php
ProxyRequests Off 是否開啓反向代理,在這裏反向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1 #經過匹配
(2) 虛擬主機配置
DirectoryIndex index.php
<VirtualHost *:80>
ServerName www.b.net
DocumentRoot /apps/vhosts/b.net
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/apps/vhosts/b.net/$1
<Directory "/apps/vhosts/b.net">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
編譯安裝lamp:
httpd:編譯安裝,httpd-2.4
mairadb:通用二進制格式,mariadb-5.5
php5:編譯安裝,php-5.4
注意:任何一個程序包被編譯操做依賴到時,須要安裝此程序包的「開發」組件,其包名通常相似於name-devel-VERSION;
CentOS 7:
# yum -y install "Development Tools" "Server Platform Development"
Mariadb:
# useradd -r mysql
# tar xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local
# cd /usr/local
# ln -sv mariadb-5.5.46-linux-x86_64 mysql
# cd mysql
# chown -R root.mysql ./*
# mkdir /mydata/data
# chown -R mysql.mysql /mydata/data
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
# vim /etc/mysql/my.cnf
datadir = /mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
# cp /support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# bin/mysqld_safe --help --verbose | less
# scripts/mysql_install_db --user=mysql datadir=/mydata/data
# mysql_secure_installation
# service mysqld start
# ss -ltn
# /usr/local/mysql/bin/mysql
# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
# . /etc/profile.d/mysql.sh
導出庫文件
# vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
# ldconfig OS重載庫
# ldconfig -p
httpd-2.4:
# yum -y install pcre-devel apr-devel apr-util-devel openssl-devel
#./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 \
--enable-so --enable-ssl --enable-rewrite(url重寫) \
--with-zlib --with-pcre --with-apr=/usr --with-apr-util=/usr \
--enable-modules=most --enable-mpms-shared=all \
--with-mpm=prefork
# make -j 4 && make install
php-5.4:
# yum -y install libxml2-devel libmcrypt-devel
# ./configure --prefix=/usr/local/php \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--enable-mbstring(多字節字符) --with-png-dir --with-jpeg-dir \
--with-freetype-dir(字體) --with-openssl --with-zlib \
--with-libxml-dir=/usr --enable-xml --enable-sockets \
--with-apxs2=/usr/local/apache24/bin/apxs --with-mcrypt(加密庫) \
--with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
--enable-maintainer-zts (線程模式work,event)
# make -j 4 && make install
# cp php.ini-production /etc/php.ini
# cd /etc/httpd24
# cp httpd.conf{,.backup}
# vim /etc/httpd24/httpd.conf
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html
# apachectl stop
# apachectl start
# vim /usr/local/apache24/htdocs/index.php
<?Php echo phpinfo(); ?>
xcache
epel源中
程序包:php-xcache
編譯安裝xache的方法:
# yum install php-devel
# cd xcache-3.2.0
# phpize
# ./configure --enable-xcache --with-php-config=/usr/bin/php-config
# make && make install
# cp xcache.ini /etc/php.d/
ab命令:遠程測試
Concurrency Level: 200
Requests per second:555.55 [#/sec] (mean) 每秒完成多少個請求
Time per request: 360.005 [ ms ] 併發完成時間
Time per request: 1.800 [ ms ] 每一個請求完成時間
Transfer rate:帶寬*8 = 實際帶寬
Connect: C<---鏈接---->S
Processing: 服務器上處理IO
Waiting: 響應給客戶端
Total: 總計時間
Connection(tcp三次握手,創建鏈接):時間太長,網絡帶寬有限,服務器繁忙(併發高)
服務器構建報文(服務器慢,腳本慢)
服務器響應報文(帶寬有限,客戶端接受能力有限)
博客做業一:CentOS 7, lamp (module);
(1) 三者分離於兩臺主機;
(2) 一個虛擬主機用於提供phpMyAdmin;另外一個虛擬主機用於提供wordpress;
(3) xcache
(4) 爲phpMyAdmin提供https虛擬主機;
博客做業二:CentOS 7, lamp (php-fpm);
(1) 三者分離於三臺主機;
(2) 一個虛擬主機用於提供phpMyAdmin;另外一個虛擬主機用於提供wordpress;
(3) xcache
博客做業三:CentOS 6, lamp (編譯安裝,模塊或php-fpm);
(1) 三者分離於兩臺或三臺主機;
(2) 一個虛擬主機用於提供phpMyAdmin;另外一個虛擬主機用於提供wordpress;
(3) xcache
(4) 嘗試mpm爲非prefork機制;
# openssl rand -base64 20
1. LAMP介紹
LAMP=Linux+Apache(httpd)+MySQL(MairaDB)+PHP(Python)
1.1 Web資源類型
靜態資源:原始形式與相應內容一致(html,css,js,jpg,gif,png等文件)
動態資源:原始形式經過爲程序文件,須要在服務器端執行以後結果返回給客戶端(php,jsp,asp等)
客戶端技術:javascript
服務器端技術:php, jsp, python
MIME協議支持的資源: application/x-http-php
1.2 CGI
CGI: Command Cateway Interface,通用網管接口(協議)
做用:可讓一個客戶端,從網頁瀏覽器向執行在網絡服務器上的程序輸出數據;CGI描述了客戶端和服務器程序之間傳輸的一種標準。
程序是指令和數據的集合。
指令是代碼文件,數據是數據存儲系統或文件。
數據模型:
關係模型:IngreSQL,Oracle,Sybase,Infomix,DB2,SQL Server,MySQL, PostgreSQL,MariaDB
請求流程:
靜態資源:Client瀏覽器經過http協議無狀態鏈接請求資源,服務器端監聽的httpd服務接受請求並I/O讀寫請求文件並響應給客戶端。
動態資源:Client瀏覽器經過http協議無狀態鏈接請求資源,服務器端監聽的httpd服務接受請求資源,其資源請求類型爲PHP資源時,經過httpd的php模塊請求I/O並把結果返回給httpd服務,最終httpd服務響應給客戶端。
動態資源:Client瀏覽器經過http協議無狀態鏈接請求資源,服務器端監聽的httpd服務接受請求資源,其資源請求類型爲PHP資源時,經過httpd的php模塊處理請求,其處理過程有數據請求時經過PHP的數據庫服務接口鏈接數據庫服務器並處理結果返回給PHP處理陳旭,PHP處理程序結果返回給httpd服務,最終httpd服務響應給客戶端。
1.3 PHP
服務器腳本編程語言、嵌入到html中的嵌入式web程序開發語言;基於zend編譯成opcode(二進制格式的字節碼,重複運行,可省略編譯環境)
1.3.1 PHP簡介
PHP是通用**服務器端腳本編程語言**,其主要用於web開發以實現動態web頁面,它也是最先實現將腳本嵌入HTML源碼文檔中的服務器端腳本語言之一。同時,php還提供了一個命令行接口,所以,其也能夠在大多數系統上做爲一個獨立的shell來使用。
Rasmus Lerdorf於1994年開始開發PHP,它是初是一組被Rasmus Lerdorf稱做「Personal Home Page Tool」 的Perl腳本, 這些腳本能夠用於顯示做者的簡歷並記錄用戶對其網站的訪問。後來,Rasmus Lerdorf使用C語言將這些Perl腳本重寫爲CGI程序,還爲其增長了運行Web forms的能力以及與數據庫交互的特性,並將其重命名爲「Personal Home Page/Forms Interpreter」或「PHP/FI」。此時,PHP/FI已經能夠用於開發簡單的動態web程序了,這便是PHP 1.0。1995年6月,Rasmus Lerdorf把它的PHP發佈於comp.infosystems.www.authoring.cgi Usenet討論組,今後PHP開始走進人們的視野。1997年,其2.0版本發佈。
1997年,兩名以色列程序員Zeev Suraski和Andi Gutmans重寫的PHP的分析器(parser)成爲PHP發展到3.0的基礎,並且今後將PHP重命名爲PHP: Hypertext Preprocessor。此後,這兩名程序員開始重寫整個PHP核心,並於1999年發佈了Zend Engine 1.0,這也意味着PHP 4.0的誕生。2004年7月,Zend Engine 2.0發佈,由此也將PHP帶入了PHP 5時代。PHP5包含了許多重要的新特性,如加強的面向對象編程的支持、支持PDO(PHP Data Objects)擴展機制以及一系列對PHP性能的改進。
1.3.2 PHP Zend Engine
Zend Engine是開源的、PHP腳本語言的解釋器,它最先是由以色列理工學院(Technion)的學生Andi Gutmans和Zeev Suraski所開發,Zend也正是此二人名字的合稱。後來兩人聯合創立了Zend Technologies公司。
Zend Engine 1.0於1999年隨PHP 4發佈,由C語言開發且通過高度優化,並可以作爲PHP的後端模塊使用。Zend Engine爲PHP提供了內存和資源管理的功能以及其它的一些標準服務,其高性能、可靠性和可擴展性在促進PHP成爲一種流行的語言方面發揮了重要做用。
Zend Engine的出現將PHP代碼的處理過程分紅了兩個階段:首先是分析PHP代碼並將其轉換爲稱做Zend opcode的二進制格式(相似Java的字節碼),並將其存儲於內存中;第二階段是使用Zend Engine去執行這些轉換後的Opcode。
1.3.3 PHP的Opcode
Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼通常會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend):
1.Scanning(Lexing) —— 將PHP代碼轉換爲語言片斷(Tokens)
2.Parsing —— 將Tokens轉換成簡單而有意義的表達式
3.Compilation —— 將表達式編譯成Opocdes
4.Execution —— 順次執行Opcodes,每次一條,從而實現PHP腳本的功能
掃描 -> 分析 -> 編譯 -> 執行
1.3.4 php的加速器
基於PHP的特殊擴展機制如opcode緩存擴展也能夠將opcode緩存於php的共享內存中,從而可讓同一段代碼的後續重複執行時跳過編譯階段以提升性能。由此也能夠看出,這些加速器並不是真正提升了opcode的運行速度,而僅是經過分析opcode後並將它們從新排列以達到快速執行的目的。
常見的php加速器有
APC (Alternative PHP Cache)
遵循PHP License的開源框架,PHP opcode緩存加速器,目前的版本不適用於PHP 5.4。項目地址,http://pecl.php.net/package/APC。
eAccelerator
源於Turck MMCache,早期的版本包含了一個PHP encoder和PHP loader,目前encoder已經不在支持。項目地址, http://eaccelerator.net/。
XCache
快速並且穩定的PHP opcode緩存,通過嚴格測試且被大量用於生產環境。項目地址,http://xcache.lighttpd.net/
Zend Optimizer和Zend Guard Loader
Zend Optimizer並不是一個opcode加速器,它是由Zend Technologies爲PHP5.2及之前的版本提供的一個免費、閉源的PHP擴展,其可以運行由Zend Guard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專爲PHP5.3提供的相似於Zend Optimizer功能的擴展。項目地址,http://www.zend.com/en/products/guard/runtime-decoders
NuSphere PhpExpress
NuSphere的一款開源PHP加速器,它支持裝載經過NuSphere PHP Encoder編碼的PHP程序文件,並可以實現對常規PHP文件的執行加速。項目地址,http://www.nusphere.com/products/phpexpress.htm
1.3.5 PHP源碼目錄結構
PHP的源碼在結構上很是清晰。其代碼根目錄中主要包含了一些說明文件以及設計方案,並提供了以下子目錄:
一、build —— 顧名思義,這裏主要放置一些跟源碼編譯相關的文件,好比開始構建以前的buildconf腳本及一些檢查環境的腳本等。
二、ext —— 官方的擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現。 我的開發的擴展在測試時也能夠放到這個目錄,以方便測試等。
三、main —— 這裏存放的就是PHP最爲核心的文件了,是實現PHP的基礎設施,這裏和Zend引擎不同,Zend引擎主要實現語言最核心的語言運行環境。
四、Zend —— Zend引擎的實現目錄,好比腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。
五、pear —— PHP 擴展與應用倉庫,包含PEAR的核心文件。
六、sapi —— 包含了各類服務器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
七、TSRM —— PHP的線程安全是構建在TSRM庫之上的,PHP實現中常見的*G宏一般是對TSRM的封裝,TSRM(Thread Safe Resource Manager)線程安全資源管理器。
八、tests —— PHP的測試腳本集合,包含PHP各項功能的測試文件。
九、win32 —— 這個目錄主要包括Windows平臺相關的一些實現,好比sokcet的實如今Windows下和*Nix平臺就不太同樣,同時也包括了Windows下編譯PHP相關的腳本。
http與php結合的方式:
1.4 sendfile()
在內核空間中直接打包數據響應
Event事件驅動
用戶空間:經過系統調用,請求獲取資源文,繼續執行其餘進程。
內核空間:獲取資源文件,通知進程資源裝載至內存,用戶空間進程收到信息,則複製內存數據到用戶空間內存空間當中。若是沒有收到系統空間通知,則再此發送通知,直到用戶空間收到通知爲止。
複製內存數據過程是阻塞IO(進程參與)
1.5 阻塞IO
異步IO(Asynchronization IO)
1.調用請求
2.IO執行過程,把內核空間的內存數據複製到用戶空間進程內存數據
非阻塞IO:
事件驅動機制:
Linux:epoll()
事件驅動:
水平觸發(屢次通知)
邊緣觸發(一次通知)
1.6 PHP腳本語言解釋器
配置文件`:/etc/php.ini, /etc/php.d/*.ini`
配置文件在php解釋器啓動時被讀取,所以,對配置文件的修改如何生效?
ini:
[foo]:Section Header
directive = value
註釋符:較新的版本中,已經徹底使用;進行註釋;
#:純粹的註釋信息
;:用於註釋可啓用的directive
data.timezone=Asia/Shanghai
php.ini的核心配置選項文檔: http://php.net/manual/zh/ini.core.php
php.ini配置選項列表:http://php.net/manual/zh/ini.list.php