apache工做機制,壓縮,虛擬主機,用戶認證

從服務器角度一次web資源請求具體過程javascript

    創建鏈接:tcp三次握手php

    接收請求css

    處理請求html

    訪問資源java

    構建響應報文linux

    發送響應nginx

    記錄日誌web

===================================================================算法

httpd工做模型sql

    阻塞模型,單進程模型。缺點:每次只能響應一個請求,對於現代的高併發無知足

        只有一個進程,每次只能響應一個用戶的請求 。

    多進程模型,缺點:不停的建立和收回進程,進程間切換也耗費時間。

        httpd監聽在套接字上,每當一個客戶端請求,它會生成一個子進程來響應,子進程用鏈接套接字來標記與客戶端的鏈接,處理客戶端的請求。由主進程的監聽套接字與客戶端通訊。

    多進程進程池模型,  缺點:進程間切換須要保存現場等,在內核空間耗費大量時間。

        httpd啓動時會事先啓動一批進程,當多個客戶端發起請求時,找一個空間進程響應。當響應完成,該進程並不會回收,而是標記爲空閒進程,以等待下次響應請求。有了進程池能夠控制併發請求量,它能夠控制最多能夠啓動多少個進程。

    複用的I/O機制:

        用單個線程來響應用戶講求,線程比進程更小的單位,更輕量級,屬於進程內部的執行流,能夠共享進程內容的資源。線程仍是須要不停的切換,不用保護現場。 (linux進程很輕量級,線程和進程區分不是很明顯,不少狀況下這種機制並不必定會比多進程切換性能好。)

    複用的I/O機制:在進程內部使用某種算法,讓一個線程能夠同響應多個請求,使用事件驅動機制(event),來得出響應完成於否。這樣就能夠在多核心的cpu上綁定每一個線程運行在一個cpu上,從而減小進程切換。全部請求都由這一個線程來響應。(nginx使用這種模型)

=============================================================  

httpd的特性

    高度模塊化:核心程序與模塊組成

    DSO:Dynamic Shared Object.模塊能夠動態裝卸載

    MPM:Multipath Processing Module。多道處理模塊,由多個模塊組成,

        prefork:每一個進程響應一個用戶請求,提供一個進程池,預先生成多個空閒進程。select():這種機制最穩定,但響應併發數最少,最多隻能響應1024個。

        worker:啓動多個進程,每一個進程生成多個線程,線程響應用戶請求

        event:2.2中爲實驗性的版本,2.4爲正式可用。啓動多個線程,每一個線程響應多個請求。減小了上下文切換。基於event-driven事件驅動機制,使一個進程響應多個用戶請求。

    豐富用戶認證

         基於認證:使用明文認證

         摘要認證:使用用戶名和密碼的特徵碼認證,應用很少,不少瀏覽器不支持

    支持CGI:原生支持perl CGI

    支持虛擬主機:支持ip,端口,主機名的虛擬主機

    反向代理:文件代理,二進制代理,負載均衡

    用戶站點

    路徑別名

    支持第三方模塊

====================================================================

rpm安裝httpd後,常常須要打交道的文件。

/etc/httpd/conf/httpd.conf    主配置文件

