httpd 高級應用

回顧: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

(0)
yywyyw
上一篇 2016-11-01
下一篇 2016-11-01

相關推薦

  • Keepalived介紹 , 配置說明 , 及實際應用

    1. Keepalived介紹 Keepalived是一個基于VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到集群的高可用。 1.1 VRRP協議 VRRP全稱 Virt…

    Linux干貨 2016-11-04
  • 數組的基本應用

                                   數組 變量:存儲單個元素的內存空間v 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。v 數組名和索引 索引:編號從0…

    Linux干貨 2016-08-24
  • linux文件管理

    目錄創建刪除,軟硬鏈接的區別和注意,file命令的使用,工作中遇到一些情況的處理方法

    2017-11-18
  • ansible的入門使用手冊

    ansible1

    2018-01-15
  • Linux系統操作入門(命令格式|命令幫助|基礎命令)

    4、說明Linux系統上命令的使用格式;詳細介紹ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相應的示例來闡述。
    5、如何在Linux系統上獲取命令的幫助信息,請詳細列出,并描述man文檔的章節是如何劃分的。
    6、請羅列Linux發行版的基礎目錄名稱命名法則及功用規定

    2018-03-06
  • 網絡基礎

    計算機網絡     計算機網絡,是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。 1、網絡通信設備     網絡通信設備種類繁多,且日新月異,網絡通信設備通常由網絡線纜、網卡、集線器、中繼器、網橋、交換機、路由器等組成。 網橋(Bri…

    Linux干貨 2016-12-16
欧美性久久久久