HTTP服務搭建,http搭建
一、簡介1、認識加密網頁(https): tcp:443 明文網頁(http): tcp:80survey.netcraft.net --這個網站上可以查到最新的網站伺服器的使用率超文字傳輸通訊協定 (HTTP)(HTTP,HyperText Transfer Protocol)是互連網上應用最為廣泛的一種網路通訊協定。所有的WWW檔案都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法2、ApacheApache HTTP Server(簡稱Apache)是Apache軟體基金會的一個開放源碼的網頁伺服器,可以在大多數電腦作業系統中運行,由於其多平台和安全性被廣泛使用,是最流行的Web伺服器端軟體之一,其特點如下:1、支援最新的HTTP/1.1通訊協定2、擁有簡單而強有力的基於檔案的配置過程3、支援通用閘道介面4、支援基於IP和基於網域名稱的虛擬機器主機5、支援多種方式的HTTP認證6、整合Perl處理模組7、整合Proxy 伺服器模組8、支援即時監視伺服器狀態和定製伺服器日誌9、支援伺服器端包含指令(SSI)10、支援安全Socket層(SSL)11、提供使用者會話過程的跟蹤12、支援FastCGI13、通過第三方模組可以支援JavaServlets3、安裝: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,workerprefork模式: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 OffDocumentRoot "/var/www/html" --設定Web主目錄;但是可以使用符號連結和別名來指向到其他的位置;如不是絕對路徑,則被假定為是相對於ServerRoot的路徑2、路徑控制參數DirectoryIndex index.html index.html.var --網站預設網頁檔案名稱,左邊優先AccessFileName .htaccess --指定保護目錄設定檔的名稱---------------------------------------------------------------------------------------------------------<Directory Directory-path> --用於封裝一組指令,使之僅對某個目錄及其子目錄生效。針對檔案系統上的一個目錄Options Indexes FollowSymLinksAllowOverride NoneOrder allow,denyAllow from allDeny from 192.168.133.22</Directory>Directory-path --可以是一個目錄的完整路徑,或是包含了Unix shell匹配文法的萬用字元字串。在萬用字元字串中,"?"匹配任何單個的字元,"*"匹配任何字元序列。也可以使用"[]"來確定字元範圍。在"~" 字元之後也可以使用RegexOptions --這個指令的值可以是“None”,“All”,或者下列選項的任意組合:Indexes(前面有'-',則關閉網站列目錄的功能,無則反之);Includes;FollowSymLinks;SymLinksifOwnerMatch;ExecCGI;MultiViewsAllowOverride --控制那些被放置在.htaccess檔案中的指令。它可以是All,None(看不到任何.htaccess裡的任何配置),或者下列指令的組合:Options;FileInfo;AuthConfig;LimitOrder,Allow,Deny --控制誰可以獲得服務。oreder的參數最終以右邊的為準,順序可以逆轉---------------------------------------------------------------------------------------------------------<Directory "/www/images"><Files ~ "\.jpg$"> --針對指定的檔案,可以是是在某個Directory下,也可以全域的Order deny,allowAllow from all</Files></Directory>---------------------------------------------------------------------------------------------------------<Location /server-status> -- 允許使用URL"http://servername/server-status"的形式查看伺服器狀態(或是資訊);Location主要是控制URLSetHandler server-status(server-info)Order deny,allowAllow from all</Location>---------------------------------------------------------------------------------------------------------Alias /url-path /filesystem-path --把URL映射到檔案系統路徑;(也可以自己在系統上使用 ln -s 軟連結實現哦)<Directory "/filesystem-path"></Directory>3、目錄訪問進行使用者密碼控制(非系統使用者)<Directory "/var/www/html"> --理論也可以在Location,fileOptions Indexes FollowSymLinksAllowOverride NoneOrder allow,denyAllow from allauthname "Authenticate yourself" --瀏覽器開啟該url的提示authtype basicauthuserfile /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.comDocumentRoot /var/www/html/<Directory "/var/www/html">..................</Directory></VirtualHost> <VirtualHost *:80> --第二個虛擬機器主機ServerName mail.george.comDocumentRoot /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_logTransferLog logs/ssl_access_logLogLevel warnSSLEngine onSSLProtocol all -SSLv2SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DESSSLCertificateFile /etc/pki/tls/certs/localhost.crt --配置公開金鑰檔案SSLCertificateKeyFile /etc/pki/tls/private/localhost.key --配置秘鑰檔案<Files ~ "\.(cgi|shtml|phtml|php3?)$">SSLOptions +StdEnvVars</Files>ServerName www.george.comDocumentRoot /var/www/cgi-bin/openwebmail/ScriptAlias /mail /var/www/cgi-bin/openwebmail/openwebmail.pl<Location />SSLOptions +StdEnvVarsOptions Indexesorder deny,allowAllow from all</Location>SetEnvIf User-Agent ".*MSIE.*" \nokeepalive ssl-unclean-shutdown \downgrade-1.0 force-response-1.0CustomLog 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.csrCountry Name (2 letter code) [XX]:cnState or Province Name (full name) []:guangDongLocality Name (eg, city) [Default City]:ShenzhenOrganization Name (eg, company) [Default Company Ltd]:ITOrganizational Unit Name (eg, section) []:maintenanceCommon Name (eg, your name or your server's hostname) []:www.george.comEmail Address []:root@mail.george.comPlease enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:123456An 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)匯入到“可信任的根憑證授權單位”&&“信任的發行者”。以Google瀏覽器為列,步驟如下:
接著,會再彈出幾個對話方塊,我們點擊“下一步”——“完成”——“是”。就 OK了。
此時在使用瀏覽器開啟我們的網站,查看認證的狀態“該認證沒有問題”。