1、何爲LAMPphp
Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一組經常使用來搭建動態網站或者服務器的開源軟件,自己都是各自獨立的程序,可是由於常被放在一塊兒使用,擁有了愈來愈高的兼容度,共同組成了一個強大的Web應用程序平臺。隨着開源潮流的蓬勃發展,開放源代碼的LAMP已經與J2EE和.Net商業軟件造成三足鼎立之勢,而且該軟件開發的項目在軟件方面的投資成本較低,所以受到整個IT界的關注。從網站的流量上來講,70%以上的訪問流量是LAMP來提供的,LAMP是最強大的網站解決方案html
2、軟件組合mysql
Linuxlinux
Linux 是免費開源軟件,這意味着源代碼可用的操做系統。正則表達式
Apachesql
Apache 是使用中最受歡迎的一個開放源碼的WEB服務器軟件。數據庫
MySQLapache
MySQL 是多線程、多用戶的SQL數據庫管理系統。編程
MySQL 已由Oracle公司自 2010 年 1 月 27 日經過SUN購買。SUN 最初於 2008 年 2 月 26 日收購 MySQL。vim
MariaDB
MariaDB由MySQL的創始人Michael Widenius(英語:Michael Widenius)主導開發。MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL受權許可 MariaDB的目的是徹底兼容MySQL,包括API和命令行,使之能輕鬆成爲MySQL的代替品。因爲不滿MySQL被Oracle收購後的日漸封閉與緩慢的更新,衆多Linux發行版逐漸拋棄了這我的氣開源數據庫,而轉向了MariaDB。其中Centos 7默認已經採用MariaDB。互聯網中維基百科,互聯網巨頭谷歌紛紛放棄MySQL轉向MariaDB。
PHP
PHP 是一種編程語言最初設計生產動態網站。PHP 是主要用於服務器端的應用程序軟件。
3、編譯安裝Apache
[root@localhost ~]# yum groupinstall -y "Development Tools" "Server Platform Development" #經過「包組」提供開發工具(make, gcc等)及開發環境(開發庫,頭文件,標準庫等)
因爲httpd-2.4須要依賴於apr-1.4和apr-util-1.4以上的版本,因此咱們先編譯安裝此兩個源碼。apr全稱apache portable runtime(Apache可移植運行庫)。主要爲上層的應用程序提供一個能夠跨越多操做系統平臺使用的底層支持接口庫。
[root@localhost ~]# tar xf apr-1.5.2.tar.bz2 [root@localhost ~]# cd apr-1.5.2 [root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr [root@localhost apr-1.5.2]# make -j 4 && make install
apr-1.5.2下載地址:http://mirrors.aliyun.com/apache/apr/apr-1.5.2.tar.bz2
[root@localhost ~]# tar xf apr-util-1.5.4.tar.bz2 [root@localhost ~]# cd apr-util-1.5.4 [root@localhost apr-util]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr [root@localhost apr-util]# make -j 4 && make install
apr-util-1.5.4下載地址:http://mirrors.aliyun.com/apache/apr/apr-util-1.5.4.tar.bz2
因爲httpd-2.4.16編譯過程依賴於pcre-devel軟件包,須要事先安裝。此軟件包系統光盤自帶,所以,能夠直接掛載光盤使用yum安裝。
[root@localhost ~]# yum install -y pcre-devel [root@localhost ~]# tar xf httpd-2.4.16.tar.bz2 [root@localhost ~]# cd httpd-2.4.16 [root@localhost httpd-2.4.16]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/ local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event #--prefix:安裝目錄,--sysconfdir:配置文件目錄,--enable-so:支持模塊化機制,--enable-ssl:啓動ssl #--enable-cgi:啓動cgi,--enable-rewrite:支持url從新,--with-zlib:支持傳送壓縮,--with-pcre:支持正則表達式 #--with-apr:指明apr安裝路徑,--with-apr-util:指明apr-util安裝路徑,--enable-modules:指明啓用的模塊 #--enable-mpms-shared:把全部支持的MPM都編譯進來,--with-mpm:默認使用的MPM [root@localhost httpd-2.4.16]# make -j 4 && make install
httpd-2.4.16下載地址:http://mirrors.aliyun.com/apache/httpd/httpd-2.4.16.tar.bz2
爲了後期管理方便,咱們這裏爲編譯安裝的httpd-2.4提供一個管理腳本,能夠複製經過yum源安裝的httpd-2.2的配置文件進行修改。
[root@localhost ~]# cd /etc/rc.d/init.d/ [root@localhost init.d]# cp httpd httpd24 [root@localhost init.d]# vim httpd24 apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} pidfile=${PIDFILE-/var/run/httpd/httpdi24.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd24} [root@localhost init.d]# chkconfig --add httpd24 #把httpd2.4設置爲系統服務 [root@localhost init.d]# vim /etc/profile.d/httpd24.sh export PATH=/usr/local/apache/bin:$PATH [root@localhost init.d]# . /etc/profile.d/httpd24.sh #把剛編譯好的httpd2.4的腳本運行命令添加到環境變量中 [root@localhost init.d]# httpd -t Syntax OK [root@localhost init.d]# /etc/init.d/httpd24 start Starting httpd: [ OK ] [root@localhost init.d]# ss -anl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 :::80 :::* #查看80端口已經處於監聽狀態
4、編譯安裝Mariadb
[root@wlw ~]# mkdir -pv /mariadb/data [root@wlw ~]# chown -R mysql:mysql /mariadb/data/ #建立mariadb存放數據的位置 [root@wlw /]# groupadd -r mysql [root@wlw /]# useradd -g mysql -r -s /sbin/nologin -M -d /mariadb/data mysql #爲mariadb新建用戶以安全方式運行進程 [root@wlw ~]# tar xf mariadb-5.5.42.tar.gz -C /usr/local/ root@wlw ~]# cd /usr/local/ [root@wlw local]# ln -sv mariadb-5.5.42 mysql `mysql' -> `mariadb-5.5.42' [root@wlw local]# cd mysql/ [root@wlw mysql]# chown -R root:mysql ./* [root@wlw mysql]# scripts/mysql_install_db --user=mysql --datadir=/mariadb/data #--user:運行mariadb的用戶名,--datadir:制定數據存放位置,因爲數據庫數據較大,通常單獨分區存放(LVM) [root@wlw mysql]# mkdir /etc/mysql [root@wlw mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf #爲mariadb提供主配置文件,存放在/etc/mysql中 [root@wlw mysql]# vim /etc/mysql/my.cnf thread_concurrency = 2 datadir = /mariadb/data #thread_concurrency:的值建議爲你的CPU個數乘以2,datadir:數據庫存放位置
Mariadb下載地址:http://archive.mariadb.org//mariadb-5.5.43/bintar-linux-x86_64/mariadb-5.5.43-linux-x86_64.tar.gz
爲了後期管理方便,咱們這裏一樣爲mariadb提供服務腳本,這裏mariadb中已經爲咱們提供好了,存放在 support-files/mysql.server 中
[root@wlw mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@wlw mysql]# chkconfig --add mysqld [root@wlw mysql]# /etc/init.d/mysqld start Starting MySQL.. [肯定] [root@wlw mysql]# ss -tnl LISTEN 0 50 *:3306 *:* [root@wlw mysql]# ./bin/mysql_secure_installation #按照配置完成後建議對mariadb進行安全初始化,爲root提供密碼和刪除匿名用戶,使用mariadb默認提供的腳本
爲了使mariadb的安裝符合系統使用規範,並將其開發組件導出給系統使用,這裏還須要進行以下步驟
[root@wlw mysql]# vim /etc/man.config MANPATH /usr/local/mysql/man #輸出mysql的man手冊至man命令的查找路徑 [root@wlw mysql]# ln -sv /usr/local/mysql/include /usr/include/mysql #輸出mysql的頭文件至系統頭文件路徑/usr/include [root@wlw mysql]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf #輸出mysql的庫文件給系統庫查找路徑 [root@wlw mysql]# ldconfig #讓系統從新載入系統庫 [root@localhost init.d]# vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH [root@localhost init.d]# . /etc/profile.d/mysql.sh #把剛編譯好的mysql的腳本運行命令添加到環境變量中
5、編譯安裝PHP
[root@wlw ~]# yum -y groupinstall "Desktop Platform Development" [root@wlw ~]# yum -y install bzip2-devel libmcrypt-devel libxml2-devel #解決php編譯依賴關係,bzip2-devel在光盤中有提供,libmcrypt-devel在epel源中 [root@wlw ~]# tar xf php-5.4.40.tar.bz2 [root@wlw ~]# cd php-5.4.40 [root@wlw php-5.4.40]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with- openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts #--prefix:默認安裝路徑,--with-mysql:指定mysql安裝路徑,--with-openssl:支持openssl,--with-mysqli:指定mysqli安裝目錄 #--enable-mbstring:開啓多字節字符串的支持,支持中文必須開啓,--with-zlib:支持壓縮庫,--enable-xml:支持處理xml文檔 #--with-apxs2:把php編譯成apache的模塊,--with-mcrypt:開啓加解密,--enable-maintainer-zts:這裏爲了支持apache的worker或event這兩個MPM,編譯成zts模塊 [root@wlw php-5.4.40]# make -j 4 && make install [root@wlw php-5.4.40]# cp php.ini-production /etc/php.ini #爲php提供配置文件 [root@wulewei ~]# vim /etc/httpd24/httpd.conf LoadModule php5_module modules/libphp5.so #編譯php過程當中自動添加的php模塊(支持zts功能) AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps #讓.php結尾的文件都識別爲application/x-httpd-php-source的MINE類型,這種類型須要調用php模塊處理 DirectoryIndex index.php index.html #添加index.php到首頁次序中 [root@wulewei ~]# /etc/init.d/httpd24 reload #修改完配置文件後讓httpd重讀配置文件,讓配置生效 [root@wulewei ~]# vim /usr/local/apache/htdocs/index.php <?php $link = mysql_connect('127.0.0.1','root','wlwsldya'); if ($link) echo "<p align='center'>Success...</p>"; else echo "Failure..."; mysql_close(); phpinfo(); ?>
能夠看到LAMP已經整合完畢,httpd已經能夠運行php。
六、編譯安裝xcache,爲php加速
XCache:快速並且穩定的PHP opcode緩存,通過嚴格測試且被大量用於生產環境。
PHP的Opcode:Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼通常會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend):
四個步驟爲:掃描-->分析-->編譯-->執行
一、Scanning(Lexing) —— 將PHP代碼轉換爲語言片斷(Tokens)
二、Parsing —— 將Tokens轉換成簡單而有意義的表達式
三、Compilation —— 將表達式編譯成Opocdes
四、Execution —— 順次執行Opcodes,每次一條,從而實現PHP腳本的功能
php的加速器
基於PHP的特殊擴展機制如opcode緩存擴展也能夠將opcode緩存於php的共享內存中,從而可讓同一段代碼的後續重複執行時跳過編譯階段以提升性能。由此也能夠看出,這些加速器並不是真正提升了opcode的運行速度,而僅是經過分析opcode後並將它們從新排列以達到快速執行的目的。通常能塊三倍左右!
[root@wlw ~]# tar xf xcache-3.2.0.tar.bz2 [root@wlw ~]# cd xcache-3.2.0 [root@wlw xcache-3.2.0]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 #讀取當前配置生成configure文件 [root@wlw xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config #--with-php-config:編譯成php的擴展 [root@wlw xcache-3.2.0]# make && make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/ #編譯安裝完成後會顯示模塊的安裝路徑
整合php和xcache
[root@wlw xcache-3.2.0]# mkdir /etc/php.d [root@wlw xcache-3.2.0]# cp xcache.ini /etc/php.d #將xcache提供的樣例配置導入php.d目錄中讓其配置文件生效 [root@wlw xcache-3.2.0]# cd /etc/php.d [root@wlw php.d]# vim xcache.ini extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so
測試支持xcache的php的加速效果,這裏使用ab命令來簡單測試,這裏直接給出測試結果
[root@wlw ~]# ab -c 100 -n 1000 http://192.168.0.101/index.php -n: 總的請求數,-c:模擬的併發數,-k: 以持久鏈接模式測試
使用xcache加速前:
Requests per second: 36.38 [#/sec] (mean)(每秒的事務數,即每秒請求的資源)
Time per request: 274.871 [ms] (mean)
Time per request: 27.487 [ms] (mean, across all concurrent requests)
使用xcache加速後:
Requests per second: 144.23 [#/sec] (mean)
Time per request: 69.332 [ms] (mean)
Time per request: 6.933 [ms] (mean, across all concurrent requests)
從這裏能夠看到xcache對php程序的加速效果。這裏效果比較好,通常來講效果爲3倍左右
7、編譯安裝PHP,以fastcgi(fpm)做爲php獨立運行服務
fastcgi是一個協議,php-fpm實現了這個協議。
通常狀況下,FastCGI的整個工做流程是這樣的:
一、Web Server啓動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)
二、FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待WebServer的鏈接。
三、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。 Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
四、FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。在CGI模式中,php-cgi在此便退出了。
[root@wlw ~]# rm -rf php-5.4.40 #這裏我以前已模塊化編譯安裝過一次php,因此這裏有一次刪除操做,若是是第一次編譯忽略此刪除操做 [root@wlw ~]# tar xf php-5.4.40.tar.bz2 [root@wlw php-5.4.40]# ./configure --prefix=/usr/local/phpfpm --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc/phpfpm --with-config-file-scan-dir=/etc/phpfpm.d --with-bz2 #--enable-fpm:開啓fpm模式
生產fpm配置文件及其相關配置
[root@wlw php-5.4.40]# mkdir -pv /etc/phpfpm{,.d} [root@wlw php-5.4.40]# cp php.ini-production /etc/phpfpm/php.ini #爲php提供配置文件 [root@wlw php-5.4.40]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm [root@wlw php-5.4.40]# chmod +x /etc/init.d/php-fpm [root@wlw php-5.4.40]# chkconfig --add php-fpm #爲php-fpm提供SysV init腳本,並將其添加至服務列表 [root@wlw httpd-2.4.16]# cd /usr/local/phpfpm/etc/ [root@wlw etc]# mv php-fpm.conf.default php-fpm.conf #爲php-fpm提供配置文件 [root@wlw ~]# vim /usr/local/php5/etc/php-fpm.conf listen = 0.0.0.0:9000 #PHP-FPM監聽的套接字 pid = /usr/local/phpfpm/var/run/php-fpm.pid #啓用pid文件 pm.max_children = 50 #最大併發進程數 pm.start_servers = 5 #服務啓動開啓的進程數 pm.min_spare_servers = 2 #最少空閒進程數 pm.max_spare_servers = 8 #最大空閒進程數 [root@wlw ~]# /etc/init.d/php-fpm start Starting php-fpm done [root@wlw ~]# ss -tnl LISTEN 0 128 *:9000 *:* #端口已經成功監聽 [root@wlw ~]# ps aux | grep php-fpm root 8201 0.0 0.5 252760 4096 ? Ss 12:43 0:00 php-fpm: master process (/usr/local/phpfpm/etc/php-fpm.conf) nobody 8202 0.0 0.4 252760 3632 ? S 12:43 0:00 php-fpm: pool www nobody 8203 0.0 0.4 252760 3632 ? S 12:43 0:00 php-fpm: pool www nobody 8204 0.0 0.4 252760 3636 ? S 12:43 0:00 php-fpm: pool www nobody 8205 0.0 0.4 252760 3636 ? S 12:43 0:00 php-fpm: pool www nobody 8206 0.0 0.4 252760 3636 ? S 12:43 0:00 php-fpm: pool www #能夠看到開啓服務後啓動了5個空閒子進程,與配置文件中指定的一致
讓httpd加載和啓用php-fpm
[root@wlw ~]# vim /etc/httpd24/httpd.conf LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so #在Apache httpd 2.4之後已經專門有一個模塊針對FastCGI的實現,此模塊爲mod_proxy_fcgi.so,它實際上是做爲mod_proxy.so模塊的擴充,所以,這兩個模塊都要加載 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps DirectoryIndex index.php index.html
在對應的虛擬主機中添加
ProxyRequests Off #以反向代理方式 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1 #正則匹配,全部以.php結尾的url請求,都基於fcgi協議轉交給ip:9000端口+網頁文件的存放位置,$1爲正則的後向引用
從phpinfo函數中已經能夠看到Server API:FPM/FastCGI。表明已經使用php-fpm運行!
注意:Apache httpd 2.4之前的版本中,要麼把PHP做爲Apache的模塊運行,要麼添加一個第三方模塊支持PHP-FPM實現。