1、HTTPD特性php
httpd:特性html
1.事先建立進程:在請求來以前,建立進程監聽,加快響應速度
java
2.按需維持適當的進程python
3.模塊設計,核心比較小,各個功能均可以按照模塊添加linux
4.支持多種方式的虛擬主機配置:
shell
Socket IP:Port
apache
1.基於IP的虛擬主機(若是一個server有多個ip,而在互聯網上,每一個IP每一年都須要必定的費用)
vim
2.基於端口的虛擬主機(若是不是標準的80端口,那麼別人沒法知道到底使用的是啥端口)
安全
3.基於域名的虛擬主機(比較好的選擇)服務器
protocol://host:port/path/to/source
=================
Method URL version
header
body
=================
GET /download/linux.tar.bz2 HTTP/1.0
Host: www.harry.com
4.支持https協議(mod_ssl)
5.支持用戶認證
6.支持基於IP或主機名的ACL
7.支持每目錄的訪問控制
8.支持URL重寫
2、HTTPD安裝
1.rpm包
httpd:
/usr/sbin/httpd(MPM: prefork)
httpd: root,root (master process)
httpd: apache,apache (worker process)
/etc/rc.d/init.d/httpd (啓動腳本)
port: (http: 80/tcp) (https: 443/tcp)
/ec/httpd:工做根目錄,至關於程序安裝目錄
/etc/httpd/conf:配置文件目錄
httpd.conf 主配置文件(以段文件分散到conf.d目錄下,以include引入)
conf.d/*.conf
/etc/httpd/modules:模塊路徑(都是鏈接)
/etc/httpd/logs: -> /var/log/httpd:日誌目錄
日誌文件有兩類:訪問日誌access_log 錯誤日誌err_log
/var/www: 資源文件目錄
html :靜態文件路徑
cgi-bin:動態文件路徑
cgi: Common Gateway Interface httpd經過cgi和各個模塊進行通訊
client --> httpd(index.cgi) --> spawn process(index.cgi) --> httpd --> client
perl, python, java(servlet,jsp), php
cgi工做原理:
1.一個動態請求到Web Server,Web Server判斷cgi類型,建立對應的cgi進程來處理動態請求,並返回html給Web Server,Web Server響應client。動態cgi進程銷燬
2.fast-cgi:cgi進程池,由master-workers模式
一個動態請求Web Server,Web Server和master進程通訊由master分配給worker進程,來處理
這樣Web Server與cgi能夠部署在不一樣Server上
動靜分離:
----->| ------- | | ------------ |
| Apache | | 應用服務器 |
| 若是是靜態的, |
則直接返回
|
若是是動態的,
則請求應用服務器 ------> | |
| -------- |
httpd是不處理動態文件的,而是經過調用模塊,處理,並返回靜態文件
2.源碼編譯
3、Global配置
[root@hfdb0001 conf]# pwd /etc/httpd/conf [root@hfdb0001 conf]# grep "Section*" httpd.conf => 能夠看出配置主要有三段。 ### Section 1: Global Environment => 全局配置項 ### Section 2: 'Main' server configuration => 主Server配置 ### Section 3: Virtual Hosts => 虛擬主機配置(與主Server配置不能同時生效)
ServerTokens OS
http://httpd.apache.org/docs/2.2/zh-cn/mod/core.html#servertokens
ServerTokens Major|Minor|Min[imal]|Prod|[uctOnly]|OS|Full
#超時時間 TCP相關的,如TCP第一次握手後,就不在請求了。
Timeout 120
KeepAlive Off #若是服務器的訪問不大,則須要打開長鏈接
MaxKeepAliveRequests 100
KeepAliveTimeout 15
#是否使用長鏈接(tcp鏈接每次都須要3次握手,而長鏈接,則第一次三次握手後,一直保持鏈接狀態),若是是KeepAlive On,則須要定義MaxKeepAliveRequests 100(即該鏈接打開後,最多能請求的資源數,不能無盡的請求)。這樣一個用戶請求都會最多能請求100個。 KeepAliveTimeout 15.當用戶擁有一個長鏈接,可是並不請求,15s後,即自我銷燬了。
#對於繁忙的Server能夠下降KeepAliveTimeout的值,能夠提升併發
#eg 當第一個請求到來,獲取一個長鏈接,他最多能請求100個,到了後,就會斷開鏈接,從新排隊。這樣下一個請求就能回的鏈接,請求資源,否則,第一個請求永遠擁有鏈接,除非自我斷開。
MPM:Multi-Processing Modules(能夠切換,經過配置文件修改)
當併發請求時,Server是如何工做的
1.mpm_winnt
2.prefork (一個請求用一個進程響應)=>預先會生成多個進程,每一個進程響應一個請求
3.worker (一個請求用一個線程響應)=>生成多個進程,進程不處理,每一個進程生成多個線程,每一個線程來處理請求
多線程共享。當同一個進程下的線程已經打開了文件,其餘線程和讀取,可是存在競爭。須要枷鎖。
4.event (一個進程處理多個請求)
[root@hfdb0001 conf]# httpd -l => 查看全部的模塊,能夠看到當前只支持prefork模型 Compiled in modules: core.c prefork.c http_core.c mod_so.c [root@hfdb0001 conf]# rpm -ql httpd | grep bin /usr/sbin/apachectl /usr/sbin/htcacheclean /usr/sbin/httpd => 是默認的,prefork /usr/sbin/httpd.event /usr/sbin/httpd.worker => 能夠看出Server是支持worker,event的。 /usr/sbin/httxt2dbm /usr/sbin/rotatelogs /usr/sbin/suexec [root@hfdb0001 conf]# httpd.worker -l Compiled in modules: core.c worker.c http_core.c mod_so.c 咱們能夠修改配置文件,使得http.worker是默認的 [root@hfdb0001 conf]# cat /etc/sysconfig/httpd # Configuration file for the httpd service. # # The default processing model (MPM) is the process-based # 'prefork' model. A thread-based model, 'worker', is also # available, but does not work with some modules (such as PHP). # The service must be stopped before changing this variable. # #HTTPD=/usr/sbin/httpd.worker ....
prefork:
<IfModule prefork.c> StartServers 8 => service啓動後,會建立8個進程 MinSpareServers 5 => 最小空閒進程(當有4個請求後,會從新建立一個,保持最少5個) MaxSpareServers 20 => 最大空閒進程(當100個進程空閒後,會被kill,至20個,即最多20個) ServerLimit 256 => MaxClients 256 => 最多能夠處理256個請求,多餘的請求排隊 MaxClients < ServerLimit MaxRequestsPerChild 4000 => 一個進程最多能響應多少次請求(當一個進程響應請求後,空閒了,尚未被kill,此時又有請求過來,並響應,那麼該進程響應次數就加1,當達到4000後,不管如何都會被kill,再可能會生成新進程來響應) </IfModule> [root@hfdb0001 conf]# ps aux|grep httpd => 能夠看到初始是8個httpd root 13180 0.0 0.0 175724 3712 ? Ss 03:52 0:00 /usr/sbin/httpd =>主進程,不處理請求 apache 13182 0.0 0.0 175860 3032 ? S 03:52 0:00 /usr/sbin/httpd apache 13183 0.0 0.0 175860 3036 ? S 03:52 0:00 /usr/sbin/httpd apache 13184 0.0 0.0 175724 2940 ? S 03:52 0:00 /usr/sbin/httpd apache 13185 0.0 0.0 175724 2940 ? S 03:52 0:00 /usr/sbin/httpd apache 13186 0.0 0.0 175860 2960 ? S 03:52 0:00 /usr/sbin/httpd apache 13187 0.0 0.0 175860 2964 ? S 03:52 0:00 /usr/sbin/httpd apache 13188 0.0 0.0 175724 2516 ? S 03:52 0:00 /usr/sbin/httpd apache 13189 0.0 0.0 175724 2516 ? S 03:52 0:00 /usr/sbin/httpd
worker:
<IfModule worker.c> StartServers 4 => 初始生成進程數,到不夠是,會建立新的進程,並生成線程 MaxClients 300 MinSpareThreads 25 => 最小空閒線程數(是全部的進程數的總和) MaxSpareThreads 75 => 最大空閒線程數 ThreadsPerChild 25 => 每一個進程最多能生成多少個線程 MaxRequestsPerChild 0 => 每一個進程最多能響應多少個響應,因爲是有線程響應的,則不作控制,即爲0 </IfModule>
Listen 80 => 監聽該Server上全部的80 端口
Listen 8080 =>能夠監聽多個端口
Listten x.x.x.x:8181 => 能夠指定IP:端口
Include conf.d/*.conf =>加載conf.d目錄下全部conf文件(以段文件形式)
LoadModule path/to/...so
User apache
Group apache =>全部的httpd進程,只有一個是root:root權限啓動的,其餘的都是apache:apache權限
4、虛擬主機配置概述
Socket IP:Port
1.基於IP的虛擬主機(若是一個server有多個ip,而在互聯網上,每一個IP每一年都須要必定的費用)
IP1:80
IP2:80
....:80
2.基於端口的虛擬主機(若是不是標準的80端口,那麼別人沒法知道到底使用的是啥端口,互聯網上很差適用)
IP:80
IP:8080
3.基於域名的虛擬主機(比較好的選擇)
IP:80
主機名不一樣(不一樣的主機名會被解析到同一個IP和端口上)
www.harry1.com => 都會被解析到IP:80上
www.harry2.com => 都會被解析到IP:80上
經過HTTP協議的請求頭的host: 來判斷到底訪問的那臺主機
ServerName:www.harry1.com
ServerAlias:www.harry11.com => 當想www.harry1.com 和 www.harry11.com是同一個Server時
DocuemtRoot /www/harry1.com/
<Directoy "/www/harry1.com"> => 本地文件系統的路徑
.....
.....
</Directoy>
當訪問 http://www.harry1.com/images => 天然會解析到/www/harry1.com/這個目錄下的images
Alias => 當想再訪問http://www.harry1.com/test/images 也要解析到 以前的images目錄,此時須要別名
ErrorLog
CustomLog
<Location "/images"> => URL路徑,能夠再訪問該路徑的時候,做限制
<Location>
ScriptAlias
<VirutalHost HOST>
</VirtualHost>
虛擬主機和中心主機是不能使用的,註釋中心主機的DocumentRoot便可
5、虛擬主機配置
1.基於IP
Host:
ip1:80
ip2:80
註釋httpd.conf的DocuemtRoot配置,即註釋中心主機配置 [root@hfdb0001 conf]# pwd /etc/httpd/conf 在conf.d目錄下新建配置文件 [root@hfdb0001 conf.d]# pwd /etc/httpd/conf.d [root@hfdb0001 conf.d]# ll total 12 -rw-r--r-- 1 root root 392 Aug 13 2013 README -rw------- 1 root root 227 Oct 30 05:39 virtual-ip.conf -rw-r--r-- 1 root root 299 Aug 2 2013 welcome.conf [root@hfdb0001 conf.d]# cat virtual-ip.conf => 前提是要有兩個ip <VirtualHost 10.224.243.1:80> ServerName www.harry1.com DocumentRoot "/www/harry1.com" </VirtualHost> <VirtualHost 10.224.243.2:80> ServerName www.harry2.com DocumentRoot "/www/harry2.com" </VirtualHost> 建立根目錄 注意目錄權限 755 [root@hfdb0001 conf.d]# mkdir -p /www/{harry1.com,harry2.com} 建立index.html 分別訪問10.224.243.1:80 和 10.224.243.2:80 => 會被解析到不一樣的目錄下
2.基於端口
Host:
ip:80
ip:8080
在conf.d目錄下新建配置文件 [root@hfdb0001 conf.d]# pwd /etc/httpd/conf.d [root@hfdb0001 conf.d]# ll total 12 -rw-r--r-- 1 root root 392 Aug 13 2013 README -rw------- 1 root root 227 Oct 30 05:39 virtual-ip.conf-bak -rw------- 1 root root 227 Oct 30 05:39 virtual-port.conf -rw-r--r-- 1 root root 299 Aug 2 2013 welcome.conf [root@hfdb0001 conf.d]# cat virtual-port.conf <VirtualHost 10.224.243.1:80> ServerName www.harry1.com DocumentRoot "/www/harry1.com" </VirtualHost> <VirtualHost 10.224.243.1:8080> ServerName www.harry2.com DocumentRoot "/www/harry2.com" </VirtualHost> 修改主配置,listen 8080 分別訪問10.224.243.1:80 和 10.224.243.1:8080 也會被解析到不一樣的目錄下
3.基於域名
serverName不一樣便可
在conf.d目錄下新建配置文件 [root@hfdb0001 conf.d]# pwd /etc/httpd/conf.d [root@hfdb0001 conf.d]# ll total 12 -rw-r--r-- 1 root root 392 Aug 13 2013 README -rw------- 1 root root 227 Oct 30 05:39 virtual-ip.conf-bak -rw------- 1 root root 227 Oct 30 05:39 virtual-port.conf-bak -rw-r--r-- 1 root root 299 Aug 2 2013 welcome.conf [root@hfdb0001 conf.d]# cat virtual-domain.conf ===> domain須要被解析到該主機上,能夠修改hosts能夠DNS NameVirutalHost 10.224.243.1:80 <VirtualHost 10.224.243.1:80> ServerName www.harry1.com DocumentRoot "/www/harry1.com" </VirtualHost> <VirtualHost 10.224.243.1:80> ServerName www.harry2.com DocumentRoot "/www/harry2.com" </VirtualHost> 分別訪問www.harry1.com 和 www.harry2.com 也會被解析到不一樣的目錄下 注意:若是此時訪問的是10.224.243.1:80 ==> 那麼會被解析到第一個 每一個虛擬主機能夠定義本身的CustomLog,format,error等等
6、其餘配置
1.目錄權限控制
針對某個IP不能訪問www.harry1.com [root@hfdb0001 conf.d]# cat virtual-domain.conf ===> domain須要被解析到該主機上,能夠修改hosts能夠DNS NameVirutalHost 10.224.243.1:80 <VirtualHost 10.224.243.1:80> ServerName www.harry1.com DocumentRoot "/www/harry1.com" <Directory "/var/www/harry1.com"> Options none AllowOverride none Order deny,allow => 注意指定了Order爲deny allow,那麼就只排除 Deny from {ip} </Directory> </VirtualHost> <VirtualHost 10.224.243.1:80> ServerName www.harry2.com DocumentRoot "/www/harry2.com" </VirtualHost>
2. 身份驗證 轉http://www.cnblogs.com/loveCloud/archive/2012/01/12/2320636.html
1、編輯虛擬目錄配置文件,設置認證方式 <VirtualHost 10.224.243.1:80> ServerName www.harry1.com DocumentRoot "/www/harry1.com" <Directory "/var/www/harry1.com"> Options none AllowOverride AuthConfig => 代表須要進行身份驗證(會再虛擬目錄下,查找.htaccess文件) Order deny,allow Deny from {ip} </Directory> </VirtualHost> 注意:也能夠把如下第二步的內容嵌入到Directory節點下。 2、建立.htaccess文件,並配置 vim /var/www/harry1.com/.htaccess AuthName "test" => 僅僅是描述,但最好設置成虛擬目錄的名字,(會在彈出層有體現) AuthType Basic => 驗證類型 AuthUserFile /var/www/harry1.com/.htpasswd => 密碼文件路徑 Require valid-user => 表示驗證成功的用戶均可以訪問 注意:Apache默認系統對.ht開頭的文件默認是不容許外部訪問的。安全性較高。 注意:Require valid-user表示只要htpasswd文件驗證都給的任何一個都可以登錄 也能夠僅僅容許htpasswd文件內的個別用戶 Require user username1 username2 也能夠僅僅容許htpasswd文件內的個別用戶組 Require group group1 group2 注意文件權限: -rw-r--r-- .htaccess -rwxr--r-- .htpasswd 3、建立.htpasswd文件,並配置 htpasswd -c /var/www/harry1.com/.htpasswd {username} 第一次建立用戶用-c ,第二次則不用 ,會提示你輸入密碼的。密碼是加密的 htpasswd -m /var/www/harry1.com/.htpasswd {username} 修改密碼 4、經過用戶組訪問
3.Location配置 相對於Directory是配置本地文件系統路徑的,而Location是針對URL路徑的
<Location /server-status> SetHandler server-status => 該Handler能查看當前系統的狀態,如啓用了多少進程,即各個進程狀態 Order Deny,Allow Deny from all Allow from {ip} </Location>