Apache-httpd

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>
相關文章
相關標籤/搜索