一、簡介 
        
 
         
         1、認識 
        
 
        
          加密網頁(https): tcp:443      明文網頁(http): tcp:80 
        
 
        
          survey.netcraft.net         --這個網站上可以查到最新的網站服務器的使用率 
        
 
         
         超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法 
        
 
         
         2、Apache 
        
 
         
         Apache HTTP Server(簡稱Apache)是Apache軟件基金會的一個開放源碼的網頁服務器,可以在大多數計算機操作系統中運行,由於其多平台和安全性被廣泛使用,是最流行的Web服務器端軟件之一,其特點如下: 
        
 
        
          1、支持最新的HTTP/1.1通信協議 
        
 
         
         
        
          2、擁有簡單而強有力的基於文件的配置過程 
        
 
        
          3、支持通用網關接口 
        
 
        
          4、支持基於IP和基於域名的虛擬主機 
        
 
        
          5、支持多種方式的HTTP認證 
        
 
        
          6、集成Perl處理模塊 
        
 
        
          7、集成代理服務器模塊 
        
 
        
          8、支持實時監視服務器狀態和定制服務器日志 
        
 
        
          9、支持服務器端包含指令(SSI) 
        
 
        
          10、支持安全Socket層(SSL) 
        
 
        
          11、提供用戶會話過程的跟蹤 
        
 
        
          12、支持FastCGI 
        
 
        
          13、通過第三方模塊可以支持JavaServlets 
        
 
         
         3、安裝: 
         
 
        
           www.apache.org --apache 官網 
         
 
        
          # yum install httpd* --安裝httpd服務 
        
 
        
          # httpd -t --檢查配置文件正確性 
        
 
        
          # rm -rf /etc/httpd/conf.d/welcome.conf --刪除歡迎界面;因為安裝了 httpd-manual ,故可以訪問 
         http://ServerIp/manual 
        
 
         
         4、運行於兩種模式:prefork,worker 
        
 
         
         
         
         prefork模式: 
        
 
        
          prefork是Unix平台上的默認(缺省)MPM, 
         使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接, 
         效率高,但內存占用量比較大。 
        
 
        
          這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工作方式類似於Apache 1.3。它適合於沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。 
        
 
         
         worker模式: 
        
 
        
          worker使用 
         多個子進程,每個子進程有多個線程,每個線程在某個確定的時間只能維持一個連接, 
         內存占用量比較小,適合高流量的http服務器。缺點是假如一個線程崩潰,整個進程就會連同其任何線程一起”死掉”,所以要保證一個程式在運行時必須被系統識別為”每個線程都是安全的”。 
        
 
         
         
        
          此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。由於使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於進程的MPM。但是它也使用了多進程,每個進程又有多個線程,以獲得基於進程的MPM的穩定性。 
        
 
        
          # httpd -l --查看運行模式,默認為 prefork.c 
        
 
        
          # mv -v /usr/sbin/httpd{,.prefork} --備份prefork模式 
        
 
        
          # mv -v /usr/sbin/httpd{.worker,} --使用worker模式 
        
 
         
         二、配置文件詳解 
        
 
         
         1、全局環境參數 
        
 
        
          ServerTokens OS 
         --當服務器響應主機頭(header)信息時顯示Apache的版本和操作系統名稱 
        
 
        
          ServerRoot "/etc/httpd" 
          --服務器的基礎目錄,一般來說它將包含conf/和logs/子目錄,其它配置文件的相對路徑即基於此目錄。 
        
 
         
         
        
          PidFile run/httpd.pid 
         --第一個httpd進程(所有其他進程的父進程)的進程號文件位置。 
        
 
        
          Timeout 60 
         --若60秒后沒有收到或送出任何數據就切斷該連接 
        
 
        
          KeepAlive Off 
         --默認不使用保持連接的功能,即客戶一次請求連接只能響應一個文件,建議允許 
        
 
        
          MaxKeepAliveRequests 100 
         --在保持連接功能時,設置客戶一次請求連接能響應文件的最大上限,超過就斷開 
        
 
        
          KeepAliveTimeout 15 
         --在使用保持連接功能時,兩個相鄰的連接的時間間隔超過15秒,就切斷連接 
        
 
        
          ................. 
        
 
        
          Listen 80 
          --服務器監聽的端口號;監聽端口可以多開 
        
 
        
          Include conf.d/*.conf 
         --將/etc/httpd/conf.d目錄下所有以conf結尾的配置文件包含進來 
        
 
        
          User apache 
         --提供服務的子進程的用戶 
        
 
        
          Group apache 
         --提供服務的子進程的用戶組 
        
 
        
          ServerAdmin root@george.com 
         --管理員的郵件地址 
        
 
        
          ServerName mail.george.com:80 
         --主站點名稱(網站的主機名) 
        
 
        
          UseCanonicalName Off 
        
 
        
          DocumentRoot "/var/www/html" 
         --設置Web文檔根目錄;但是可以使用符號鏈接和別名來指向到其他的位置;如不是絕對路徑,則被假定為是相對於ServerRoot的路徑 
        
 
         
         2、路徑控制參數 
        
 
        
          DirectoryIndex index.html index.html.var 
         --網站默認網頁文件名,左邊優先 
        
 
        
          AccessFileName .htaccess 
         --指定保護目錄配置文件的名稱 
        
 
        
          --------------------------------------------------------------------------------------------------------- 
        
 
         
         <Directory Directory-path> --用於封裝一組指令,使之僅對某個目錄及其子目錄生效。針對文件系統上的一個目錄 
        
 
        
          Options Indexes FollowSymLinks 
        
 
        
          AllowOverride None 
        
 
        
          Order allow,deny 
        
 
        
          Allow from all 
        
 
        
          Deny from 192.168.133.22 
        
 
        
          </Directory> 
        
 
         
         Directory-path --可以是一個目錄的完整路徑,或是包含了Unix shell匹配語法的通配符字符串。在通配符字符串中,"?"匹配任何單個的字符,"*"匹配任何字符序列。也可以使用"[]"來確定字符范圍。在"~" 字符之后也可以使用正則表達式 
        
 
         
         Options --這個指令的值可以是“None”,“All”,或者下列選項的任意組合:Indexes(前面有'-',則關閉網站列目錄的功能,無則反之);Includes;FollowSymLinks;SymLinksifOwnerMatch;ExecCGI;MultiViews 
        
 
         
         AllowOverride --控制那些被放置在.htaccess文件中的指令。它可以是All,None(看不到任何.htaccess里的任何配置),或者下列指令的組合:Options;FileInfo;AuthConfig;Limit 
        
 
         
         Order,Allow,Deny --控制誰可以獲得服務。oreder的參數最終以右邊的為准,順序可以逆轉 
        
 
        
          --------------------------------------------------------------------------------------------------------- 
        
 
        
          <Directory "/www/images"> 
        
 
         
         <Files ~ "\.jpg$"> --針對指定的文件,可以是是在某個Directory下,也可以全局的 
        
 
        
          Order deny,allow 
        
 
        
          Allow from all 
        
 
        
          </Files> 
        
 
        
          </Directory> 
        
 
        
          --------------------------------------------------------------------------------------------------------- 
        
 
         
         <Location /server-status> -- 允許使用URL"http://servername/server-status"的形式查看服務器狀態(或是信息);Location主要是控制URL 
        
 
        
          SetHandler server-status(server-info) 
        
 
        
          Order deny,allow 
        
 
        
          Allow from all 
        
 
        
          </Location> 
        
 
        
          --------------------------------------------------------------------------------------------------------- 
        
 
         
         Alias /url-path /filesystem-path --把URL映射到文件系統路徑;(也可以自己在系統上使用 ln -s 軟鏈接實現哦) 
        
 
        
          <Directory "/filesystem-path"> 
        
 
        
          </Directory> 
        
 
         
         3、目錄訪問進行用戶密碼控制(非系統用戶) 
        
 
        
          <Directory "/var/www/html"> -- 
         理論也可以在Location,file 
        
 
        
          Options Indexes FollowSymLinks 
        
 
        
          AllowOverride None 
        
 
        
          Order allow,deny 
        
 
        
          Allow from all 
        
 
         
         authname "Authenticate yourself"   --瀏覽器打開該url的提示語 
        
 
         
         authtype basic 
        
 
         
         authuserfile /etc/httpd/userpasswd   --用戶&密碼文件位置 
        
 
         
         require valid-user 
        
 
        
          </Directory> 
        
 
        
          # htpasswd -c /etc/httpd/userpasswd frank --創建一個允許訪問用戶 
        
 
        
          # htpasswd /etc/httpd/userpasswd george --再創建一個,記得 '-c' 參數,是為了創建該密碼文件,只能創建第一個用戶時使用。 
        
 
         
         注意:如果一個目錄使用密碼控制訪問,那么在通過網頁瀏覽器列出該目錄的父目錄時,看不到該目錄,也就是說,該目錄被隱藏了。但是可以通過直接輸入url來訪問(即使你有賬戶和密碼也一樣)。 
        
 
         
         4、基於域名的虛擬主機 
        
 
         
         NameVirtualHost *:80 --添加這條配置,將80端口設置為虛擬主機端口 
        
 
        
          <VirtualHost *:80> --第一個虛擬主機 
        
 
        
          ServerName www.george.com 
        
 
        
          DocumentRoot /var/www/html/ 
        
 
        
          <Directory "/var/www/html"> 
        
 
        
          .................. 
        
 
        
          </Directory> 
        
 
        
          </VirtualHost> 
        
 
        
          <VirtualHost *:80> --第二個虛擬主機 
        
 
        
          ServerName mail.george.com 
        
 
        
          DocumentRoot /var/www/cgi-bin/openwebmail/ 
        
 
        
          ScriptAlias /mail /var/www/cgi-bin/openwebmail/openwebmail.pl 
        
 
        
          <Location /> 
        
 
        
          ...................... 
        
 
        
          </Location> 
        
 
        
          </VirtualHost> 
        
 
         
            該實驗的 SeverName 參數接IP地址的話,我們也可以做基於IP的虛擬主機 
        
 
         
         5、日志參數 
        
 
        
          ErrorLog logs/error_log -- 
         錯誤日志的存方位置 
        
 
        
          LogLevel warn --定義錯誤日志等級,include: 
          debug, info, notice, warn, error, crit, alert, emerg. 
        
 
        
          LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
        
 
        
          .............. 
        
 
        
          LogFormat "%{User-agent}i" agent --該四條是 
         訪問日志的缺省格式 
        
 
        
          CustomLog logs/access_log combined --使用 combined 訪問日志格式 
        
 
        
          %h –客戶端的ip地址或主機名 
        
 
        
          %l –The 這是由客戶端 identd 判斷的RFC 1413身份,輸出中的符號 "-" 表示此處信息無效。 
        
 
        
          %u –由HTTP認證系統得到的訪問該網頁的客戶名。有認證時才有效,輸出中的符號 "-" 表示此處信息無效。 
        
 
        
          %t –服務器完成對請求的處理時的時間。 
        
 
        
          "%r" –引號中是客戶發出的包含了許多有用信息的請求內容。 
        
 
        
          %>s –這個是服務器返回給客戶端的狀態碼。 
        
 
        
          %b –最后這項是返回給客戶端的不包括響應頭的字節數。 
        
 
        
          "%{Referer}i" –此項指明了該請求是從被哪個網頁提交過來的。 
        
 
        
          "%{User-Agent}i" –此項是客戶瀏覽器提供的瀏覽器識別信息。 
        
 
         
         6、SSL加密配置 
        
 
        
          # yum install -y mod_ssl --安裝加密模塊 
        
 
        
          # vim /etc/httpd/conf.d/ssl.conf 
        
 
        
          <VirtualHost *:443> 
        
 
        
          ErrorLog logs/ssl_error_log 
        
 
        
          TransferLog logs/ssl_access_log 
        
 
        
          LogLevel warn 
        
 
        
          SSLEngine on 
        
 
        
          SSLProtocol all -SSLv2 
        
 
        
          SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES 
        
 
         
         SSLCertificateFile /etc/pki/tls/certs/localhost.crt --配置公鑰文件 
        
 
         
         SSLCertificateKeyFile /etc/pki/tls/private/localhost.key --配置秘鑰文件 
        
 
        
          <Files ~ "\.(cgi|shtml|phtml|php3?)$"> 
        
 
        
          SSLOptions +StdEnvVars 
        
 
        
          </Files> 
        
 
        
          ServerName www.george.com 
        
 
        
          DocumentRoot /var/www/cgi-bin/openwebmail/ 
        
 
        
          ScriptAlias /mail /var/www/cgi-bin/openwebmail/openwebmail.pl 
        
 
        
          <Location /> 
        
 
        
          SSLOptions +StdEnvVars 
        
 
        
          Options Indexes 
        
 
        
          order deny,allow 
        
 
        
          Allow from all 
        
 
        
          </Location> 
        
 
        
          SetEnvIf User-Agent ".*MSIE.*" \ 
        
 
        
          nokeepalive ssl-unclean-shutdown \ 
        
 
        
          downgrade-1.0 force-response-1.0 
        
 
        
          CustomLog logs/ssl_request_log \ 
        
 
        
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 
        
 
        
          </VirtualHost> 
        
 
         
         6.1、自己配置證書 
        
 
        
          # mkdir /etc/pki/test/ 
        
 
        
          # cd /etc/pki/test 
        
 
        
          # openssl genrsa -out /etc/pki/test/test.key 1024 --秘鑰 
        
 
        
          # openssl req -new -key test.key -out test.csr 
        
 
        
          Country Name (2 letter code) [XX]: 
         cn 
        
 
        
          State or Province Name (full name) []: 
         guangDong 
        
 
        
          Locality Name (eg, city) [Default City]: 
         Shenzhen 
        
 
        
          Organization Name (eg, company) [Default Company Ltd]: 
         IT 
        
 
        
          Organizational Unit Name (eg, section) []: 
         maintenance 
        
 
        
          Common Name (eg, your name or your server's hostname) []: 
         www.george.com 
        
 
        
          Email Address []: 
         root@mail.george.com 
        
 
        
          Please enter the following 'extra' attributes 
        
 
        
          to be sent with your certificate request 
        
 
        
          A challenge password []: 
         123456 
        
 
        
          An optional company name []: 
         Azt 
        
 
        
          # openssl req -x509 -days 365 -key test.key -in test.csr -out test.crt --公鑰 
        
 
        
          # ls --然后將下列 test.crt && test.key 配置到 /etc/httpd/conf.d/ssl.conf 即可 
        
 
        
          test.crt test.csr test.key 
         
 
         
 
         
              
          
 
          
         
 
        
          6.2、測試自己配置的證書 
         
 
         
           https://www.george.com/mail 但是我們自己創建的證書在瀏覽器中識別是不受信任的; 
          證書狀態也是“由於CA 根證書不在“受信任的根證書頒發機構”存儲區中,所以它不受信任。” 
         
        
         
 
         需要我們自己在瀏覽器中手動將我們自己創建的證書(test.crt)導入到“受信任的根證書頒發機構”&&“受信任的發布者”。以谷歌瀏覽器為列,步驟如下:
      
接着,會再彈出幾個對話框,我們點擊“下一步”——“完成”——“是”。就 OK了。
 
          
          此時在使用瀏覽器打開我們的網站,查看證書的狀態“該證書沒有問題”。 
         
 
        