1. 程式人生 > >LAMP架構元件及其安裝搭建

LAMP架構元件及其安裝搭建

1、LAMP

L:Linux,a:apache (httpd),m:mysql,mariadb,p: php,perl,python;
WEB資源型別:
靜態資源:原始形式與響應內容一致;
動態資源:原始形式通常為程式檔案,需要在伺服器端執行之後,將執行結果返回給客戶端;
客戶端技術: javascript;
伺服器端技術:php,jsp;
CGI:Common Gateway Interface;
可以讓一個客戶端,從網頁瀏覽器向執行在網路伺服器上的程式傳輸資料,CGI描述了客戶端和伺服器程式之間傳輸的一種標準;
關係模型:IngreSQL,Oracle,Sybase,Infomix,DB2,SQL Server,MySQL, PostgreSQL,MariaDB。
請求流程:
Client – (httpd) --> httpd – (cgi) --> application server (program file) – (mysql) --> mysql
php: 指令碼程式語言、嵌入到html中的嵌入式web程式開發語言。基於zend編譯成opcode(二進位制格式的位元組碼,重複執行,可省略編譯環節)。
httpd:接收使用者的web請求;靜態資源則直接響應,動態資源為php指令碼,對此類資源的請求將交由php來執行;
php:執行php程式;
MariaDB:資料庫管理系統;
http與php結合的方式:
CGI、FastCGI、modules (把php編譯成為httpd的模組);
MPM:prefork:

libphp5.so;event,worker:libphp5-zts.so

2、PHP

