HTTPD 服務 http與https的實現

                                                  HTTPD 服務 http與https的實現


     Httpd是由ASF(apache software foundation)維護的開源項目之一 也是目前最爲流行的web服務器之一 目前有三個維護版本 分別爲2.1 2.2 2.4 特性豐富:高度模塊化的設計 出色的穩定性 支持OSD 豐富的第三方插件

    基於TCP的socket通信的網絡模型

wKioL1Pnbw3ht387AAJH04iLzYo762.jpg

    服務端啓動進程創建調用socket()創建套接字設備 然後調用bind()綁定地址調用listen()監聽衆所周知的端口號調用accept()阻塞等待連接請求  客戶端創建套接字設備發起tcp連接請求等到連接建立 服務收到套接字設備的寫入數據開始讀數據 一直循環直到讀寫結束(數據交換)客戶端發起tcp斷開請求服務端響應四次斷開後 此次通信結束。

 

   安裝httpd軟件包 yum install httpd

wKioL1PnbzLzEgcwAAPGHtv7CCI190.jpg



軟件結構

wKiom1PnbjWiAKPqAAGGPKKl5WU898.jpg

配置選項

Section 1: Global Environment 全局配置類:定義進程自己的工作特性及virtual host共享的參數

     1)ServerTokens OS:當訪問頁面不正常時在頁面下方現實的web server及操作系統類型等信息 通常爲了安全不啓用

       

     2)ServerRoot "/etc/httpd" :服務腳本的根目錄 在全局配置段都以此目錄作爲根目錄

     3)PidFile run/httpd.pid   :腳本pid文件所在目錄 相對路徑根爲ServerRoot所定義的目錄

     4)KeepAlive Off :是否至此長連接

     5)MaxKeepAliveRequests 100 :最大常連接時一次連接允許請求的資源的最大個數

     6)KeepAliveTimeout 15 : 最大長連接時一次連接允許連接時間長度的最大數

     7)Timeout 60:超時時間 :當發送或接受數據 客戶端無反應的超時時間

     8)prefork MPM:多進程模型 一個主控進程 有主控進程fork自己生成子進程響應客戶端請求

                       <IfModule prefork.c>

                        StartServers       8 :預先啓動的服務進程個數

                        MinSpareServers    5:空閒進程的區間      5=<spareservrer<=20

                        MaxSpareServers   20

                        ServerLimit      256 : 啓動服務進程的最大個數

                        MaxClients       256:連接客戶端的最大個數

                        MaxRequestsPerChild  4000 :每個啓動的進程允許響應的次數的最大值

                        </IfModule>

9)worker MPM:多線程模型 生成多個進程 每個進程生成多個線程

               <IfModule worker.c>

                StartServers       4 :預先啓動的服務進程個數

                MaxClients       300 :允許連接的最大客戶端個數

                MinSpareThreads   25 :空閒線程的個數區間 25=<sparethead<=75

                MaxSpareThreads   75 :   

                ThreadsPerChild     25:  每個服務進程所啓用的最大線程個數

                MaxRequestsPerChild  0:每個線程允許響應的請求個數 0表示不限制

               </IfModule>

10)Listen 80:監聽的端口號 【可以有多個 用於創建基於端口號的虛擬主機】

11)LoadModule:動態裝載模塊

                     格式爲:LoadModule    module_name  path_of_module