/etc/httpd/conf.d/*.conf         輔助配置文件

/etc/rc.d/init.d/httpd               服務腳本

/etc/sysconfig/httpd                服務腳本的配置文件

/etc/rc.d/init.d/htcacheclean    httpd作爲緩存服務器時,用來清理緩存的腳本

/etc/lib64/httpd/modules        httpd模塊的目錄,(/etc/httpd/modules是它的連接)

/usr/sbin/httpd                        httpd的主程序

/usr/sbin/apachectl                用來控制httpd服務啓動關閉,和查看httpd運行狀態的程序

/usr/sbin/httpd.worker            啓動worker的工做模式,默認啓動 prefork模式。切換模式可修改啓動腳本實現。

/usr/sbin/httpd.event               啓動基於event的工做模式 (2.2處於試驗階段,不推薦使用)

/var/log/httpd/                        日誌文件目錄,分兩個一個是訪問日誌,一個是錯誤日誌

        access_log:訪問日誌,記錄用戶訪問日誌

        error_log:錯誤日誌,刻錄程序運行時的狀態,日誌有記錄級別。

/var/www/html                        站點文檔根目錄。能夠在配置文件中修改。

/var/www/html/cgi-bin            cgi執行程序根目錄。cgi方式通常不多使用,安全性比較差。

====================================================================

經常使用命令組合

#httpd -l       查看當前http進程加載的主要模塊

clipboard

#httpd -D DUMP_MODULES   #查看http進程都加都了那此模塊

#httpd -M   #查看http進程都加都了那此模塊

htpasswd  用戶建立認證用戶的

    -c    建立用戶時順便把保存用戶名和密碼的文件也建立好,只在第一次建立用戶沒有保存用戶的文件時使用

    -m   密碼使用md5加密密碼

    -s    使用sha加密密碼

    -p    不加密密碼

    -D    刪除用戶

      示例:  # htpasswd -m /etc/httpd/conf/.htpasswd wukui

========================================== 

定義httpd的工做特性的主配置文件,有三段組成,第一段全局配置段,定義httpd進程的工做特性,和各虛擬主機共同的工做特性,第二段,網站主服務器的配置,第三段爲虛擬主機的配置,第二段和第三段通常不會同時使用,默認啓動主服務器配置段。配置文件不區分大小寫,但linux文件系統區分大小寫。

-----全局配置-----------------------------------------------------------

ServerTokens OS        若是沒有訪問到頁面,服務器會給客戶端發本機是操做系統信息,httpd程序版本信息。不安全,應當註釋掉。

ServerRoot    "/etc/httpd"     程序的運行目錄,定義了此路徑後,下面使用的其它相對路徑都是相對它的

PidFile    "run/httpd.pid"    PID保存的文件,相對於上面定義的路徑

Timeout 60          等待tcp三次握手超時時間,超事後就直接斷開。           

KeepAlive {On|off}  是否支持持久鏈接,服務器繁忙時啓動反而下降性能了。

MaxKeepAliveRequests 100    在使用持久鏈接時,請求資源最多請個數。

KeepAliveTimeout  15    在使用持久鏈接時,最大請求時間,以秒爲單位。與請求資源個數誰先知足誰先生效

EnableSendfile off

<IfModule prefork.c>             prefork模型工做的特性  

StartServers 8                         在程序啓動時就啓動8個響應用戶的進程

MinSpareServers 5                 最少空閒進程,不管任什麼時候候都要有這麼多空閒進程。

MaxSpareServers 20               最多空閒進程不該該小於StartServer

ServerLimit 256                       爲MaxClinets最多啓動進程個數,不該當大於MaxClient

MaxClients 256                        最多同時容許多少個客戶端鏈接,

MaxRequestsPerChild 4000    每一個子進程在生命週期內,最多容許處理多少個請求,完成最大數後子進程會被銷燬,再建立新進程

</IfModule>                             封裝

<IfModule worker.c>               worker工做模式的特性

StartServers 4                           服務啓動時就啓動4個進程 

MaxClients 300                        最大用戶併發請求

MinSpareThreads 25               最少空閒線程數

MaxSpareThreads 75               最多空閒線程數

ThreadsPerChild 25                  每一個子進程最多能夠啓動多少個線程

MaxRequestsPerChild 0            每一個線程最多能夠處理多少個請求,0表示不作限定

</IfModule>

Listen    80            默認監聽的端口,若是這裏不寫ip表示監聽全部ip。Listen能夠出現屢次。好比下面

Listen 8080            若是修改端口必須重啓服務才能生效,從新加載配置沒法生效。

LoadModule auth_basic_module modules/mod_auth_basic.so      指定要加載的模塊。格式 LoadModule 模塊名稱  模塊文件名。這裏使用相對路徑,相對ServerRoot指定的路徑。

Include conf.d/*.conf        指定主配置文件還有其它文件

User apache                      進程以那個用戶身份運行

Group apache                   進程以那個組身份運行

-----主服務器配置-----------------------------------------

特別說明:

<Directory  />                儘可能使用<Directory> 而非<Location>

</Directory>                上面與這個directory是成對出現的,每對爲一個容器,每一個容器是對某個對像作訪問控制的。這個容器就是對/作訪問控制的。Directory是對文件系統訪問路徑作訪問控制。可使用通配符,如<Directory ~ "/">

<Location   /server-status>   Location是對請求的URL作訪問控制的。把控制的選項寫到與標籤中,就對/server-status生效了。

</Location>

<File /var/www/html/index.html>     用來控制單個文件的

</File>

ServerAdmin  wukui@wukui.net.cn     指定管理員郵箱,在網頁請求出錯時,頁面會顯示

#ServerName   www.wukui.net.cn        指定當前系統的主機名,默認沒有啓動。它會獲取當前主機名,它會反解ip後與當前主機名對比。這時啓動服務時會報個錯誤,主要用來指定系統主機名稱的。

UseCanonicaName      Off                   

DocumentRoot "/var/www/html"       指定站點根目錄,若是使用虛擬主機。這一項須要註釋掉

DirectoryIndex  index.html  index.php      定義頁面訪問的默認文件,優先級自左而右

站點路徑訪問控制

    基於本地文件系統路徑作訪問控制

        <Directory />   定義一個封裝容器,這個容器用來對根作訪問控制。

         Options FollowSymLinks

        AllowOverride None

        </Directory>

        <Directory />

        <Directory "/var/www/html">

                Options Indexes FollowSymlinks    Options用來定義選項的.

                          Indexes 用來定義若是沒有默認頁面,會把當前目錄下全部文件都例出來。

                          FollowSymlinks  跟蹤符號連接文件,若是站點目錄下有連接文件,會找到原文件發送給客戶端。

                          ExecCGI    是否容許執行CGI腳本                         

                AllowOverride None    是否執行.htaccess文件中的指令,None表示不啓用任何指令 All表示執行

                        默認httpd2.2版本,在站點的每一個目錄下能夠建立.htaccess文件,在這個文件中能夠定義每一個目錄的訪問權限,能夠定義每一個目錄和文件的訪問權限。通常不使用,由於比較影響httpd的性能。

                Order allow,deny    作訪問控制,allow爲白名單,deny爲黑名單,這裏表示若是白名單沒有匹配到,黑名單生效。

                Allow  from all    白名單爲任何爲

                       使用格式:Allow from 172.16.0.0/16  白名單爲172.16.0.0網絡全部主機

                       使用格式:Deny form 192.168.0.1表示拒絕192.168.0.1,黑名單優先級高於白名單。

        </Directory>

    基於URL訪路徑作訪問控制

ErrorLog logs/error_log 定義錯誤日誌文件名

LogLevel  warn    定義記錄日誌的級別。級別有:debug, info, notice, warn, error, crit, alert, emerg

自定義日誌記錄的內容和格式

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  定義的日誌格式和名稱

        %h  客戶端主機ip地址

        %l    遠程登錄名  一般爲-

        %u    遠程認證登錄時的用戶名,一般爲-

        %t     服務器收到用戶請求時的時間

        \"       表示使用隱號,"有特殊意義\表示轉義

        %r     請求報文的起始行,有<method><request-URL><version>三部分組成

        %>s   響應狀態碼,如404,503等

        %b     響應報文的長度

        %{Referer}i    記錄請求由那個url連接過來的,若是爲空表示直接打開的。

        %{User-Agent}i   記錄用戶使用的瀏覽器類型

        %{HEADER_NAME}i   記錄指定首部對應的值

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

LogFormat "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent

customLog logs/access_log combined  自定義訪問日誌文件位置。和使用的日誌格式。格式由上面的LogFormat定義

KeepAlive  {Off|On}                                定義是否支持持久鏈接

KeepAliveTimeout   15                            若是開啓了持久鏈接,客戶端若是沒有數據傳輸最少多少時間內不斷開

Alias /URL/  "/path/to/somewhere/"  路徑別名,若是請求的url中的 包含了alias定義的/URL/,則會映射到/path/to/somewhere/。它不會侷限於DocumentRoot定義的站點根目錄。別名的優先級高於站點根目錄。

AddDefaultCharset UTF-8   設置字符集。經常使用的中文字符集有GB2312  GB18030   GBK等

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"   定義CGI腳本腳本的URL別名,當請求的URL帶有/cgi-bin/時,httpd程序會自動定位到/var/www/cgi-bin/目錄下

<Directory "/var/www/www1">   定義一個容器,對/var/www/www1目錄作特性

Options none                                沒有任何指定開放的功能

AllowOverride AuthConfig            表示作要作認證相關的配置

AuthType Basic                               認證類型爲Basic

AuthName "Admin Area."              認證名稱,再提示用戶輸入用戶名和密碼的時候提示的信息

AuthUserFile /etc/httpd/conf/.htpasswd        存儲用戶名和密碼的地方,此文件能夠用htpasswd命令生成

AuthBasicProvider  file                                     指定用戶認證時使用存儲用戶名和密碼的類型,有文件,和sql數據庫和ldap等,若是不寫默認使用文件。

Require valid-user                                            容許指定文件中那些用戶登錄,valid-user表示.htpasswd文件中全部用戶能夠登錄。

#Require user wukui                                        只容許某些用戶登錄的寫法,多個用戶間用空格隔開。

AuthGroupFile /etc/httpd/conf/.htgroup       使用組認證時指明組文件的位置。(組文件內容寫法。group1: user1 user2)

Require group  group1                                    給指定的組受權,組認證時必須把require user這個選項註釋掉。

</Directory>

配置虛擬主機前須要把DocumentRoot註釋掉,由於虛擬主機須要本身定義站點根目錄。虛擬主機能夠基於ip,端口,主機名作。三者能夠同時存在,但要理清三者之間佔用套接字的關係。

NameVirtualHost *:80                     設定虛擬主機使用的ip。*爲使用所有。若是這裏只指定一個ip,那麼這個ip是給基於主機名的虛擬主機使用的。基於ip的虛擬主機能夠本身定義單獨ip,不受這裏控制。

<VirtualHost *:80>                                            定義虛擬主機的容器,並指定此虛擬主要監聽的ip和端口

        ServerName www2.stu2.com                    定義虛擬主機的名稱,基於主機名的虛擬主機必須有。

        DocumentRoot /var/www/www2             定義虛擬主機的站點根目錄

        LogLevel warn                                           定義虛擬主機的錯誤日誌記錄級別

        ErrorLog /var/log/httpd/www2.err            定義虛擬主機的錯誤目錄名稱,每一個虛擬主機都就有本身獨立的日誌文件

        CustomLog /var/log/httpd/www2.access combined       虛擬主機的訪問日誌文件

        SetHandler server-status                               爲此虛擬主機啓用apache的內部處理器server-status               

</VirtualHost>

<Location /server-status>                        定義url /server-status的訪問控制選項

SetHandler server-status                          開啓apache的內核處理器server-status,用來監視httpd程序的運行狀態,能夠在瀏覽器訪問看到

Order allow,deny                         定義白名單和黑名單的優先級

Allow from 172.16.0.0/16          白名單的地址。

</Location>

------傳輸數據壓縮配置---------------------------------------

# LoadModule deflate_module modules/mod_deflate.so   前提要確認此模塊是否起用

  SetOutputFilter DEFLATE                                           啓用輸出的過濾器爲DEFLATE

  # mod_deflate configuration

  # Restrict compression to these MIME types

  AddOutputFilterByType DEFLATE text/plain           對純文本的內容啓動DEFLATE過濾器啓動壓縮功能            

  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    對於Mozilla4這樣的瀏覽器只啓用gzip算法的壓縮

  # Netscape 4.06-4.08 have some more problems

  BrowserMatch ^Mozilla/4\.0[678] no-gzip                    對於Mozilla4.06, 4.07, 4.08啓用no-gzip的算法壓縮

  # MSIE masquerades as Netscape, but it is fine

  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html        對於ie6不使用no-gzip和gzip-only-text/html壓縮。ie6不支持。

相關文章
相關標籤/搜索