(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效能的改進。
(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。
(3)PHP的Opcode
Opcode是一種PHP指令碼編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP指令碼程式碼一般會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend):
(a) Scanning(Lexing) —— 將PHP程式碼轉換為語言片段(Tokens)
(b) Parsing —— 將Tokens轉換成簡單而有意義的表示式
© Compilation —— 將表示式編譯成Opcodes
(d) Execution —— 順次執行Opcodes,每次一條,從而實現PHP指令碼的功能
順序:掃描–>分析–>編譯–>執行
(4)php的加速器
基於PHP的特殊擴充套件機制如opcode快取擴充套件也可以將opcode緩存於php的共享記憶體中,從而可以讓同一段程式碼的後續重複執行時跳過編譯階段以提高效能。由此也可以看出,這些加速器並非真正提高了opcode的執行速度,而僅是通過分析opcode後並將它們重新排列以達到快速執行的目的。
常見的php加速器有:
(a) APC (Alternative PHP Cache)
遵循PHP License的開源框架,PHP opcode快取加速器,目前的版本不適用於PHP 5.4。專案地址,

http://pecl.php.net/package/APC。
(b) eAccelerator
源於Turck MMCache,早期的版本包含了一個PHP encoder和PHP loader,目前encoder已經不再支援。專案地址, http://eaccelerator.net/。
© XCache
快速而且穩定的PHP opcode快取,經過嚴格測試且被大量用於生產環境。專案地址,http://xcache.lighttpd.net/。
(5)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

(6)NuSphere PhpExpress
NuSphere的一款開源PHP加速器,它支援裝載通過NuSphere PHP Encoder編碼的PHP程式檔案,並能夠實現對常規PHP檔案的執行加速。專案地址:http://www.nusphere.com/products/phpexpress.htm
(7)PHP原始碼目錄結構
PHP的原始碼在結構上非常清晰。其程式碼根目錄中主要包含了一些說明檔案以及設計方案,並提供瞭如下子目錄:
(a) build —— 顧名思義,這裡主要放置一些跟原始碼編譯相關的檔案,比如開始構建之前的buildconf指令碼及一些檢查環境的指令碼等。
(b) ext —— 官方的擴充套件目錄,包括了絕大多數PHP的函式的定義和實現,如array系列,pdo系列,spl系列等函式的實現。 個人開發的擴充套件在測試時也可以放到這個目錄,以方便測試等。
© main —— 這裡存放的就是PHP最為核心的檔案了,是實現PHP的基礎設施,這裡和Zend引擎不一樣,Zend引擎主要實現語言最核心的語言執行環境。
(d) Zend —— Zend引擎的實現目錄,比如指令碼的詞法語法解析,opcode的執行以及擴充套件機制的實現等等。
(e) pear —— PHP 擴充套件與應用倉庫,包含PEAR的核心檔案。
(f) sapi —— 包含了各種伺服器抽象層的程式碼,例如apache的mod_php,cgi,fastcgi以及fpm等等介面。
(g) TSRM —— PHP的執行緒安全是構建在TSRM庫之上的,PHP實現中常見的G巨集通常是對TSRM的封裝,TSRM(Thread Safe Resource Manager)執行緒安全資源管理器。
(h) tests —— PHP的測試指令碼集合,包含PHP各項功能的測試檔案。
(i) win32 —— 這個目錄主要包括Windows平臺相關的一些實現,比如sokcet的實現在Windows下和
Nix平臺就不太一樣,同時也包括了Windows下編譯PHP相關的指令碼。

3、安裝LAMP

CentOS 6:httpd,php,mysql-server,php-mysql;
# service httpd start
# service mysqld start
CentOS 7:
Modules方式程式包:httpd, php, php-mysql, mariadb-server;
FastCGI方式程式包:httpd, php-fpm, php-mysql, mariadb-server;
# systemctl start httpd.service
# systemctl start mariadb.service
MySQL的命令列客戶端程式:mysql
-u,-h,-p;
支援SQL語句對資料管理:
DDL,DML,DCL
DDL: CREATE,ALTER,DROP,SHOW;
DML: INSERT,DELETE,SELECT,UPDATE;
DCL:GRANT,REVOKE;
授權能遠端的連線使用者:
mysql> GRANT ALL PRIVILEGES ON db_name.tbl_name TO [email protected] IDENTIFIED BY 'password';
php測試程式碼:

<?php
	phpinfo();
?>

php連線mysql的測試程式碼:

<?php
	$conn = mysql_connect('172.16.100.67','testuser','testpass');
	if ($conn) 
		echo "OK";
	else
		echo "Failure";
?>	

PHP配置檔案:/etc/php.ini, /etc/php.d/* .ini;
配置檔案在php直譯器啟動時被讀取,因此,對配置檔案的修改如何生效?
Modules:重啟httpd服務;
FastCGI:重啟php-fpm服務;
ini:
[foo]:Section Header;
directive = value;
註釋符:較新的版本中,已經完全使用;進行註釋;
#:純粹的註釋資訊
;:用於註釋可啟用的directive
php.ini的核心配置選項文件: http://php.net/manual/zh/ini.core.php
php.ini配置選項列表:http://php.net/manual/zh/ini.list.php
php-fpm:用於FastCGI方式的httpd與php結合。
CentOS 6:
PHP-5.3.2-:預設不支援fpm機制,需要自行打補丁並編譯安裝;
httpd-2.2:預設不支援fcgi協議,需要自行編譯此模組;
解決方案:編譯安裝httpd-2.4,php-5.3.3+;
CentOS 7:
httpd-2.4:rpm包預設編譯支援了fcgi模組;
php-fpm包:專用於將php運行於fpm模式;
配置檔案:
服務配置檔案:/etc/php-fpm.conf, /etc/php-fpm.d/* .conf
php環境配置檔案:/etc/php.ini, /etc/php.d/* .ini
連線池:
pm = static|dynamic
static:固定數量的子程序,pm.max_children;
dynamic:子程序資料以動態模式管理;
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
;pm.max_requests = 500
建立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>				

4、編譯安裝LAMP

httpd:編譯安裝,httpd-2.4;
php5:編譯安裝,php-5.4;
mairadb:通用二進位制格式,mariadb-5.5;
注意:任何一個程式包被編譯操作依賴到時,需要安裝此程式包的“開發”元件,其包名一般類似於name-devel-VERSION;
CentOS 7:
httpd-2.4:
# yum install pcre-devel apr-devel apr-util-devel openssl-devel
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-rewrite --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 install libxml2-devel libmcrypt-devel
# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-png-dir --with-jpeg-dir --with-freetype-dir --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
# make -j 4 && make install
xcache:
位於epel源中,程式包:php-xcache;
編譯安裝xcache的方法:
# 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/