回顧:httpd, lamp, mysql httpd:https, mod_deflate, …
httpd+php:三種結合方式 Module: prefork:libphp5.so worker, event:libphp5-zts.so CGI:通用網關接口 FastCGI
php連接數據庫
mysql(mariadb): C/S: C --> mysql協議 --> S mysql協議主要傳輸SQL語句 php需要一個擴展模塊,默認是不安裝的 php-mysql amp-module: 靜態資源:Client --> http協議 --> httpd (IO操作) php動態資源:Client --> http協議 --> httpd --> libphp5.so (IO操作) php動態資源:Client --> http 協議--> httpd --> libphp5.so (IO操作, php-mysql)--> mysql協議 --> mysqld
lamp(1)
靜態資源響應速度快。 動態資源響應速度要比靜態資源慢的多,服務器需要加載,執行動態資源,還可能需要訪問數據,php再與數據庫進行交互,獲取數據資源。 應該盡量少的使用動態資源。一般遵循二八法則
php:嵌入式web應用編程語言
php及解析器(解釋器)
作者:Rasmus Lerdorf, Personal Home Page tool, C語言(CGI,Web Forms), PHP/FI zeev, andi重寫php的解析器, zend engine 1.0, php 4.0; zend engine 2.0 php 5.0(增強的面向對象,支持PDO(php數據對象,php與數據庫交互式時,不僅能基于數據流的交換,還能基于對象的方式進行交換)機制)
php解析器
php解析器--編譯成opcode--執行 解析器功能:詞法語法句法分析等... scanning掃描,parsing分析,compilation,excution 提升opcode性能,使用opcodecache php加速器
解析器:兩類
zend engine:編譯 --> 編譯為opcode, 執行 分解為4步:Scanning(Lexing(開源詞法分析工具)詞法分析), Parsing(語法分析), Compilation, Excution 編譯成偽二進制格式,在zend引擎上執行。將php代碼運行縮減為兩部 hhvm:剛誕生的組件,但是應用的不多。運行效率更高。facebook研發的解釋器 把php代碼翻譯成c++代碼。
注:zend把php代碼的執行分為兩個階段,第一階段解析,第二階段執行。編譯的結果緩存下來,用戶請求同一個資源則快了很多,不需要從編譯,只需重新執行一次就可以,帶來了效率的提升。 任何語言都需要解析器,分析,分解,語法分析,詞法分析,然后才能編譯。 php使用zend引擎
php加速器:
以httpd進程模型為例(prefork) httpd是以進程模型,為用戶提供服務。php也是基于類似方式運行。一個php進程服務于一個httpd進程。php使用zend引擎,編譯后的opcod緩存先來只能為與之對應的httpd進程服務。 但是如果其他httpd進程請求了同樣的動態資源,就不能共享其opcode。zend不能跨進程為httpd服務提供共享緩存。
加速器:加速器在php的多進程之間放一段空間,將每個進程編譯的opcode代碼放到一個公共的空間。這個組件就是組件,opcache。
使用opcache提升性能2到3倍以上
XCache加速器
加速器有多種
APC (php的擴展模塊),eAccelerator,XCache(較流行的)...
安裝XCache,epel源。還有管理工具需要單獨安裝
使用ab測試,根據訪問模型,可能測試不出來。ab -c50 -n1000 http://127.0.0.1/index.php
需要優化時修改其配置文件,rpm -ql php—xcache
php可以以類似worker方式運行,但是不同woker之間不能共享編譯后的opcode,zend引擎也僅是對單個woker的線程有優化作用。后來則出現了加速器,實現不同php線程間共享opcode
APC,eAccelerator,XCache
XCache安裝包獲取途徑epel源
XCache: XCache is a fast, stable PHP opcode and data cacher that has been tested and is now running on production servers under high load.
[root@localhost ~]# rpm -ql php-xcache /etc/php.d/xcache.ini ####定義xcache工作機制 /usr/lib64/php/modules/xcache.so /usr/share/doc/php-xcache-3.1.1 /usr/share/doc/php-xcache-3.1.1/AUTHORS /usr/share/doc/php-xcache-3.1.1/COPYING /usr/share/doc/php-xcache-3.1.1/ChangeLog /usr/share/doc/php-xcache-3.1.1/README /usr/share/doc/php-xcache-3.1.1/THANKS
安裝httpd,php,mariadb-server,php-mysql,php-xcache [root@centos7 ~]# yum install mariadb-server php php-mysql php-xcache httpd php-mbstring -y 注意php-xcache使用epel源安裝,yum倉庫要配置epel源。
php要支持中就要安裝php-mbstring這個擴展模塊 php要支持mysql數據庫就要安裝php-mysql這個擴展模塊
環境搭建完畢可使用php函數寫一個測試頁
可以看到系統環境的配置信息。
httpd配置信息 php及php擴展的配置信息 與mysql交互的配置信息
<?php phpinfo(); ?>
安裝phpMyAdmin,可以實現web界面管理數據庫。
php配置文件:/etc/php.ini, /etc/php.d/*.ini
ini: [section_id] directive = value 注釋符; date.timezone = Asia/Shanghai 必須修改時區,否則系統會報錯。默認事注釋掉的。使用系統時區。 php.ini的核心配置選項: http://php.net/manual/zh/ini.core.php php.ini配置選項列表: http://php.net/manual/zh/ini.list.php 依賴于程序員的要求或壓測結果進行優化php。沒有統一標準化的配置。都是實際生產環境配置。配置安全方面,啟用關閉某些模塊... 配置文件中的配置項有說明事開發環境或是生產環境使用的。根據實際情況做調整。
httpd+php使用FastCGI模式結合
PHP FastCGI Process Manager 特別適用于繁忙的站點。
php是個獨立的守護進程,用戶可以獨立的給php發送請求。適合繁忙的站點 監聽在某個套接字上,基于某種并發方式相應前端的并發請求。
php-fpm
FastCGI的linux上實現是php的擴展模塊php-fpm實現 同時httpd要支持php的FastCGI,與之通信,httpd也需要模塊支持。
基于某個套接字與用戶通信,httpd要扮演成客戶端,去連接fastcgi服務端。 httpd要使用模塊 fcgi proxy_fcgi_module (shared) httpd 代理用戶訪問php 只是個代理模塊。作為反向代理用戶訪問動態資源。 2.2當中沒有自帶,需要重新編譯。2.4中已經自帶了。 fcgi服務類似一個簡裝版的httpd服務。httpd將用戶請求通過fcgi協議發送給php,php從本地文件系統讀取用戶的url資源。
客戶端與httpd服務器之間走的是http協議,httpd服務器與php動態資源服務器之間走的是FastCGI協議。
正向代理是面向有限的客戶端請求,發送給任意服務器—服務于請求方 反向代理是代表有限幾臺服務器,可以響應所有用戶請求。—服務于請求方
可以實現 三臺服務實現
httpd一臺服務器 php一臺服務器 mysql一臺服務器
還可以是實現擴展
實現多臺httpd服務器提供靜態資源服務器 實現多臺php服務器提高動態資源 httpd 對多臺php服務器,httpd相當于一個調度器,分發器 需要面對一個session的問題。需要在php服務器后端放置一個session-server 1、實現機制,識別同一個用戶,固定到一個php服務器上 2、基于cookie綁定用戶,缺點服務器掛了,此服務器上的用戶也都掛掉 3、同步所有用戶的session到每一臺服務器。但是不是合適大規模使用。 4、使用共享存儲,sessionsever實現,單獨服務器實現。 一般使用redis數據庫實現,簡單的鍵值數據庫。 使用多臺session服務器,做主從,讀寫分離。 session服務器一般使用redis數據。redis并發能力大,
httpd只是個代理他不負責用戶與php服務之間的session。php需要自己保持會話。 比如用戶登錄淘寶,下一次訪問被httpd調度到另一臺php服務上,用戶就需要重新登錄淘寶。所以php服務器集群需要session服務器來保持用戶的會話為全局可以用。 要么httpd基于cooki同一以用戶不調度,stick。
session服務器要與php加速器區分開。session是為php追蹤用戶使用的,加速器是為httpd服務使其訪問相同資源可以使用之前緩存下來的opcode。
css,js部署到靜態服務器上圖片也存放于專用服務器。
平滑實現版本迭代。
FastCGI
FastCGI Process Manager, an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.
php與httpd結合不能多種方式并存,只能滿足一個
要么安裝 php 要么安裝 php-fpm
centos7中 httpd需要的反代模塊和php-fpm都有rpm包 centos6中 都沒有rpm包,又需要去epel源中去找。
安裝方式:
centos7上 yum install httpd php-fpm php-mysql php-mbstring mariadb php-xcache -y
# yum install php-fpm 主程序:/usr/sbin/php-fpm Unit File:/usr/lib/systemd/system/php-fpm.service 配置文件: ini:配置php解釋器工作環境; /etc/php.ini, /etc/php.d/*.ini conf:配置fpm守護進程的工作模式;怎么與客戶端交互的(httpd) /etc/php-fpm.conf, /etc/php-fpm.d/*.conf
配置:
/etc/php-fpm.conf
[global] ##全局配置 daemonize=no ###是否運行為守護進程,在centos7上為no,centos7上使用systemd管理系統進程,不需要以守護進程方式運行,而是由systemd托管。centos6上的值都為yes
/etc/php-fpm/www.conf
[pool-id] ###配置連接池 listen = 127.0.0.1:9000 listen.backlog = -1 超出請求最大值的隊列長度,-1表示沒有上限 listen.allowed_clients = 127.0.0.1 user = apache ##運行子進程的身份屬主 group = apache ##運行子進程的屬組 pm = dynamic ###進程管理器定義是動態還是靜態。 定義 process管理機制:static, dynamic static:服務啟動時創建出所有子進程; dynamic:根據用戶請求量的變化來維護子進程數量; pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 pm.status_path = /status ###php的內建狀態頁面,于httpd的內建頁面重名,要同時使用需要修改。 rlimit_files = 1024 ##用戶所能打開的文件數 rlimit_core = 0 ##核心可以占據多少空間,不會被內存管理交換出去 php_value[session.save_handler] = yes php_value[session.save_path] = /var/lib/php/session
要使用session會話功能需要創建/var/lib/php/session/這個目錄并授權給apache用戶
回顧:
php:php core + php extensions php core: httptd modules(php):libphp5.so 配置文件:/etc/php.ini, /etc/php.d/*.ini restart|reload httpd fastcgi(php-fpm):php-fpm daemon 守護進程的配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf 配置文件:/etc/php.ini, /etc/php.d/*.ini restart|reload php-fpm php extensions: php-mysql, php-redis, php-mongodb php-mbstring php-xcache php-mcrypt ... fcgi協議協議: httpd:proxy_module, proxy_fcgi_module ProxyRequests Off ProxyPass ProxyPassMatch ^(URL-PATTERN)$ fcgi://FCGI-SERVER:PORT/PATH/TO/DIR/$1 fpm: pm=static|dynamic pm.max_children pm.min_spare_servers pm.max_spare_servers
fpm配置:
fpm配置虛擬主機反代配置示例1:
<VirtualHost *:80> ServerName www.magedu.com DocumentRoot "/vhosts/www" <Directory "/vhosts/www"> Options None AllowOverride None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1 DirectoryIndex index.php index.html </VirtualHost>
fpm配置虛擬主機反代配置示例2:
<VirtualHost *:80> ServerName www.magedu.com DocumentRoot "/vhosts/www" <Directory "/vhosts/www"> Options None AllowOverride None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/vhosts/www/$1 ProxyPassMatch ^/(pm-status|ping)$ fcgi://127.0.0.1:9000/$1 DirectoryIndex index.php index.html </VirtualHost> http://WEB_SERVER:PORT/pm-status pool: www # 連接池名稱 process manager: dynamic # 進程管理器類型 start time: 26/Sep/2016:15:10:26 +0800 # 啟動時間 start since: 7437 # 運行時長 accepted conn: 6 # 連接池已經處理過的總請求數 listen queue: 0 # 隊列的長度 max listen queue: 0 # 請求隊列的最大長度 listen queue len: 128 # socket等待隊列的最大長度; idle processes: 4 # 空閑的進程數; active processes: 1 # 活躍的進程數量; total processes: 5 # 總進程數; max active processes: 1 # 連接池當中過去最大活躍進程度; max children reached: 0 # 進程數量達到連接池上限的次數; slow requests: 0 # 慢請求的數量; 其它格式的輸出: /pm-status?json /pm-status?xml /pm-status?html /pm-status?full full格式的輸出: pid: 33095 state: Idle # 當前進程的狀態,idle, running, ... start time: 26/Sep/2016:15:10:26 +0800 # 進程啟動的日期時間 start since: 7968 # 運行時長 requests: 2 # 處理過的請求數量 request duration: 112 # 請求處理過程的時長 request method: GET # 請求方法 request URI: /pm-status?html # 請求的URL content length: 0 # 請求內容的長度,POST方法才有意義 user: - # 用戶 script: - # php腳本; last request cpu: 0.00 # 最近一次請求消耗CPU last request memory: 262144 # 最近一次請求消耗的內存量
注意:
httpd-2.2默認沒有自帶fcgi模塊;php-5.3.3-默認不支持fpm,需要打補丁方可;
CentOS 6.X:部署;amp –fpm
# yum install httpd mod_proxy_fcgi php-fpm php-mysql mysqld-server
編譯安裝amp:
(1) 系統環境:
CentOS 6:apr, apr-util的版本為1.3.9,不適用于httpd-2.4; CentOS 7:apr, apr-util的版本為1.4+, (2) 開發環境: Development Tools, Server Platform Development (3) 各程序版本 httpd: 2.2, 2.4 php:5.3.x 5.4.x, 5.6.x mysql:5.1, 5.5, 5.6, 5.7, 5.8, 8.0 mariadb:5.x, 10.x (4) httpd+php php的編譯選項: Modules:--with-apxs httpd MPM: prefork: worker, event:專用選項--enable-maintainer-zts ftm:--enable-fpm
CentOS 7:httpd-2.4, mariadb, php-5.4
安裝次序:httpd, mariadb, php
安裝MariaDB:
預制的包管理器格式的程序包: rpm包: os vendor:mariadb-devel MariaDB官方 通用二進制格式的程序包: 源碼包編譯:項目構建工具為cmake, 而非流行的make;
通用二進制格式包的安裝配置步驟:
# useradd -r mysql # tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local/ # cd /usr/local/ # ln -sv mariadb-VERSION-linux-x86_64 mysql # cd mysql # chown -R root:mysql ./* # mkdir -pv /mydata/data # chown -R mysql.mysql /mydata/data # scripts/mysql_install_db --user=mysql --datadir=/mydata/data --skip_name_resolve # cp support-files/my-large.cnf /etc/my.cnf [mysqld] ....... datadir = /mydata/data skip_name_resolve = ON innodb_file_per_table = ON # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chkconfig --add mysqld
httpd-2.4:
~]# yum install pcre-devel openssl-devel libevent-devel apr-devel apr-util-devel -y # ./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-pcre --with-zlib --with-apr=/usr --with-apr-util=/usr # make -j # # make install # echo 'export PATH=/usr/local/apache2/bin:$PATH' > /etc/profile.d/httpd.sh # . /etc/profile.d/httpd.sh # apachectl start
安裝php5:
(1) 作為httpd的模塊安裝: # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/ # make -j # && make install 注意:如果mpm為線程模型,則需要額外使用--enable-maintainer-zts (2) 安裝為fpm: # ./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --enable-fpm --with-config-file-path=/etc/php.ini --with-config-file-scan-dir=/etc/php.d/ # make -j # && make install 復制配置文件: cp php.ini-production /etc/php.ini 編譯php為httpd的模塊后,整合php至httpd: 編譯httpd.conf,添加: DirectoryIndex index.php index.html AddType application/x-httpd-php .php
練習1:
(1) 模塊化的php編譯amp,fpm化的php編譯amp; (2) 兩個虛擬主機; (a) https, 部署pma; (b) 部署discuzX; 練習2: 腳本實現編譯安裝過程,要求安裝于/usr/local/lamp/目錄中;
php-xcache 有圖形話的管理工具
xcache-admin使用有rpm包可以使用
需要配置php-xcache的配置文件
/etc/php.d/xcache.ini [xcache.admin] xcache.admin.enable_auth = On ; use http://xcache.lighttpd.net/demo/cacher/mkpassword.php to generate your encrypted password xcache.admin.user = "yang" xcache.admin.pass = "46f94c8de14fb36680850768ff1b7f2a" ####必須使用MD5加密的密碼,32為的MD5密碼 用戶名yang 密碼123qwe
安裝上xcache-admin
此web服務需要使用https連接,所以需要配置ssl服務,不配置可以使用。
需要修改其配置文件為如下,默認的配置文件是為httpd2.2準備的。 沒有對目錄授權 默認使用本地訪問
# Configure XCache Administration Alias /xcache /usr/share/xcache <Directory /usr/share/xcache> <IfModule mod_authz_core.c> # Apache 2.4 Require local </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order Allow,Deny Allow from All </IfModule> Options Indexes AllowOverride None Require all granted </Directory>
原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/56554