天天看點

LAMP

#lamp

    lamp是最強大的網站解決方案

    lamp指的linux(作業系統)、apachehttp 伺服器,mysql(有時也指mariadb,資料庫軟體) 和php(有時也是指perl或python) 的第一個字母,一般用來建立web應用平台。

##

    linux httpd  mariadb  php  php-xcache

        a: httpd

        m: mysql或mariadb

        p: php/perl/python/ruby

           xcache

            快速而且穩定的php opcode緩存,經過嚴格測試且被大量用于生産環境。項目位址,http://xcache.lighttpd.net/

##httpd 

    web服務端主應用程式

    服務端口号:http:80 https:443

    啟動服務指令:c6 service httpd start c7 systemctl start httpd

    ipc inter-process communication

    一次完整的http請求的處理過程:

        (1) 建立或處理連接配接:接收請求或拒絕請求;

        (2) 接收請求:接收用戶端發來的具體請求封包;

        (3) 處理請求:對請求封包進行解析;

        (4) 通路資源:通過存儲io擷取使用者請求的資源; 

        (5) 建構響應封包:

        (6) 發送響應封包 :

        (7) 記錄于日志中:

    高度子產品化:core + modules

        dso: dynamic shared objects

            支援動态裝載和解除安裝;

        mpm:multipath processing modules

            prefork:一個主程序,多個子程序;一個程序響應一個請求;

                主程序:管理子程序;建立套接字;接收使用者請求,并派發給某子程序處理;...

                子程序:處理請求、響應請求;

            worker:多程序多線程模型;一個線程響應一個請求; 

                子程序:負責管理線程; 

                線程:處理并響應請求; 

            event:事件驅動模型,多程序模型,每個程序響應多個請求;

                子程序:處理并響應請求; 

            切換子產品方法

                    c6:/etc/sysconfig/httpd httpd=/usr/sbin/httpd.worker

                    c7:include conf.modules.d/*.conf  /etc/httpd/conf.moudles.d 00-mpm.conf

                        loadmodule mpm_worker_module modules/mod_mpm_worker.so

                httpd-2.2:event為測試模型;

                    centos 6:mpm不支援dso機制;

                httpd-2.4:production ready;支援dso機制;

                    centos 7:

###配置檔案:

    /etc/httpd/conf/httpd.conf 

    /etc/httpd/conf.d/http.conf    

        主要選項

    ####section 1: global environment

        serverroot "/etc/httpd"

        alias /p_w_picpaths/ "/web/p_w_picpaths/" 别名 通過定義别名 經查找的url定位到指定路徑

        pidfile run/httpd.pid 存放程序pid号c6:6204 c7 48521

        receives and sends time out:timeout 60

        keepalive on

        maxkeepaliverequests 100 最大同時連接配接數量0為不限制

        keepalivetimeout 15 

        keepalivetimeout 500ms(c7 毫秒級限制)

         listen 172.16.174.170:80 監聽在ip:80端口下        

        loadmodule foo_module modules/mod_foo.so:動态的裝載子產品dso:dynamic shared object (dso)

        extendedstatus on server-status 頁面加載額外資訊

        user apache

        group apache

        typesconfig /etc/mime.types mime類型

        loadmodule deflate_module modules/mod_deflate.so 使用mod_deflate子產品壓縮頁面優化傳輸速度

            适用場景:

                (1) 節約帶寬,額外消耗cpu;同時,可能有些較老浏覽器不支援;

                (2) 壓縮适于壓縮的資源,例如檔案檔案;

                    setoutputfilter deflate                    

                    # mod_deflate configuration                            

                    # restrict compression to these mime types

                    addoutputfilterbytype deflate text/plain 

                    addoutputfilterbytype deflate text/html

                    addoutputfilterbytype deflate application/xhtml+xml

                    addoutputfilterbytype deflate text/xml

                    addoutputfilterbytype deflate application/xml

                    addoutputfilterbytype deflate application/x-javascript

                    addoutputfilterbytype deflate text/javascript

                    addoutputfilterbytype deflate text/css

                    # level of compression (highest 9 - lowest 1)

                    deflatecompressionlevel 9                     

                    # netscape 4.x has some problems.

                    browsermatch ^mozilla/4  gzip-only-text/html                     

                    # netscape 4.06-4.08 have some more problems

                    browsermatch  ^mozilla/4\.0[678]  no-gzip                     

                    # msie masquerades as netscape, but it is fine

                    browsermatch \bmsi[e]  !no-gzip !gzip-only-text/html

    ####section 2: 'main' server configuration

        servername www.deardy.com:80 開啟設定後啟動服務時不會提示

        documentroot "/data/web" 預設網站檔案的預設根路徑

        directoryindex index.html test.html 網站中的預設通路頁

        accessfilename .htaccess 不建議設定 極具的影響性能

        redirect permanent /foo http://www.example.com/bar 永久重定向

        adddefaultcharset utf-8 預設字元集

    權限限制: 

        限制檔案夾的通路權限,并通過ip及使用者認證進行限制

            #<directory "/data/web/admin">

            #       options none

            #       allowoverride none

            #       authtype basic      #認證類型 還可以基于digest

            #       authname "for administrators"  #認證時提示的資訊

            #       authuserfile "/etc/httpd/conf/.htpasswd"    使用者認證的密碼檔案可以htpasswd -c(建立)-m (md5)/etc/httpd/conf/.htpasswd username 

            #        authgroupfile "/etc/httpd/conf/.htgrps"        使用者組檔案:vim一個名叫.htgrps 檔案即可 格式:mygrp(組名): user1 (空格)user2

            #       require valid-user/ group mygrps

            #</directory>

            通過ip認證 

                   c6:order allow,deny 

                        allow from 172.16.0.0/16

                        deny  from 172.16.174.100  比對原則 基于最佳原則 比對較小的

                c7:<requireall>

                            require ip 172.16.100.67

                            require all denied

                        </requireall>                    

                        控制特定的用戶端ip位址通路:

                            require ip ipaddr:授權

                            require not ip ipaddr:拒絕

                            require all granted

                        控制特定的主機名通路:

                            require host hostname

                            require not host hostname

                                hostname:

                                    fqdn:單個主機名

                                    domain.tld:域名内的所有主機

        限制url的通路

            <location /server-status>

                    其他同上

            </location>

        基于檔案的通路限制方法

            <files ~ "^\.ht">

                order allow,deny

                deny from all

                satisfy all

            </files>

        可以支援的類型

            typesconfig /etc/mime.types

        錯誤日志

            errorlog logs/error_log   loglevel warn

                logformat "%h %l %u %t \"%r\" %>s %b \"%{referer}i\" \"%{user-agent}i\"" combined

                logformat "%h %l %u %t \"%r\" %>s %b" common

                logformat "%{referer}i -> %u" referer

                logformat "%{user-agent}i" agent

            格式:

                    %h    remote host

                    %l    remote logname (from identd, if supplied).

                    %u    remote user (from auth; may be bogus if return status (%s) is 401)

                    %t    time the request was received (standard english format)

                    %r    first line of request

                    %s    status. for requests that got internally redirected, this is the status of the *original* request --- %>s for the last.

                    %b    size of response in bytes, excluding http headers.

                    %{foobar}i    the contents of foobar: header line(s) in the request sent to the server. 

        通路日志

            customlog logs/access_log combined #必須定義格式

        虛拟主機

    #### section 3: virtual hosts

            可以使基于 ip  端口 fqdn的類型 最常用的為基于fqdn 

            執行個體配置:

                打開虛拟主機設定:namevirtualhost 172.16.174.170:80

                vim /etc/httpd/conf.d/user1.conf

                    <virtualhost 172.16.174.170:80>

                        servername user1.magedu.com

                        documentroot /data/vhost/user1

                        customlog logs/access_user1_log combined

                        errorlog    logs/error_user1_log

                    <loction /server-status>

                        sethandler server-status

                        options none

                        allowoverride none

                        authtype  basic

                        authname "for administrators"

                        authuserfile  "conf/.htpasswd"

                        authgroupfile "conf/.htpsswd"

                        require group mygrps

                    </virtualhost>

                (2)實作運作tom 檢視/server-status資訊

                    htpasswd -m /etc/conf/.htpasswd tom

                    輸入密碼mageedu

                    在組檔案中添加tom vim/etc/httpd/conf/,htgrps    組名:組成員  mygrps:wang 空格 tom

                    必須有mod_status子產品  可以添加  extendedstatus on   看額外資訊

                (3)不允許192.168.0.0/24任何主機通路 添加 基于ip的通路控制

                    <directory />

                                options none

                                allowoverride none

                               order allow,deny

                              allow from 172.16.0.0/16

                             deny from  192.168.0.0/24

                    </directory>

##配置httpd支援https:

    (1) 為伺服器申請數字證書;

        測試:通過私建ca發證書

            (a) 建立私有ca

            (b) 在伺服器建立證書簽署請求

            (c) ca簽證

    (2) 配置httpd支援使用ssl,及使用的證書;

        # yum -y install mod_ssl

        配置檔案:/etc/httpd/conf.d/ssl.conf

            documentroot

            servername

            sslcertificatefile    /etc/pki/tls/certs/httpd.crt 

            sslcertificatekeyfile /etc/pki/tls/private/httpd.key 

                本地生成httpd.key私鑰:

                    (umask 077;openssl genrsa -out httpd.key 1024 )

                向ca請求頒發證書:    

                openssl req -new -key httpd.key -out httpd.csr -days 365        

    (3) 測試基于https通路相應的主機;

        # openssl  s_client  [-connect host:port] [-cert filename] [-capath directory] [-cafile filename]

##php

    動态資源技術伺服器端響應程式;腳本程式設計語言、專為web開發而設計、将代碼嵌入到html中

        php的源碼在結構上非常清晰。其代碼根目錄中主要包含了一些說明檔案以及設計方案,并提供了如下子目錄:        

            1、build —— 顧名思義,這裡主要放置一些跟源碼編譯相關的檔案,比如開始建構之前的buildconf腳本及一些檢查環境的腳本等。

            2、ext —— 官方的擴充目錄,包括了絕大多數php的函數的定義和實作,如array系列,pdo系列,spl系列等函數的實作。 個人開發的擴充在測試時也可以放到這個目錄,以友善測試等。

            3、main —— 這裡存放的就是php最為核心的檔案了,是實作php的基礎設施,這裡和zend引擎不一樣,zend引擎主要實作語言最核心的語言運作環境。

            4、zend —— zend引擎的實作目錄,比如腳本的詞法文法解析,opcode的執行以及擴充機制的實作等等。

            5、pear —— php 擴充與應用倉庫,包含pear的核心檔案。

            6、sapi —— 包含了各種伺服器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。

            7、tsrm —— php的線程安全是建構在tsrm庫之上的,php實作中常見的*g宏通常是對tsrm的封裝,tsrm(thread safe resource manager)線程安全資料總管。

            8、tests —— php的測試腳本集合,包含php各項功能的測試檔案。

            9、win32 —— 這個目錄主要包括windows平台相關的一些實作,比如sokcet的實作在windows下和*nix平台就不太一樣,同時也包括了windows下編譯php相關的腳本。

    web資源的類型:

        靜态資源:原始形式與響應結果一緻;

        動态資源:原始形式通常為程式檔案,需要運作後将運作結果呈現給使用者;

            用戶端技術:js

            伺服器端技術:php, jsp    

        cgi:common gateway interface(協定)

            通過cgi調用支援cgi接口的應用程式,并讓其加載到指定的程式檔案,完成程式執行,并将資料放回給前端httpd

            注:伺服器端(httpd)可以通過使用者請求的url字尾名判斷是動态資源還是靜态資源,然後進行處理;如果是靜态資源自給處理,動态資源将啟動解釋器(perl)進行執行加載處理(加載執行動态資源,如果涉及到資料讀取還要連接配接到資料庫),傳回給(httpd),httpd将傳回給強求的用戶端。有

        可以讓一個用戶端,從用戶端代理向運作在網絡伺服器上程式傳輸資料;cgi描述了用戶端和伺服器程式之間傳輸資料的一種标準;

        請求流程:

            client --(http) --> httpd --> (cgi) --> application process (code) --> (mysql) --> mysqld (mariadb)    

    httpd與php結合方式:            

            靜态資源:client -- http --> httpd

            動态資源:client -- http --> httpd --> libphp5.so ()

            動态資源:client -- http --> httpd --> libphp5.so () -- mysql --> mysql server

            cgi: httpd 啟動一個子程序

            module (把php編譯成為httpd的擴充子產品)

                mpm:

                    prefork: libphp5.so

                    event, worker: libphp5-zts.so

            fastcgi:

                fpm     fast process manager

                    其像prefork worker event 一樣 生成套接字服務 可以通用開啟幾個程序最多空閑的程序等等。

                    相當于反代程式(模糊)    

            lamp的實作方式:

                httpd(prefork)+libphp5.so+mysql

                httpd(event)+libphp5-zts.so+mysql

                httpd+fpm(php)+mysql            

            centos 6:

                mysql-server-5.1

            centos 7

                mariadb-server-5.5

    php的安裝:

        httpd(prefork)

            # yum install php 

                (phplib5.so)    

        配置檔案:

            /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:

            <?php 

                phpinfo();

            ?>                

        centos 6:

            # yum install httpd php php-mysql mysql-server

            # service mysqld start

            # service httpd start 

        centos 7:

            # yum install httpd php php-mysql mariadb-server

            # systemctl start mariadb.service httpd.service 

        測試mysql連接配接性:

            <?php

                $conn = mysql_connect('172.16.100.71','testuser','testpass');

                if($conn)

                    echo "ok";

                else

                    echo "failure";

##php:程式設計語言;普遍需求,通用的功能子產品;擴充,extensions;

    程式:分解多個包

        主包:php-5.3.3-

        支包:name-subname-version-release.rpm 

        epel:

    性能擴充方式:

        向上擴充:scale up

        向外擴充:scale out 

    httpd與php結合方式:

        cgi:common gateway interface

        module:php,編譯成httpd的擴充子產品;

        prefork:libphp5.so

        worker, event:libphp5-zts.so 

        fastcgi:c/s架構,socket;

        php-fpm:

        httpd-2.2:預設不支援fcgi子產品,需要自行編譯擴充;

        php-5.3.3:不支援fpm機制,需要自行打更新檔編譯安裝;

    lamp的實作方式:

        httpd(prefork)+libphp5.so+mysql

        httpd(event)+libphp5-zts.so+mysql

        httpd+fpm(php)+mysql    

##mysql的指令行用戶端程式:mysql

        -uusername

        -hhost

        -ppassword    

    支援sql語句對資料完成管理:

        ddl,dml

            ddl:create, alter, drop

            dml:insert,delete,select,update            

    mysql> grant all on db_name.tbl_name to username@'host' identified by 'password';

        _:任意單個字元

        %:任意長度的任意字元        

    管理者賬号:root/localhost, 密碼預設為空;    

    配置檔案:/etc/my.cnf, /etc/my.cnf.d/*.cnf

        [mysqld]

        innodb_file_per_table = on

        skip_name_resolve = on    

        datadir=/var/lib/mysql

                    添加字元集    

    安裝完成後,建議運作 mysql_secure_installation一次;

##解決方案:編譯安裝httpd-2.4, php-5.3.3+

        httpd-2.4:rpm包預設編譯安裝了fcgi子產品;

        php-fpm:php-fpm-version.rpm包

    配置檔案:

        服務程序配置檔案:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf

        解釋器配置檔案:/etc/php.ini, /etc/php.d/*.ini 

    服務程序配置檔案:

        [global]:全局配置

        [pool]:連接配接池配置

            listen = 127.0.0.1:9000

            listen.backlog = -1

            listen.allowed_clients = 127.0.0.1

            user = 

            group = 

            pm = dynamic|static

            pm.max_children

            pm.start_servers

            pm.min_spare_servers

            pm.max_spare_servers

            pm.max_requests 

        pm方式的php程序存儲session的路徑:

            php_value[session.save_handler] = files

            php_value[session.save_path] = /var/lib/php/session

            # mkdir /var/lib/php/session

            # chown apache.apache /var/lib/php/session

        配置示例:

            <virtualhost *:80>

                servername www1.magedu.com

                documentroot /data/vhosts/www1

                proxyrequests off

                directoryindex index.php

                proxypassmatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/vhosts/www1/$1

                <directory "/data/vhosts/www1">

                    options none

                    allowoverride none

                    require all granted

                </directory>

            </virtualhost>            

##編譯安裝amp:

        httpd:httpd-2.4

        mariadb:mariadb-5.5

        php5:php-5.4 

    注意:被依賴到的每個元件,在編譯時主要用到的是其開發庫和頭檔案;通常由name-devel-version.rpm;

    開發包組:development tools, server platform development

    centos 6專用:

    (1) apr

        # ./configure --prefix=/usr/local/apr

        # make && make install

    (2) apr-util

        # ./configure --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr

    centos 7專用:

        # yum install apr-devel apr-util-devel

    安裝httpd-2.4:

        # yum install pcre-devel openssl-devel  libevent-devel

        # ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --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 

    安裝php-5.4:

        # yum install libxml2-devel gd-devel freetype-devel libmcrypt-devel

        # ./configure --prefix=/usr/local/php54 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --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/apache24/bin/apxs --with-config-file-path=/etc/php54.ini --with-config-file-scan-dir=/etc/php54.d

        # make -j #

        # make install

    注意:如果httpd使用了線程式mpm,則編譯php時應該額外使用--enable-maintainer-zts; 

    配置httpd:

        loadmodule php5_module modules/libphp5.so

        addtype application/x-httpd-php .php 

        directoryindex index.php index.html

    部署phpmyadmin:

        web gui,用于管理mysql資料庫;

##編譯amp:

        httpd-2.4, php-5.5.40, mariadb-5.5.46

        lamp(4):

    opcode加速器:

        apc,eaccelerator, xcache, ...

    并不是優化了性能;而是通過緩存opcode可供多程序共享;

        xcache:

        http://xcache.lighttpd.org

        # /usr/local/php54/bin/phpize

        # ./configure --enable-xcache --with-php-config=/usr/local/php54/bin/php-config

        # mkdir /etc/php54.d/

        # cp xcache.ini  /etc/php54.d/

繼續閱讀