httpd2.2配置文件詳解
阿新 • • 發佈:2017-10-05
sca then oot 可能 cep live image follow 認證方式 httpd2.2官方配置手冊:http://httpd.apache.org/docs/2.2/
註意:關閉防火墻,iptables規則
vim /etc/sysconfig/selinux
SELINUX=disabled
iptables -F
httpd-2.2的常用配置
主配置文件:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: ‘Main‘ server configuration
### Section 3: Virtual Hosts
配置格式:
directive value
directive:不區分字符大小寫;
value:為路徑時,是否區分字符大小寫,取決於文件系統;
常用配置:
1、修改監聽的IP和PORT
Listen [IP:]PORT
(1) 省略IP表示為0.0.0.0;表示本機上的所有ip地址
(2) Listen指令可重復出現多次;
副作用:對並發訪問量較大的服務器,長連接機制會使得後續某些請求無法得到正常響應;
折衷:使用較短的持久連接時長,以及較少的請求數量;
與訪問控制相關的哪些指令可以放在.htaccess文件(網站目錄下的每個子目錄都可以有一個)中; All: 所有的指定都可以放進去 None:不放任何指定 註意:還有一些其他的選項:FileInfo(文件信息) AuthConfig Limit (3) order和allow、deny order:定義生效次序;表示對源地址進行訪問控制;寫在後面的表示默認法則; Allow from:表示允許那些範圍(白名單) Deny from:表示拒絕那些範圍(黑名單) 7、定義站點主頁面:
* 一個ip,為所有SSL虛擬主機配置單獨的端口。比如,默認的虛擬主機使用443,其他的使用8080或8081等,且每個SSL虛
擬主機必須獨占一個端口;
* 為Apache服務器配置多個IP,每個SSL虛擬主機獨占IP。如果只有一張物理網卡,可以配置為網卡配置子接口;
* 使用mod_gnutls模塊,創建多個SSL虛擬主機
1. Apache中同一IP多個HTTPS虛擬主機的實現
在 Apache 文檔中提到,不能在單個 IP 上同時有多個按名字識別的虛擬主機("named virtual host")。不完全是這樣。
HTTPS協議的過程是:服務器首先與客戶機之間進行服務器身份驗證並協商安全會話,然後,客戶端向服務器發送 HTTP 請求。這樣一來,在客戶端開始發送HTTP請求之前,服務器就已經把證書發給了客戶端(客戶端根據本地的根證書去驗證證書鏈,等等)。而最重要的是,為了表明身份,這個證書的"Common Name"填寫的應該是域名,否則瀏覽器會給出警告。
既然在這個過程中,客戶端就所訪問的域名所處的地位是"被告知"的地位,因此,客戶端再發出的 Host: 請求頭也就顯得不那麽有意義了。另一方面,如果客戶請求的域名與Common Name不符,瀏覽器也會給出警告。至少,在表面上看是這樣。
不過,對於自行簽署的證書,以及一些發證機構而言,其實還可以簽署一種普適HTTPS證書,這種證書的Common Name一欄是 *.domain.tld 這樣的形式,即其主機名部分可以是任意字符串,而只有域名部分是確定的。
當然,這種證書的安全性有一定的負面影響:由於一個證書可以驗證整個域下面的所有服務器,一旦其被破解,則所有加密通訊也就同時失密了(當然,可以每臺服務器使用自己的單獨的證書),不過這個問題並不是太嚴重,通常還算是尚可接受的範圍。另一個潛在的影響是,某些手機上運行的瀏覽器不能正確處理這種證書,不過這個問題僅限於希望給手機提供服務的網站。
因此,簡而言之,符合這樣幾個條件的前提下,是可以在同一個IP上部署多個HTTPS虛擬主機的:
a) 這些虛擬主機是同屬於同一域名的子域名
b) 擁有普適證書
c) 正確地配置Apache。
如果要在一個IP地址上需要部署多個SSL網站,
(1)一種方法:如果要在同一個IP地址的443端口上部署多個網站,必須保證這些網站的域名都能匹配相同的一張SSL證書。這是因為SSL握手協議過程中,是通過IP+Port來進行通信,一個IP的一個端口只能返給客戶一張SSL證書(即使有多張證書,也只能返回第一張,因為無法分辨用戶會需要返回哪張證書),如果這張證書能夠滿足這些網站的主機名匹配要求(訪問b.test.com時,使用a.test.com段的證書,證書中包含a.test.com,於虛擬主機中的主機名之一匹配),就可以使用。
一般能匹配多個主機名的證書有通配符證書*.domain.com和多域名證書(www.domain.com,ftp.domain.com 等),以下我們提供一個典型同一個IP上的多主機名部署配置,www.domain.com對應的根目錄在WWW下,ftp.domain.com對應的根目錄在FTP下,www.domain.com與ftp.domain.com使用相同的證書:
Listen 80 Listen 8080(3) 修改監聽socket,重啟服務進程方可生效; 2、持久連續 Persistent Connection:tcp連續建立後,每個資源獲取完成後不全斷開連接,而是繼續等待其它資源請求的進行; 如何斷開? 數量限制 時間限制
1 KeepAlive On|Off #註意,只有在keepAlive的狀態為on時,下面的兩項才是啟用的; 2 KeepAliveTimeout 15 3 MaxKeepAliveRequests 100
測試:使用telnet工具
1 yum install -y telnet #安裝telnet 2 (keepalive off) 3 [[email protected] ~]# telnet 192.1683、MPM httpd-2.2不支持同時編譯多個MPM模塊,所以只能編譯選定要使用的那個;CentOS 6的rpm包為此專門提供了三個應用程序文件,httpd(prefork), httpd.worker, httpd.event,分別用於實現對不同的MPM機制的支持;確認現在使用的是哪下程序文件的方法:.1.16 80 4 Trying 192.168.1.16... 5 Connected to 192.168.1.16. 6 Escape character is ‘^]‘. 7 GET /test.html HTTP/1.1 #表示使用HTTP1.1的協議 8 Host: 192.168.1.16 #請求的主機是192.168.1.16;//此處回車兩次出現結果 9 10 HTTP/1.1 200 OK 11 Date: Thu, 27 Apr 2017 02:33:40 GMT 12 Server: Apache/2.2.15 (CentOS) 13 Last-Modified: Thu, 27 Apr 2017 02:18:59 GMT 14 ETag: "8023f-1e-54e1c94668f44" 15 Accept-Ranges: bytes 16 Content-Length: 30 17 Connection: close 18 Content-Type: text/html; charset=UTF-8 19 20 <h1>this www.linuxedu.top<h1> 21 Connection closed by foreign host. #此處是斷開的 22 (keepalive on) 23 [[email protected] ~]# telnet 192.168.1.16 80 24 Trying 192.168.1.16... 25 Connected to 192.168.1.16. 26 Escape character is ‘^]‘. 27 GET /test.html HTTP/1.1 28 Host: 192.168.1.16 #此處回車兩次出現結果 29 30 HTTP/1.1 200 OK 31 Date: Thu, 27 Apr 2017 02:34:56 GMT 32 Server: Apache/2.2.15 (CentOS) 33 Last-Modified: Thu, 27 Apr 2017 02:18:59 GMT 34 ETag: "8023f-1e-54e1c94668f44" 35 Accept-Ranges: bytes 36 Content-Length: 30 37 Content-Type: text/html; charset=UTF-8 38 39 <h1>this www.linuxedu.top<h1> 40 #此處是回車,並沒有斷開,但是受到MaxKeepAliveRequests以及KeepAliveTimeout的限制最終也會斷開
1 [[email protected] ~]# ps aux | grep httpd 2 root 1658 0.0 0.2 177816 3872 ? Ss 10:34 0:00 /usr/sbin/httpd 3 apache 1660 0.0 0.1 177816 2496 ? S 10:34 0:00 /usr/sbin/httpd 4 apache 1661 0.0 0.1 177816 2496 ? S 10:34 0:00 /usr/sbin/httpd 5 apache 1662 0.0 0.1 177816 2496 ? S 10:34 0:00 /usr/sbin/httpd
默認使用的為/usr/sbin/httpd,其為prefork的MPM模塊 ;
1 [[email protected] ~]# /usr/sbin/httpd -l 2 Compiled in modules: 3 core.c 4 prefork.c 5 http_core.c 6 mod_so.c查看httpd程序的模塊列表: 查看靜態編譯的模塊: # httpd -l 查看靜態編譯及動態編譯的模塊:
1 [[email protected] ~]# httpd -M 2 httpd: Could not reliably determine the server‘s fully qualified domain name, using 0.0.0.0 for ServerName 3 Loaded Modules: 4 core_module (static) 5 mpm_prefork_module (static) 6 http_module (static) 7 so_module (static) 8 auth_basic_module (shared) 9 auth_digest_module (shared) 10 ...更換使用httpd程序,以支持其它MPM機制;/etc/sysconfig/httpd MPM更改的選項有:HTTPD=/usr/sbin/httpd.{worker,event} 註意:對於centos6來講,httpd2.2版本的event還是測試的階段,因此不建議在生產環境中使用; 操作步驟:建議先停止服務,然後修改配置文件,最後啟動服務才能生效
1 [[email protected] ~]# service httpd stop 2 停止 httpd: [確定] 3 [[email protected] ~]# vim /etc/sysconfig/httpd 4 [[email protected] ~]# cat /etc/sysconfig/httpd | grep ‘^HTTPD‘ 5 HTTPD=/usr/sbin/httpd.worker 6 [[email protected] ~]# service httpd start 7 正在啟動 httpd:httpd.worker: apr_sockaddr_info_get() failed for httpd 8 httpd.worker: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName 9 [確定] 10 [[email protected] ~]# ps aux | grep httpd 11 root 1746 0.0 0.2 178024 4132 ? Ss 10:56 0:00 /usr/sbin/httpd.worker 12 apache 1860 0.0 0.2 522284 5372 ? Sl 10:56 0:00 /usr/sbin/httpd.worker 13 root 1889 0.0 0.0 103256 840 pts/0 S+ 10:56 0:00 grep --color httpd
思考:為什麽編輯/etc/sysconfig/httpd就會生效呢?先來了解一下什麽是腳本的配置文件
1 [[email protected] ~]# cat useradd.sh 2 3 #!/bin/bash 4 # 5 [ -f /tmp/useradd.conf ] && source /tmp/useradd.conf 6 username=${username:-testuser} 7 echo $username 8 [[email protected] ~]# cat /tmp/useradd.conf 9 username=myuser1、腳本首先會判斷/tmp/useradd.conf這個文件是否存在,如果存在就會把文件中的內容讀取到當前環境中, 2、${username:-testuser},表示如果當前環境中username這個變量有值,那麽echo $username就是當前環境中的值myuser,如果沒有值,echo $username的值就是testuser ---->這樣看來就很好理解為什麽編輯/etc/sysconfig/httpd就會生效的 MPM詳細的參數配置:/etc/httpd/conf/httpd.conf中 prefork的配置 # StartServers:服務器剛啟動時啟動多少個進程 # MinSpareServers:最小保持空閑進程的數量 # MaxSpareServers:最大保持空閑進程的數量 # ServerLimit: MaxClients在服務器生命周期中的最大值 # MaxClients:最大並發客戶端連接數 # MaxRequestsPerChild: 服務器進程服務的最大請求數
1 <IfModule prefork.c> #條件式參數,表示如果模塊是 2 StartServers 8 3 MinSpareServers 5 4 MaxSpareServers 20 5 ServerLimit 256 6 MaxClients 256 7 MaxRequestsPerChild 4000 8 </IfModule>worker的配置: # StartServers: 啟動服務器進程的初始數量 # MaxClients:最大並發客戶端連接數 # MinSpareThreads: 保留多少空余線程數量 # MaxSpareThreads:最大保留多少空余線程數量 # ThreadsPerChild: 每個服務器進程中不斷的工作線程數 # MaxRequestsPerChild: 服務器進程服務的最大請求數
1 <IfModule worker.c> 2 StartServers 4 3 MaxClients 300 4 MinSpareThreads 25 5 MaxSpareThreads 75 6 ThreadsPerChild 25 7 MaxRequestsPerChild 0 8 </IfModule>
註意:這裏雖然定義的StartServers是4個,但是每次查看都是3個,我們可以通過以下查看
1 ps aux | grep httpd 2 service httpd restart 3 watch -n.5 ‘ps aux | grep httpd‘ #每0.5秒監測一下發現會自動銷毀一個PV,UV PV:Page View,頁面訪問,一個頁面可能就上百個資源; UV: User View,用戶瀏覽量,指的是瀏覽的獨立IP 4、DSO 配置指定實現模塊加載
1 #LoadModule <mod_name> <mod_path> 2 LoadModule auth_basic_module modules/mod_auth_basic.so模塊文件路徑可使用相對路徑: 相對於ServerRoot(默認/etc/httpd)
1 lrwxrwxrwx. 1 root root 29 4月 27 09:41 modules -> ../../usr/lib64/httpd/modules
5、定義‘Main‘ server的文檔頁面路徑
1 DocumentRoot "/var/www/html" #註意更改此路徑時,一定要確定你的selinux是關閉的文檔路徑映射: DoucmentRoot指向的路徑為URL路徑的起始位置,其相當於站點URL的根路徑; (FileSystem) /web/host1/index.html --> (URL) /index.html 註意:在httpd2.4上只修改DocumentRoot是一定不會生效的,必須要設置站點訪問控制機制;如下
1 DocumentRoot "/var/www/html" 2 <Directory "/var/www/html">6、站點訪問控制常見機制 可基於兩種機制指明對資源進行何種訪問控制 (1)文件系統路徑:
1 <Directory ""> 2 ... #表示對該目錄下的所有包含子目錄生效 3 </Directory> 4 <File ""> 5 ... #表示對單個文件進行訪問控制 6 </File> 7 <FileMatch "PATTERN"> 8 ... #表示對一類文件進行訪問控制(被PATTERN匹配的一類文件) 9 </FileMatch>
(2)URL路徑:
1 <Location ""> 2 ... #表示對""中指定的位置下的所有做訪問控制 3 </Location> 4 5 <LocationMatch ""> 6 ... #表示對匹配到的位置進行訪問控制 7 </LocationMatch><Directory>中“基於源地址”實現訪問控制: (1) Options 後跟1個或多個以空白字符分隔的“選項”列表; 選項:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
- Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶;一般只是做為下載站點時才采用;默認是啟用的;
- FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件;就是可以讀取訪問控制目錄下的所有被鏈接到的文件的內容;有風險
- None:表示不啟用,不使用任何選項
- All:包含除了MultiViews的所有選項
- includes :表示包含服務器端由mod_include提供的
- SymLinksifOwnerMatch:服務器將僅跟蹤目標文件或目錄所擁有的符號鏈接與鏈接相同的用戶標識
- ExecCGI:表示允許執行mod_CGI提供的腳本
與訪問控制相關的哪些指令可以放在.htaccess文件(網站目錄下的每個子目錄都可以有一個)中; All: 所有的指定都可以放進去 None:不放任何指定 註意:還有一些其他的選項:FileInfo(文件信息) AuthConfig Limit (3) order和allow、deny order:定義生效次序;表示對源地址進行訪問控制;寫在後面的表示默認法則; Allow from:表示允許那些範圍(白名單) Deny from:表示拒絕那些範圍(黑名單) 7、定義站點主頁面:
1 DirectoryIndex index.html index.html.var index.php
註意:如果匹配不到以上的所有的後綴索引,那麽訪問站點時可能會有以下集中情況
- 告訴用戶你所訪問的資源不存在
- 返回該路徑下的所有可用的URL給列出來;相當於暴露了網站的源碼,但是又可以用於作為下載站點;
1 DocumentRoot "/www/htdocs" 2 http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm #正常情況下基於URL映射 3 /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm #正常情況下基於文件系統映射 4 5 Alias /download/ "/rpms/pub/" 6 http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 7 /rpms/pub/bash-4.4.2-3.el6.x86_64.rpm 8 9 http://www.magedu.com/images/logo.png 10 /www/htdocs/images/logo.png9、設定默認字符集 AddDefaultCharset UTF-8 中文字符集:GBK, GB2312, GB18030 10、日誌設定 日誌類型:訪問日誌 和 錯誤日誌 錯誤日誌: 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 CustomLog logs/access_log combined combined:表示使用自定義格式的格式名稱,如
1 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 2 LogFormat "%h %l %u %t \"%r\" %>s %b" common 3 LogFormat "%{Referer}i -> %U" referer 4 LogFormat "%{User-agent}i" agent日誌格式字符串官方參考地址:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats %h:客戶端IP地址; %l:Remote User, 通常為一個減號(“-”); %u:Remote user (from auth; may be bogus if return status (%s) is 401);非為登錄訪問時,其為一個減號; %t:服務器收到請求時的時間; %r:First line of request,即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本; %>s:響應狀態碼; %b:響應報文的大小,單位是字節;不包括響應報文的http首部; %{Referer}i:請求報文中首部“referer”的值;即從哪個頁面中的超鏈接跳轉至當前頁面的; %{User-Agent}i:請求報文中首部“User-Agent”的值;即發出請求的應用程序; 11、基於用戶的訪問控制 認證質詢: WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼; 認證: Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過時,則服務器發送響應的資源; 認證方式有兩種: basic:明文 digest:消息摘要認證 安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因; 用戶的賬號和密碼存放於何處? 虛擬賬號:僅用於訪問某服務時用到的認證標識 存儲:文本文件,SQL數據庫,ldap目錄存儲; basic認證配置示例: (1) 定義安全域
1 <Directory ""> 2 Options None 3 AllowOverride None 4 AuthType Basic 5 AuthName "String“ 6 AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" 7 Require user username1 username2 ... #授權指定用戶可以訪問,如果需要讓所有的人可訪,改成Require valid-user 8 </Directory>允許賬號文件中的所有用戶登錄訪問: Require valid-user
1 <Directory ""> 2 Options None 3 AllowOverride None 4 AuthType Basic 5 AuthName "String“ 6 AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" 7 Require valid-user #授權指定用戶可以訪問,如果需要讓所有的人可訪,改成Require valid-user 8 </Directory>(2) 提供賬號和密碼存儲(文本文件) 使用專用命令完成此類文件的創建及用戶管理 htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username -c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用; -m:md5格式加密 -s: sha格式加密 -D:刪除指定用戶 範例1:
1 mkdir /var/www/html/admin 2 echo "<h1>admin page</h1>" > index.html 3 <Directory /var/www/html/admin/> 4 Options None 5 AllowOverride None 6 AuthType Basic 7 AuthName "Admin Realm" 8 AuthUserFile "/etc/httpd/conf/.htpasswd" 9 Require user tom 10 </Directory>
配置加密文件
1 cd /etc/httpd/conf/ 2 [[email protected] conf]# htpasswd -c -m ./.htpasswd tom 3 New password: 4 Re-type new password:
訪問瀏覽器
另外:基於組賬號進行認證; (1) 定義安全域1 <Directory ""> 2 Options None 3 AllowOverride None 4 AuthType Basic 5 AuthName "String“ 6 AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" 7 AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" 8 Require group grpname1 grpname2 ... 9 </Directory>(2) 創建用戶賬號和組賬號文件; 組文件:每一行定義一個組 GRP_NAME: username1 username2 ... 案例2
1 mkdir /var/www/html/upload;cp /var/www/html/admin/index.html /var/www/html/upload/ 2 echo "<h1>upload page</h1>" > /var/www/html/upload/index.html 3 <Directory /var/www/html/upload/> 4 Options None 5 AllowOverride None 6 AuthType Basic 7 AuthName "Admin Realm" 8 AuthUserFile "/etc/httpd/conf/.htpasswd" 9 AuthGroupFile "/etc/httpd/conf/.htgroup" 10 Require group mygroup 11 </Directory> 12 [[email protected] conf]# cat ./.htgroup 13 mygroup: tom Jason 14 othergroup: obama12、虛擬主機 站點標識: socket IP相同,但端口不同; IP不同,但端口均為默認端口; FQDN不同; 請求報文中首部 Host: www.linuxedu.top 有三種實現方案: 基於ip: 為每個虛擬主機準備至少一個ip地址; 基於port: 為每個虛擬主機使用至少一個獨立的port; 基於FQDN: 為每個虛擬主機使用至少一個FQDN; 註意:一般虛擬機不要與中心主機混用;因此,要使用虛擬主機,得先禁用‘main‘主機; 禁用方法:註釋中心主機的DocumentRoot指令即可; 虛擬主機的配置方法:
1 <VirtualHost IP:PORT> 2 ServerName FQDN 3 DocumentRoot "" 4 </VirtualHost>其它可用指令: ServerAlias:虛擬主機的別名;可多次使用; ErrorLog: CustomLog: <Directory ""> ... </Directory> Alias ... 完成以下三種方案:註意註釋掉中心主機,關閉selinux,清空防火墻規則; 基於IP的虛擬主機示例:
1 <VirtualHost 172.16.100.6:80> 2 ServerName www.a.com 3 DocumentRoot "/www/a.com/htdocs" 4 </VirtualHost> 5 6 <VirtualHost 172.16.100.7:80> 7 ServerName www.b.net 8 DocumentRoot "/www/b.net/htdocs" 9 </VirtualHost> 10 11 <VirtualHost 172.16.100.8:80> 12 ServerName www.c.org 13 DocumentRoot "/www/c.org/htdocs" 14 </VirtualHost>
基於端口的虛擬主機
1 <VirtualHost 172.16.100.6:80> 2 ServerName www.a.com 3 DocumentRoot "/www/a.com/htdocs" 4 </VirtualHost> 5 6 <VirtualHost 172.16.100.6:808> 7 ServerName www.b.net 8 DocumentRoot "/www/b.net/htdocs" 9 </VirtualHost> 10 11 <VirtualHost 172.16.100.6:8080> 12 ServerName www.c.org 13 DocumentRoot "/www/c.org/htdocs" 14 </VirtualHost>
基於FQDN的虛擬主機:
1 NameVirtualHost 172.16.100.6:80 2 <VirtualHost 172.16.100.6:80> 3 ServerName www.a.com 4 DocumentRoot "/www/a.com/htdocs" 5 </VirtualHost> 6 7 <VirtualHost 172.16.100.6:80> 8 ServerName www.b.net 9 DocumentRoot "/www/b.net/htdocs" 10 </VirtualHost> 11 12 <VirtualHost 172.16.100.6:80> 13 ServerName www.c.org 14 DocumentRoot "/www/c.org/htdocs" 15 </VirtualHost>
13、status頁面
1 LoadModule status_module modules/mod_status.so 2 <Location /server-status> 3 SetHandler server-status 4 Order allow,deny 5 Allow from 172.16 6 </Location>
思考如何實現虛擬主機的https
參考文獻要實現一個Apache服務器上提供多個SSL虛擬主機,可以:
* 使用多域名SSL證書,可以實現一個IP,一個443端口上多個SSL虛擬主機;* 一個ip,為所有SSL虛擬主機配置單獨的端口。比如,默認的虛擬主機使用443,其他的使用8080或8081等,且每個SSL虛
擬主機必須獨占一個端口;
* 為Apache服務器配置多個IP,每個SSL虛擬主機獨占IP。如果只有一張物理網卡,可以配置為網卡配置子接口;
* 使用mod_gnutls模塊,創建多個SSL虛擬主機
1. Apache中同一IP多個HTTPS虛擬主機的實現
在 Apache 文檔中提到,不能在單個 IP 上同時有多個按名字識別的虛擬主機("named virtual host")。不完全是這樣。
HTTPS協議的過程是:服務器首先與客戶機之間進行服務器身份驗證並協商安全會話,然後,客戶端向服務器發送 HTTP 請求。這樣一來,在客戶端開始發送HTTP請求之前,服務器就已經把證書發給了客戶端(客戶端根據本地的根證書去驗證證書鏈,等等)。而最重要的是,為了表明身份,這個證書的"Common Name"填寫的應該是域名,否則瀏覽器會給出警告。
既然在這個過程中,客戶端就所訪問的域名所處的地位是"被告知"的地位,因此,客戶端再發出的 Host: 請求頭也就顯得不那麽有意義了。另一方面,如果客戶請求的域名與Common Name不符,瀏覽器也會給出警告。至少,在表面上看是這樣。
不過,對於自行簽署的證書,以及一些發證機構而言,其實還可以簽署一種普適HTTPS證書,這種證書的Common Name一欄是 *.domain.tld 這樣的形式,即其主機名部分可以是任意字符串,而只有域名部分是確定的。
當然,這種證書的安全性有一定的負面影響:由於一個證書可以驗證整個域下面的所有服務器,一旦其被破解,則所有加密通訊也就同時失密了(當然,可以每臺服務器使用自己的單獨的證書),不過這個問題並不是太嚴重,通常還算是尚可接受的範圍。另一個潛在的影響是,某些手機上運行的瀏覽器不能正確處理這種證書,不過這個問題僅限於希望給手機提供服務的網站。
因此,簡而言之,符合這樣幾個條件的前提下,是可以在同一個IP上部署多個HTTPS虛擬主機的:
a) 這些虛擬主機是同屬於同一域名的子域名
b) 擁有普適證書
c) 正確地配置Apache。
如果要在一個IP地址上需要部署多個SSL網站,
(1)一種方法:如果要在同一個IP地址的443端口上部署多個網站,必須保證這些網站的域名都能匹配相同的一張SSL證書。這是因為SSL握手協議過程中,是通過IP+Port來進行通信,一個IP的一個端口只能返給客戶一張SSL證書(即使有多張證書,也只能返回第一張,因為無法分辨用戶會需要返回哪張證書),如果這張證書能夠滿足這些網站的主機名匹配要求(訪問b.test.com時,使用a.test.com段的證書,證書中包含a.test.com,於虛擬主機中的主機名之一匹配),就可以使用。
一般能匹配多個主機名的證書有通配符證書*.domain.com和多域名證書(www.domain.com,ftp.domain.com 等),以下我們提供一個典型同一個IP上的多主機名部署配置,www.domain.com對應的根目錄在WWW下,ftp.domain.com對應的根目錄在FTP下,www.domain.com與ftp.domain.com使用相同的證書:
1 NameVirtualHost 11.22.33.44:443 2 3 <VirtualHost 11.22.33.44:443> 4 DocumentRoot "C:/Apache2.2/htdocs/www" 5 ServerName www.domain.com 6 SSLEngine on 7 SSLCertificateFile "C:/Apache2.2/conf/server.cer" 8 SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" 9 </VirtualHost> 10 11 <VirtualHost 11.22.33.44:443> 12 DocumentRoot "C:/Apache2.2/htdocs/ftp" 13 ServerName ftp.domain.com 14 SSLEngine on 15 SSLCertificateFile "C:/Apache2.2/conf/server.cer" 16 SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" 17 </VirtualHost> 18 19 (2)另一種辦法就是給每個網站分配不同的端口號; 20 <VirtualHost 11.22.33.44:443> 21 DocumentRoot "C:/Apache2.2/htdocs/www" 22 ServerName www.domain.com 23 SSLEngine on 24 SSLCertificateFile "C:/Apache2.2/conf/server.cer" 25 SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" 26 </VirtualHost> 27 28 <VirtualHost 11.22.33.44:8443> 29 DocumentRoot "C:/Apache2.2/htdocs/ftp" 30 ServerName ftp.domain.com 31 SSLEngine on 32 SSLCertificateFile "C:/Apache2.2/conf/server.cer" 33 SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" 34 </VirtualHost>
基於域名的虛擬主機只能使用同一個證書,或者說,即使有不同的證書,最終使用的都是排在前面的默認的第一個
2. Apache中一張網卡綁定不同IP實現多個HTTPS虛擬主機
一張網卡綁定多個ip,ifconfig eth0:0......
1 <VirtualHost 220.181.75.109:8443> 2 ServerAdmin [email protected] 3 DocumentRoot /home/lala/apache/htdocs/test 4 ServerName a.test.com 5 SSLEngine on 6 SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL 7 SSLCertificateFile /home/lala/apache/conf/ssl.key/server.crt 8 SSLCertificateKeyFile /home/lala/apache/conf/ssl.key/server.key 9 #Include /home/lala/apache/conf/ssl.conf 10 #ErrorLog logs/dummy-a.test.com-error_log 11 #CustomLog logs/a.test.com-access_log common 12 </VirtualHost> 13 14 <VirtualHost 220.181.75.65:8443> 15 ServerAdmin [email protected] 16 DocumentRoot /home/lala/apache/htdocs/test2 17 ServerName d.test.com 18 SSLEngine on 19 SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL 20 SSLCertificateFile /home/lala/apache/conf/ssl.key/server2.crt 21 SSLCertificateKeyFile /home/lala/apache/conf/ssl.key/server2.key 22 #Include /home/lala/apache/conf/ssl.conf 23 #ErrorLog logs/dummy-a.test.com-error_log 24 #CustomLog logs/a.test.com-access_log common 25 </VirtualHost>
httpd2.2配置文件詳解