Apache
事先建立進程
按需維持適當的進程
模塊塊設計,核心比較小,各類功能都模塊添加(包括php)
支持運行配置,支持單獨編譯模塊
支持多種方式的虛擬主機配置
Socket IP:Port
虛擬主機:
基於IP的虛擬主機
基於端口的虛擬主機
基於域名的虛擬主機(實際中最多見的方式)php
那麼虛擬機主機是如何根據域名來區別不一樣的訪問內容的呢?
在URL和HTTP的請求報文中,報文首部中有一個Host字段,經過此字段來區別不一樣的訪問內容
URL: protocol://HOST:PORT/path/to/source
HTTP請求報文語法
請求報文語法:html
<method> <request-URL> <version>
資源獲取方法 請求的資源是什麼 對應請求資源協議的版本號
<headers>
http協議首部linux
<entity-body>
報文主體算法
例:
GET /download/linux.tar.bz2 HTTP/1.0
Host: www.qq.comapache
支持https協議 (mod_ssl)
支持用戶認證
支持基於IP或主機名的ACL
支持每目錄的訪問控制
支持URL重寫,/image/a.jpeg, /bbs/images/abc.jpegvim
Apache相關文件路徑:
/usr/sbin/httpd(默認MPM: prefork)
httpd: root, root (master process)
httpd: apche, apache (worker process)
/etc/rc.d/init.d/httpd
Port: (80/tcp), (ssl: 443/tcp)
/etc/httpd: 工做根目錄,至關於程序安裝目錄
/etc/httpd/conf: 配置文件目錄
主配置文件:httpd.conf
/etc/httpd/conf.d/*.conf 子配置文件,也是主配置文件的一部分
/etc/httpd/modules: 模塊目錄
/etc/httpd/logs --> /var/log/httpd: 日誌目錄
日誌文件有兩類:訪問日誌access_log,錯誤日誌:err_log
/var/www/
html 靜態頁面
cgi-bin 動態頁面
httpd指令:
directive value
指令不區分字符大小寫
value則根據須要有可能要區分windows
MPM: Multi Path Modules
mpm_winnt (針對windowsNT的)
prefork (一個請求用一個進程響應,穩定性好、但併發場景下消耗資源較多)
worker (一個請求用一個線程響應, (啓動多個進程,每一個進程生成多個線程))
event (一個進程處理多個請求,基於事件來實現)瀏覽器
URL路徑跟本地文件系統路徑不是一碼事兒, URL是相對於DocumentRoot的路徑而言的。網絡
Apache主配置文件中的常見指令配置併發
Options
None: 不支持任何選項
Indexes: 容許索引目錄
FollowSynLinks: 容許訪問符號連接指向的原文件
SymLinksifOwnerMatch:若是屬主匹配的話,容許訪問符號連接指向的原文件
Includes: 容許執行服務端包含(SSI)
ExecCGI: 容許運行CGI腳本
MultiViews:多功能視圖,可以根據客戶端來源的語言和文字來斷定該顯示什麼頁面
All: 支持全部選項
AllowOverride:忽略Order關於訪問控制的配置而採用另外的方式
AllowOverride AuthConfig
AuthType Basic 認證類型
AuthName "Restricted Files" 名字
AuthUserFile /usr/local/apache/passwd/passwords 認證用戶時使用的文件
Require user marion 容許哪一個/哪些用戶能夠登陸
AllowOverride AuthConfig
AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups 認證組時使用的文件
Require group GroupName 容許哪一個/哪些組能夠登陸
Require valid-user 在用戶文件中的用戶均可以訪問
<Directory /www/docs/private>
AuthName "Private"
AuthType Basic
AuthBasicProvider dbm
AuthDBMUserFile /www/passwords/passwd.dbm
Require valid-user
</Directory>
建立認證用戶文件時使用htpasswd命令:
htpasswd -c -m /etc/httpd/conf/htpasswd hadoop
文件路徑 用戶
-c 第一次建立此文件時纔可使用此參數,不然將會把原來的文件覆蓋掉
-m 表示用戶的密碼進行md5加密
-D 刪除某個用戶
組文件直接編輯,語法爲:
GroupName: rbowen dpitts sungo rshersey
組名:用戶名1 用戶名2
Order:用於定義基於主機的訪問控制功能的,IP,網絡地址或主機定義訪問控制機制
Order allow,deny
allow from **
deny from **
注:Order以後allow和deny的前後順序不一樣是有區別的,在後面的表示在沒有明確規定是否可以訪問時採用的默認動做
關於Apache中的Order deny,allow的具體用法請參照:轉-Apache的Order Allow,Deny 詳解
地址的表示方式:
IP
network/netmask
HOSTNAME: www.a.com
DOMAINNAME: a.com
Partial IP: 172.16(等價於172.16.0.0/16)
例:
Order deny,allow
Deny from 192.168.0.0/24 (僅拒絕192.168.0.0/24網段的主機)
elinks:純文本的瀏覽器
elinks http://172.16.100.1
-dump 把網頁內容顯示出來後當即退出,再也不進入交互模式
-source 顯示網頁的源代碼
PV: Page View 天天的頁面訪問量
UV: User View 天天的獨立IP訪問量
Apache虛擬主機
Apache:
中心主機
虛擬主機
基於IP的虛擬主機
IP1:80
IP2:80
基於端口的虛擬主機
IP:80
IP:8080
基於域名的虛擬主機
IP:80
主機名不一樣
www.magedu.com
www.a.org
www2.a.org
www.b.net
注:在Apache 2.2中要啓用虛擬主機須要經過NameVirtualHost指令來實現
Apache虛擬主機的定義基本語法:
<VirtualHost HOST>
ServerName 虛擬主機名稱
ServerAlias 虛擬主機別名
DocumentRoot /www/a.org/ 虛擬主機根目錄,本地文件系統路徑
<Directory "/www/a.org"> 定義一個Directory容器,對某個目錄進行訪問控制設置
Option 是否容許索引
AllowOverride
</Directory>
Alias 設置路徑別名
ErrorLog 定義錯誤日誌文件
CustomLog 定義訪問日誌文件
<Location "/images"> 針對的是DocumentRoot中的某個目錄的訪問控制設置
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .foo.com
</Location>
ScriptAlias 腳本別名,容許執行CGI腳本的目錄
</VirtualHost>
要啓用虛擬主機,必須先取消中心主機(註釋中心主機的DocumentRoot便可)
虛擬主機的定義:
<VirtualHost HOST>
</VirtualHost>
基於IP時HOST的寫法:
HOST
IP1:80
IP2:80
例:
<VirtualHost 192.168.133.128:80>
ServerName www.a.com
DocumentRoot "/var/www/a.com"
</VirtualHost>
<VirtualHost 192.168.133.129:80>
ServerName www.b.com
DocumentRoot "/var/www/b.com"
</VirtualHost>
基於端口時HOST的寫法:
HOST
IP:80
IP:8080
例:
Listen 80
Listen 8080
<VirtualHost 192.168.133.128:80>
ServerName www.a.com
DocumentRoot "/var/www/a.com"
</VirtualHost>
<VirtualHost 192.168.133.128:8080>
ServerName www.c.com
DocumentRoot "/var/www/c.com"
</VirtualHost>
基於域名時HOST的寫法:
*:80
ServerName不一樣
例:
NameVirtualHost 192.168.133.129:80
<VirtualHost 192.168.133.129:80>
ServerName www.b.com
DocumentRoot "/var/www/b.com"
</VirtualHost>
<VirtualHost 192.168.133.129:80>
ServerName www.d.com
DocumentRoot "/var/www/d.com"
</VirtualHost>
https的會話創建過程
客戶端向對方支持https的服務端發起請求,首先Client端發起TCP/IP的三次握手,客戶端和服務端進行加密算法的協商,協商以後服務端將本身的公鑰信息(證書)發送給客戶端,客戶端驗證證書沒有發現問題以後就會生成一個對稱祕鑰,將對稱祕鑰發送給服務端,以後服務端就會將客戶端請求的內容經過客戶端發來的密碼加密以後發送給客戶端
配置:
1、保證Apache加載了mod_ssl模塊
# yum install mod_ssl -y
重啓Apache便可
2、建立自簽證書
# cd /etc/pki/CA/
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
祕鑰不容許其餘人來訪問 生成rsa格式的私鑰 私鑰存儲路徑 指定是多少位的祕鑰
# vim /etc/pki/tls/openssl.cnf
[ req_distinguished_name ]
countryName_default = CN
stateOrProvinceName_default = Shannxi
localityName_default = xi'an
0.organizationName_default = xaut
organizationalUnitName_default = xaut
# cd /etc/pki/CA
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
# touch index.txt
# echo 01 > serial
# cd /etc/httpd/
# mkdir ssl
# cd ssl/
# (umask 077;openssl genrsa 1024 > httpd.key)
# openssl req -new -key httpd.key -out httpd.csr
# openssl ca -in httpd.csr -out httpd.crt -days 3650
3、配置Apache
# vim /etc/httpd/conf.d/ssl.conf
<VirtualHost 192.168.133.128:443>
DocumentRoot "/var/www/a.com"
ServerName www.a.com
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log 對於ssl再也不使用CustomLog,而是使用TransferLog
LogLevel warn
SSLEngine on 是否開啓ssl功能
SSLProtocol all -SSLv2 可以支持哪些ssl協議
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW 使用哪些加密套件
SSLCertificateFile /etc/httpd/ssl/httpd.crt 指定證書文件
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key 指定私鑰文件 重啓Apache服務便可