HTTPD 服務 http與https的實現
Httpd是由ASF(apache software foundation)維護的開源項目之一 也是目前最爲流行的web服務器之一 目前有三個維護版本 分別爲2.1 2.2 2.4 特性豐富:高度模塊化的設計 出色的穩定性 支持OSD 豐富的第三方插件
基於TCP的socket通信的網絡模型
服務端啓動進程創建調用socket()創建套接字設備 然後調用bind()綁定地址調用listen()監聽衆所周知的端口號調用accept()阻塞等待連接請求 客戶端創建套接字設備發起tcp連接請求等到連接建立 服務收到套接字設備的寫入數據開始讀數據 一直循環直到讀寫結束(數據交換)客戶端發起tcp斷開請求服務端響應四次斷開後 此次通信結束。
安裝httpd軟件包 yum install httpd
軟件結構
配置選項
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 安全的套接字層
通信模型
客戶端發起請求 首先要建立tcp連接(三次握手)然後創建ssl會話過程是這樣的 服務器向客戶端發送加密的根證書 客戶端解密驗證根證書有效性(詳情參考 數據加密解密 私有ca創建篇) 如果沒有問題就建立連接而後所有過程基於ssl會話模式傳輸數據 此機制的建立是基於IP的一次一個IP只能對應一個ssl會話 因爲服務器證書只有一個
實驗:配置三種虛擬主機 並實現 server-status 使用基本認證實現用戶的認證 創建https服務器
爲了演示方便一次性創建所有要求內容
首先創建基於端口的虛擬主機
註釋掉DocumentRoot項
首先開放多個端口
創建虛擬主機
客戶端測試:
基於IP虛擬主機
爲服務器網卡配置另一個ip爲172.16.101.35
Ifconfig eth0:0 172.16.101.35
Echo “172.16.101.34” >/web/vhosts/ww1/index.html
Echo “172.16.101.35” >/web/vhosts/ww2/index.html
配置文件
測試
創建基於主機名虛擬主機
Echo “Tis is www1.stu34.com” >/web/vhosts/www1/index.html
Echo “Tis is www2.stu34.com” >/web/vhosts/www1/index.html
配置文件如下
測試
修改win客戶端的hosts文件添加如下解析
基於basic認證的目錄控制
編輯配置文件
創建認證文件
Htpasswd -c -m /etc/httpd/conf/.htpasswd
測試
輸入帳號密碼後
創建基於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
內容如下
重啓服務 測試
本機不含有私有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
配置文件大同小異