12)Include conf.d/*.conf :包含的配置文件

13)User apache

    Group apache

    進程運行的用戶及組

 

Section 2: 'Main' server configuration主服務器配置段:用於定義主服務器工作特性

 

     1)ServerAdmin root@localhost :管理員郵箱地址 若有需要改成自己可用的郵箱地址

     2)ServerName www.stu.com:80  服務器名字 不填寫進程回去反解當前域名若解析不成功會報錯  並使用本機主機名但不影響進程使用

3)DocumentRoot "/var/www/html":主服務器站點根目錄

4)<Directory “/var/www/html”>

     Options Indexs   FollowSymlinks  定義訪問選項  Indexs 當站點根目錄不存在時是否列出目錄索引   FollowSymLinks 訪問連接文件時是否跳轉至源文件

     AllowOverride None  是否允許.htacess中的權限覆蓋此權限模型

     Order allow , deny 權限順序 先允許後拒絕

     Allow from all 允許所有網絡地址訪問

</Directory>

 

5)DirectoryIndex index.html index.html.var 定義主頁文件 按順序啓用

6)AccessFileName .htaccess :是否啓用每個目錄自定義權限模型

7)TypesConfig /etc/mime.types:支持的MIME(多用途網絡郵件擴展)類型

8)ErrorLog logs/error_log:錯誤日誌

9)LogLevel warn:日誌級別{debug, info, notice, warn, error, crit,alert, emerg.}

10)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

     自定義日誌格式:LogFormat “格式” 格式名

         %h :客戶端IP地址

         %l  :遠程登錄名

         %u :認證時輸入的用戶名

         %t  :響應時間

         %r  :請求報文方法是什麼

         %>s  :響應的狀態碼

         %{Referer}i :從哪個連接跳轉過來

         %b  : 響應報文的字節長度

         %{User-Agent}i :客戶端瀏覽器及操作系統類型及版本

   12)CustomLog logs/access_log combined :訪問日誌的文件路徑及格式

   13)Alias /icons/ "/var/www/icons/":目錄別名 可以脫離/var/www/html 目錄限制

   14)ScriptAlias /cgi-bin/ "/var/www/cgi-bin/":腳本路徑別名

   15)    <Location /server-status>

       AuthType Basic  認證的類型

       AuthName "admin status" 認證名字 或 提示

       AuthBasicProvider file  認證的存類型

       AuthUserFile /etc/httpd/conf/.htpasswd 認證的文件在哪

       Require valid-user 認證要求的模式

       SetHandler server-status 設置內置的處理器

       </Location>

基於基本認證的權限匹配模型

 

Section 3: Virtual Hosts :虛擬主機配置段

 

1)NameVirtualHost 172.16.101.34:80:開啓基於主機名的虛擬主機

2)<VirtualHost 172.16.101.34:80> 

      ServerAdmin [email protected]

      DocumentRoot /web/vhosts/www1

      ServerName www1.stu34.com

      ErrorLog logs/www1.err

      CustomLog logs/www1.access common

      </VirtualHost>

Ssl 安全的套接字層

 通信模型

wKioL1Pnb9DggqHfAAECvmfy5Oc404.jpg

客戶端發起請求 首先要建立tcp連接(三次握手)然後創建ssl會話過程是這樣的 服務器向客戶端發送加密的根證書 客戶端解密驗證根證書有效性(詳情參考 數據加密解密 私有ca創建篇) 如果沒有問題就建立連接而後所有過程基於ssl會話模式傳輸數據 此機制的建立是基於IP的一次一個IP只能對應一個ssl會話 因爲服務器證書只有一個

    

 

實驗:配置三種虛擬主機 並實現 server-status 使用基本認證實現用戶的認證 創建https服務器


wKiom1PnbtzClqoZAAH7_oPhClE700.jpg

爲了演示方便一次性創建所有要求內容

首先創建基於端口的虛擬主機

註釋掉DocumentRoot項



wKiom1Pnbv-jcHE9AABIWrUcEXg895.jpg

首先開放多個端口

創建虛擬主機

wKiom1PnbzbwV7PJAAMEJUe3pdw980.jpg

客戶端測試:


wKioL1PncH6RCLH3AAB2mvlHqMM097.jpg

wKiom1Pnb2XBJT_gAABoiIl6hUI334.jpg



基於IP虛擬主機

爲服務器網卡配置另一個ip爲172.16.101.35

Ifconfig eth0:0 172.16.101.35

wKiom1Pnb4XRStPbAADOUoI8JAE166.jpg


Echo “172.16.101.34” >/web/vhosts/ww1/index.html

Echo “172.16.101.35” >/web/vhosts/ww2/index.html

配置文件

wKioL1PncLuzipZmAAMc62trntU795.jpg


測試

wKioL1PncNiRZtYFAABTcD1-cWc360.jpg

wKiom1Pnb7_Tz2kjAABKzbtPD98481.jpg

創建基於主機名虛擬主機

Echo “Tis is www1.stu34.com” >/web/vhosts/www1/index.html

 

Echo “Tis is www2.stu34.com” >/web/vhosts/www1/index.html

配置文件如下

wKioL1PncPTxE8cJAAN25eNwNCE993.jpg


測試

修改win客戶端的hosts文件添加如下解析

wKioL1PncR6AcT7pAAAygdmqmag011.jpg


wKioL1PncTWSnjw9AABZ7yU-uK4328.jpg

wKiom1PncBzTCdJlAABlQ2YtkV4547.jpg

基於basic認證的目錄控制

編輯配置文件

wKioL1PncU7yOePbAAG1bo58Skw387.jpg


創建認證文件

Htpasswd -c -m /etc/httpd/conf/.htpasswd

wKioL1PncXCQgnz1AACCZUtzxlo979.jpg

測試

wKiom1PncHPiEJBvAAFSm5Uznsw662.jpg


輸入帳號密碼後

wKiom1PncJPj4XIdAALTXabJe4Y838.jpg


創建基於ssl的https服務

創建私有CA

(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

 Openssl  req  -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 1000

給http主機派發證書

  創建證書存放路徑mkdir -pv /etc/httpd/ssl

 (umask 077 ;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

  生成證書請求

   Openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr 

  簽署證書

   Openssl ca -in /etc/httpd/ssl/httpd.crs -out /etc/httpd/ssl/httpd.crt -days 1000

詳情參考 加密解密過程及私有CA創建

 

首先安裝mod_ssl模塊

Yum install mod_ssl

Vim /etc/httpd/conf.d/ssl.conf

內容如下

wKiom1PncLvwxepaAAJ2-1Oup7g792.jpg

wKioL1PncdSSGXfvAAJ6BVL62Gw427.jpg


重啓服務 測試

wKioL1PncfCxhfN-AAGoUhpowks115.jpg


本機不含有私有CA的公鑰cacert.pem 將其導入即可不會出現此界面

至此已經可以使用https方式訪問

 

源代碼編譯安裝httpd-2.4

httpd-2.4的新特性:

1)MPM支持在運行時裝載;

--enable-mpms-shared=all --with-mpm={prefork|worker|event}

2)正式支持event mpm

3)異步讀寫

4)在每模塊及每目錄分別使用不同的日誌級別

5)增強版的表達式分析器

6)毫秒級的keep alive的timeout

7)基於FQDN的虛擬主機不再需要NameVirtualHost指令;

8)支持用戶使用自定義變量

httpd程序依賴於apr和apr-util 首先安裝這兩個rpm包

Apr:apache portable runtime apache可移植運行環境

新增了一些模塊:mod_proxy_fcgi, mode_ratelimit, mod_request, mod_remoteip

 

修改了一些配置機制:不再支持使用order, allow, deny定義基於ip的訪問控制;改爲require

下載http-2.4源代碼文件

./configure --prefix=/usr/local/apache 
--sysconfdir=/etc/httpd24 
--enable-so 
--enable-ssl 
--enable-cgi 
--enable-rewrite 
--with-zlib 
--with-pcre 
--with-apr=/usr/local/apr 
--with-apr-util=/usr/local/apr-util/ 
--enable-mpms-shared=all 
--with-mpm=event 
--enable-modules=most
Make && make install


配置文件大同小異

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章