1.LAMP介紹
? LAM(M)P:
L: linux
A: apache (httpd)
M: mysql, mariadb
M:memcached
P: php, perl, python
? WEB資源類型:
靜態(tài)資源:原始形式與響應(yīng)內(nèi)容一致
動(dòng)態(tài)資源:原始形式通常為程序文件,需要在服務(wù)器端執(zhí)
行之后,將執(zhí)行結(jié)果返回給客戶端
? Web相關(guān)語(yǔ)言
客戶端技術(shù): javascript,html
服務(wù)器端技術(shù):php, jsp,python
LAMP工作原理
![Upload Paste_Image.png failed. Please try again.]
2.CGI
? CGI:Common Gateway Interface
可以讓一個(gè)客戶端,從網(wǎng)頁(yè)瀏覽器通過(guò)http服務(wù)器向執(zhí)行在網(wǎng)絡(luò)服務(wù)器上的程序傳輸數(shù)據(jù);CGI描述了客戶端和服務(wù)器程序之間傳輸?shù)囊环N標(biāo)準(zhǔn)
? 程序=指令+數(shù)據(jù)
指令:代碼文件
數(shù)據(jù):數(shù)據(jù)存儲(chǔ)系統(tǒng)、文件
? 請(qǐng)求流程:
Client -- (httpd) --> httpd -- (cgi) -->
application server (program file) -- (mysql) --> mysql
? php: 腳本編程語(yǔ)言、嵌入到html中的嵌入式web程序語(yǔ)言
基于zend編譯成opcode(二進(jìn)制格式的字節(jié)碼,重復(fù)運(yùn)行,可省略編譯環(huán)境)
3.PHP簡(jiǎn)介
? 官網(wǎng):http://www.php.net/
? PHP是通用服務(wù)器端腳本編程語(yǔ)言,主要用于web開發(fā)實(shí)現(xiàn)動(dòng)態(tài)web頁(yè)面,也是最早實(shí)現(xiàn)將腳本嵌入HTML源碼文檔中的服務(wù)器端腳本語(yǔ)言之一。同時(shí),php還提供了一個(gè)命令行接口,因此,其也可以在大多數(shù)系統(tǒng)上作為一個(gè)獨(dú)立的shell來(lái)使用
PHP的Opcode
? Opcode是一種PHP腳本編譯后的中間語(yǔ)言,類似于Java的ByteCode,或者.NET的MSL。PHP執(zhí)行PHP腳本代碼一般會(huì)經(jīng)過(guò)如下4個(gè)步驟(確切的來(lái)說(shuō),應(yīng)該是PHP的語(yǔ)言引擎Zend)
1、Scanning 詞法分析,將PHP代碼轉(zhuǎn)換為語(yǔ)言片段(Tokens)
2、Parsing 語(yǔ)義分析,將Tokens轉(zhuǎn)換成簡(jiǎn)單而有意義的表達(dá)式
3、Compilation 將表達(dá)式編譯成Opocdes
4、Execution 順次執(zhí)行Opcodes,每次一條,從而實(shí)現(xiàn)PHP腳
本的功能
? 掃描-->分析-->編譯-->執(zhí)行
4.php配置
? php:腳本語(yǔ)言解釋器
? 配置文件:/etc/php.ini, /etc/php.d/*.ini
? 配置文件在php解釋器啟動(dòng)時(shí)被讀取
? 對(duì)配置文件的修改生效方法
Modules:重啟httpd服務(wù)
FastCGI:重啟php-fpm服務(wù)
? /etc/php.ini配置文件格式:
[foo]:Section Header
directive = value
注釋符:較新的版本中,已經(jīng)完全使用;進(jìn)行注釋
#:純粹的注釋信息
;:用于注釋可啟用的directive
? max_execution_time= 30 最長(zhǎng)執(zhí)行時(shí)間30s
? memory_limit 128M 生產(chǎn)不夠,可調(diào)大
? display_errors off 調(diào)試使用,不要打開,否則可能暴露重要信息
? display_startup_errors off 建議關(guān)閉
? post_max_size 8M 最大上傳數(shù)據(jù)大小,生產(chǎn)可能臨時(shí)要調(diào)大,比下面項(xiàng)要大
? upload_max_filesize 2M 最大上傳文件,生產(chǎn)可能要調(diào)大
? max_file_uploads = 20 同時(shí)上傳最多文件數(shù)
? date.timezone =Asia/Shanghai 指定時(shí)區(qū)
? short_open_tag=on 開啟短標(biāo)簽,如<? phpinfo();?>
php.ini的核心配置選項(xiàng)文檔:
http://php.net/manual/zh/ini.core.php
? php.ini配置選項(xiàng)列表:
http://php.net/manual/zh/ini.list.php
? php語(yǔ)言格式
<?php
...php code...
?>
5.php的加速器
? php的加速器:基于PHP的特殊擴(kuò)展機(jī)制如opcode緩存擴(kuò)展也可以將opcode緩存于php的共享內(nèi)存中,從而可以讓同一段代碼的后續(xù)重復(fù)執(zhí)行時(shí)跳過(guò)編譯階段以提高性能。這些加速器并非真正提高了opcode的運(yùn)行速度,而僅是通過(guò)分析opcode后并將它們重新排列以達(dá)到快速執(zhí)行的目的
常見的php加速器有:
? 1、APC (Alternative PHP Cache)
遵循PHP License的開源框架,PHP opcode緩存加速器,目前的版本不適用于PHP 5.4
項(xiàng)目地址http://pecl.php.net/package/APC
2、eAccelerator
源于Turck MMCache,早期的版本包含了一個(gè)PHP encoder和PHP loader,目前encoder已經(jīng)不在支持。項(xiàng)目地址
http://eaccelerator.net/
? 3、XCache
快速而且穩(wěn)定的PHP opcode緩存,經(jīng)過(guò)嚴(yán)格測(cè)試且被大量用于生產(chǎn)環(huán)境。
項(xiàng)目地址:http://xcache.lighttpd.net/,收錄EPEL源
? 4、Zend Optimizer和Zend Guard Loader
Zend Optimizer并非一個(gè)opcode加速器,它是由Zend
Technologies為PHP5.2及以前的版本提供的一個(gè)免費(fèi)、閉源PHP擴(kuò)展,其能夠運(yùn)行由Zend Guard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專為PHP5.3提供的類似于ZendOptimizer功能的擴(kuò)展。
項(xiàng)目地址:http://www.zend.com/en/products/guard/runtime-decoders
? 5、NuSphere PhpExpress
NuSphere的一款開源PHP加速器,它支持裝載通過(guò)NuSpherePHP Encoder編碼的PHP程序文件,并能夠?qū)崿F(xiàn)對(duì)常規(guī)PHP文件的執(zhí)行加速。
項(xiàng)目地址:http://www.nusphere.com/products/phpexpress.htm
6.LAMP
? httpd:接收用戶的web請(qǐng)求;靜態(tài)資源則直接響應(yīng);動(dòng)態(tài)資源為php腳本,對(duì)此類資源的請(qǐng)求將交由php來(lái)運(yùn)行
? php:運(yùn)行php程序
? MariaDB:數(shù)據(jù)管理系統(tǒng)
? http與php結(jié)合的方式
CGI
FastCGI
modules (將php編譯成為httpd的模塊,默認(rèn)方式)
MPM:
prefork: libphp5.so
event, worker: libphp5-zts.so
7.快速部署LAMP
? CentOS 7:
? Modules:httpd, php, php-mysql, mariadb-server
? FastCGI:httpd, php-fpm, php-mysql, mariadbserver
? CentOS 6:
? Modules:httpd, php, php-mysql, mysql-server
? FastCGI:默認(rèn)不支持
? 安裝LAMP
? CentOS 6:
yum install httpd, php, mysql-server, php-mysql
service httpd start
service mysqld start
? CentOS 7:
yum install httpd, php, php-mysql, mariadb-server
systemctl start httpd.service
systemctl start mariadb.service
? 注意:要使用prefork模型
Php代碼
? 格式1
<h1>
<?php echo "Hello world!" ?>
</h1>
? 格式2
<?php
echo "<h1>Hello world!</h1>"
?>
? php測(cè)試代碼
<?php
echo date("Y/m/d");
phpinfo();
?>
Php使用mysql擴(kuò)展連接數(shù)據(jù)庫(kù)
? 使用mysql擴(kuò)展連接數(shù)據(jù)庫(kù)的測(cè)試代碼
<?php
$conn = mysql_connect(‘mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
mysql_close();
?>
Php使用mysqli擴(kuò)展連接數(shù)據(jù)庫(kù)的測(cè)試代碼
<?php
$mysqli=new mysqli("mysqlserver",“username",“password");
if(mysqli_connect_errno()){
echo "連接數(shù)據(jù)庫(kù)失敗!";
$mysqli=null;
exit;
}
echo "連接數(shù)據(jù)庫(kù)成功!";
$mysqli->close();
?>
8.常見LAMP應(yīng)用
? PhpMyAdmin是一個(gè)以PHP為基礎(chǔ),以Web-Base方式架構(gòu)在網(wǎng)站主機(jī)上的MySQL的數(shù)據(jù)庫(kù)管理工具,讓管理者可用Web接口管理MySQL數(shù)據(jù)庫(kù)
? WordPress是一種使用PHP語(yǔ)言開發(fā)的博客平臺(tái),用戶可以在支持PHP和MySQL數(shù)據(jù)庫(kù)的服務(wù)器上架設(shè)屬于自己的網(wǎng)站。也可把WordPress當(dāng)作一個(gè)內(nèi)容管理系統(tǒng)(CMS)來(lái)使用
? PHPWind:2003年發(fā)布了PHPWind的前身版本ofstar,并發(fā)展成為包含BBS、CMS、博客、SNS等一系列程序的通用型建站軟件, 于2008年加入阿里巴巴集團(tuán)
? Crossday Discuz! Board(簡(jiǎn)稱 Discuz!)是一套通用的社區(qū)論壇軟件系統(tǒng)。自2001年6月面世以來(lái),是全球成熟度最高、覆蓋率最大的論壇軟件系統(tǒng)之一。2010年8月23日,與騰訊達(dá)成收購(gòu)協(xié)議
? ECShop是一款B2C獨(dú)立網(wǎng)店系統(tǒng),適合企業(yè)及個(gè)人快速構(gòu)建個(gè)性化網(wǎng)上商店。系統(tǒng)是基于PHP語(yǔ)言及MYSQL數(shù)據(jù)庫(kù)構(gòu)架開發(fā)的跨平臺(tái)開源程序。2006年6月,ECShop推出第一個(gè)版本1.0
布署phpMyadmin
? yum -y install httpd mariadb-server php php-mysql
? systemctl start httpd
? systemctl start mariadb
? mysql_secure_installation
? 下載:https://www.phpmyadmin.net/downloads/
? tar xvf phpMyAdmin-4.0.10.20-all-languages.tar.xz
cd /var/www/html
? cd phpadmin/
? cp config.sample.inc.php config.inc.php
? yum -y install php-mbstring
? systemctl reload httpd
布署wordpress
? 下載地址:
教室:ftp://172.16.0.1/pub/Sources/sources/httpd/
官網(wǎng):https://cn.wordpress.org/
? 解壓縮WordPress博客程序到網(wǎng)頁(yè)站點(diǎn)目錄下
unzip wordpress-4.3.1-zh_CN.zip
? 新建wpdb庫(kù)和wpuser用戶
mysql> create database wpdb;
mysql> grant all privileges on wpdb.* to wpuser@'%'
identified by "wppass";
? 打開http://webserver/wordpress進(jìn)行頁(yè)面安裝
? 注意wordpress目錄權(quán)限
Setfacl –R –m u:apache:rwx wordpress
CentOS7編譯Php-xcache加速訪問(wèn)
? 官網(wǎng):http://xcache.lighttpd.net/wiki/ReleaseArchive
? 安裝方法
rpm包:來(lái)自epel源
編譯安裝
? 編譯安裝
? yum -y install php-devel
? 下載并解壓縮xcache-3.2.0.tar.bz2
? phpize 生成編譯環(huán)境
? cd xcache-3.2.0
? ./configure --enable-xcache --with-phpconfig=/usr/bin/php-config
? make && make install
? cp xcache-3.2.0/xcache.ini /etc/php.d/
? systemctl restart httpd.service
php
? httpd+php結(jié)合的方式:
? module: php
? cgi
? fastcgi : php-fpm
? php-fpm:
? CentOS 6:
PHP-5.3.2之前:默認(rèn)不支持fpm機(jī)制;需要自行打補(bǔ)丁
并編譯安裝
httpd-2.2:默認(rèn)不支持fcgi協(xié)議,需要自行編譯此模塊
解決方案:編譯安裝httpd-2.4, php-5.3.3+
? CentOS 7:
httpd-2.4:rpm包默認(rèn)編譯支持了fcgi模塊
php-fpm包:專用于將php運(yùn)行于fpm模式
配置fastcgi
? php配置
? 配置文件:/etc/php.ini,/etc/php.d/*.ini
? Module下,重啟Httpd服務(wù)
? FastCGI模式下,重啟php-fpm服務(wù)
? 配置文件格式
? 配置文件格式:[foo]:Section Header
Directive=value
? 注釋符: # 純粹的注釋信息
; 用于注釋可啟動(dòng)的指令
在較新的版本中,已經(jīng)完全使用”;”進(jìn)行注釋
? php.ini核心配置的詳細(xì)說(shuō)明:
http://php.net/manual/zh/ini.core.php
? Php.ini配置選項(xiàng)列表:
http://php.net/manual/zh/ini.list.php
? fcgi服務(wù)配置文件:
/etc/php-fpm.conf, /etc/phpfpm.d/*.conf
? 連接池:
pm = static|dynamic
static:固定數(shù)量的子進(jìn)程;pm.max_children
dynamic:子進(jìn)程數(shù)量以動(dòng)態(tài)模式管理
pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests = 500
? 確保運(yùn)行php-fpm進(jìn)程的用戶對(duì)session目錄有讀寫權(quán)限
mkdir /var/lib/php/session
chown apache.apache /var/lib/php/session
? (1) 配置httpd,添加/etc/httpd/conf.d/fcgi.conf配置文件,內(nèi)容類似:
? DirectoryIndex index.php
? ProxyRequests Off
? ProxyPassMatch ^/(.*.php)$
fcgi://127.0.0.1:9000/var/www/html/$1
注意:在HTTPD服務(wù)器上必須啟用proxy_fcgi_module模塊
,充當(dāng)PHP客戶端
? httpd –M |grep fcgi
? cat /etc/httpd/conf.modules.d/00-proxy.conf
? 2) 虛擬主機(jī)配置
vim /etc/httpd/conf.d/vhosts.conf
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>
9.CentOS 7安裝LAMP(PHP-FPM模式)
? 安裝PHP-FPM
首先要卸載PHP
yum install php-fpm
? 查看php-fpm所對(duì)應(yīng)的配置文件
rpm -ql php-fpm
/usr/lib/systemd/system/php-fpm.service
/etc/logrotate.d/php-fpm
/etc/php-fpm.conf
/etc/php-fpm.d
/etc/php-fpm.d/www.conf
/etc/sysconfig/php-fpm
/run/php-fpm
10.CentOS 7安裝LAMP(PHP-FPM模式)
? PHP-FPM常見配置
daemonize = no //是否將程序運(yùn)行在后臺(tái)
listen = 127.0.0.1:9000 //FPM 監(jiān)聽地址
listen.backlog = -1 //等待隊(duì)列的長(zhǎng)度 -1表示無(wú)限制
listen.allowed_clients = 127.0.0.1 //僅允許哪些主機(jī)訪問(wèn)
pm = dynamic //PM是動(dòng)態(tài)運(yùn)行還是靜態(tài)運(yùn)行
//static 固定數(shù)量的子進(jìn)程,pm.max_childen
//dynamic子進(jìn)程數(shù)據(jù)以動(dòng)態(tài)模式管理
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests = 500
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
//設(shè)置session存放位置
? 啟動(dòng)PHP-FPM
systemctl start php-fpm
? 安裝httpd包
yum install httpd
? 查看Httpd mod_fcgi模塊是否加載
httpd -M | grep fcgi
proxy_fcgi_module (shared)
? 添加FCGI的配置文件
DirectoryIndex index.php
ProxyRequests off //是否開啟正向代理
ProxyPassMatch^/(.*.php)$fcgi://127.0.0.1:9000/var/www/html/$1 //開啟FCGI反
向代理
//前面的/相對(duì)于后面的/var/www/html而言,后面的$1是指
前面的/(.*.php)
? 重啟Httpd:systemctl start httpd
11.在centos7上編譯安裝LAMP:
? mairadb:通用二進(jìn)制格式,mariadb-5.5.56
? httpd:編譯安裝,httpd-2.4.25
? php5:編譯安裝,php-5.6.30
? phpMyAdmin:安裝phpMyAdmin-4.4.15.10-all-languages
? Xcache:編譯安裝xcache-3.2.0
? php5.4依賴于mariadb-devel包
? 順序:mariadb-->httpd-->php
? 二進(jìn)制安裝mariadb
? ftp://172.16.0.1/pub/Source/7.x86_64/mariadb/mari
adb-5.5-46-linux-x86_64.tar.gz
? tar xvf mariadb-5.5-46-linux-x86_64.tar.gz -C
/usr/local
? cd /usr/local
? ls -sv mariadb-5.5.46-linux-x86_64 mysql
? cd mysql
? chown -R root.mysql ./*
? mkdir /mydata/data -p
? chown -R mysql.mysql /mydata/data
? mkdir /etc/mysql
? cp support-files/my-large.cnf /etc/mysql/my.cnf
? vim /etc/mysql/my.cnf
[mysqld]加三行
datadir =/mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
? bin/mysqld --help --verbose |less
? scripts/mysql_install_db --user=mysql --
datadir=/mydata/data
? cp support-files/mysql.server /etc/rc.d/init.d/mysqld
? chkconfig --add mysqld
? service mysqld start
? /usr/local/mysql/bin/mysql 測(cè)試是否成功
? vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin/:$PATH
? 編譯安裝httpd-2.4
? yum install pcre-devel apr-devel apr-util-devel
openssl-devel
? ./configure --prefix=/app/httpd24 --
sysconfdir=/etc/httpd24 --enable-so --enable-ssl --
enable-rewrite --with-zlib --with-pcre --withapr=/usr
--with-apr-util=/usr --enable-modules=most
--enable-mpms-shared=all --with-mpm=prefork
? make -j 4 && make install
? 編譯安裝php-5.6
? 相關(guān)包:
libxml2-devel bzip2-devel libmcrypt-devel (epel)
? ./configure --prefix=/app/php --withmysql=/usr/local/mysql
--with-openssl --withmysqli=/usr/local/mysql/bin/mysql_config
--enablembstring
--with-png-dir --with-jpeg-dir --withfreetype-dir
--with-zlib --with-libxml-dir=/usr --
enable-xml --enable-sockets --withapxs2=/app/httpd24/bin/apxs
--with-mcrypt --withconfig-file-path=/etc
--with-config-file-scandir=/etc/php.d
--with-bz2
? make -j 4 && make install
? 編譯安裝php-7.1.7
? ./configure --prefix=/app/php --enable-mysqlnd --
with-mysqli=mysqlnd --with-openssl --with-pdomysql=mysqlnd
--enable-mbstring --with-freetype-dir
--with-jpeg-dir --with-png-dir --with-zlib --withlibxml-dir=/usr
--enable-xml --enable-sockets --
with-apxs2=/app/httpd24/bin/apxs --with-mcrypt --
with-config-file-path=/etc --with-config-file-scandir=/etc/php.d
--enable-maintainer-zts --disablefileinfo
? 注意:php-7.0以上版本使用--enable-mysqlnd --withmysqli=mysqlnd,原--with-mysql不再支持
? 為php提供配置文件
cp php.ini-production /etc/php.ini
? 編輯apache配置文件httpd.conf,以使apache支持php
vim /etc/httpd24/conf/httpd.conf
? 1加二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
? 2 定位至DirectoryIndex index.html
修改為DirectoryIndex index.php index.html
? apachectl restart
12.CentOS6上編譯安裝LAMP
? 在centos6上編譯安裝LAMP:
? mairadb:通用二進(jìn)制格式,mariadb-5.5.56
? httpd:編譯安裝,httpd-2.4.27
? php5:編譯安裝,php-5.6.30
? Wordpress: 安裝wordpress-4.8-zh_CN.tar.gz
? Xcache:編譯安裝xcache-3.2.0
? php5.4依賴于mariadb-devel包
? 實(shí)現(xiàn)順序:mariadb-->httpd-->php
編譯安裝PHP-FPM模式的LAMP
? 編譯httpd和二進(jìn)制安裝mariadb
? 安裝相關(guān)包
bzip2-devel libxml2-devel libmcrypt-devel(epel源)
編譯安裝php
? cd php-5.6.30/
? ./configure --prefix=/app/php5 --withmysql=/usr/local/mysql
--with-openssl --withmysqli=/usr/local/mysql/bin/mysql_config
--enablembstring
--with-freetype-dir --with-jpeg-dir --
with-png-dir --with-zlib --with-libxml-dir=/usr --
enable-xml --enable-sockets --enable-fpm --withmcrypt
--with-config-file-path=/etc/php5 --withconfig-file-scan-dir=/etc/php5.d
--with-bz2
? make -j 4 && make install
編譯安裝PHP-FPM模式的LAMP
? 實(shí)現(xiàn)php的配置文件和服務(wù)腳本
? mkdir /etc/php5 /etc/php5.d/
? cd php-5.6.30/
? cp php.ini-production /etc/php5/php.ini
? cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
? chmod +x /etc/rc.d/init.d/php-fpm
? chkconfig --add php-fpm
? chkconfig --list php-fpm
編輯php配置文件
? cd /app/php5/etc
? cp php-fpm.conf.default php-fpm.conf
? vim /app/php5/etc/php-fpm.conf
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 5 和pm.start_servers一致
pid = /app/php5/var/run/php-fpm.pid
? service php-fpm restart
? 修改httpd24的配置文件
? vim /app/apache24/conf/httpd.conf
說(shuō)明:?jiǎn)⒂胔ttpd的相關(guān)模塊
在Apache httpd 2.4以后已經(jīng)專門有一個(gè)模塊針對(duì)FastCGI
的實(shí)現(xiàn),此模塊為mod_proxy_fcgi.so,它其實(shí)是作為
mod_proxy.so模塊的擴(kuò)充,因此,這兩個(gè)模塊都要加載
去掉下面兩行注釋
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module
modules/mod_proxy_fcgi.so
? 添加如下二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
? 定位至DirectoryIndex index.html
修改為:
DirectoryIndex index.php index.html
? 加下面兩行
ProxyRequests Off 關(guān)閉正向代理
ProxyPassMatch ^/(.*.php)$
fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1
service httpd24 restart
測(cè)試
vim /app/httpd24/htdocs/index.php
如下:
<?php
$link =
mysql_connect('127.0.0.1','root','magedu');
if ($link)
echo "Success...";
else
echo "Failure...";
mysql_close();
phpinfo();
?>