CentOS6中httpd-2.2配置(1)

客戶端和服務器程序套接字鏈接過程,在文章尾部。

CentOS6中httpd-2.2配置(1)

啓動http服務

配置好yum源後,# yum install httpd

# service httpd start-----啓動服務

在/var/www/html/下創建index.html,做一個簡易頁面

[root@yph6 html]# cat index.html 

<h1>hello,world</h1>

瀏覽器地址欄輸入172.16.59.2就可該頁面

注意:SElinux最好關閉,否則很可能不成功

 

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:爲路徑時,是否區分字符大小寫,取決於文件系統;

 

常用配置

 

備份下配置文件

/etc/httpd/conf/httpd.conf

[root@yph6 conf]# cp -pv httpd.conf{,.bak}

`httpd.conf' -> `httpd.conf.bak'

[root@yph6 conf]# ls

httpd.conf  httpd.conf.bak  magic

 

 

1、修改監聽的IP和PORT

Listen  [IP:]PORT

 

(1) IP爲0.0.0.0;表示主機可使用的所有IP

(2) Listen可同時監聽多個端口;

Listen 80

Listen 172.16.59: 8080

(3) 修改監聽socket,重啓服務進程方可生效;

 

[root@yph6 conf]# vim httpd.conf

 

在編輯模式下輸入/Listen,查找Listen字符串,會看到下面幾行

# prevent Apache from glomming onto all bound IP addresses (0.0.0.0) ------監聽地址爲0.0.0.0表示監聽所有該主機可以使用的IP

#

#Listen 12.34.56.78:80

Listen 80  -----監聽0.0.0.0的80端口,即主機說有可用ip的80端口

 

[root@yph6 ~]# ss -tunl    ------ 80前面沒有ip表示被所有ip監聽

Netid     State      Recv-Q Send-Q         Local Address:Port                Peer Address:Port 

tcp      LISTEN        0       128                 :::80                                        :::*        

udp   UNCONN      0        0                 172.16.59.2:53                           *:*    

 

 

[root@yph6 ~]# netstat -tunlp | grep 80    -----會發現是httpd在監聽80

tcp        0      0 :::80               :::*                   LISTEN      3202/httpd         

 

修改監聽端口爲8080,修改後如下:

#Listen 12.34.56.78:80

Listen 8080

 

重啓服務,並發現httpd監聽在8080端口

[root@yph6 conf]# service httpd restart

Stopping httpd:                                            [  OK  ]

Starting httpd:                                            [  OK  ]

[root@yph6 conf]# netstat -tnlp

tcp        0      0 :::8080                :::*                   LISTEN      3370/httpd   

 

瀏覽器地址欄輸入172.16.59.2就不能看到之前定義的頁面了,輸入172.16.59.2:8080纔可以

 

 

2、持久連續

Persistent Connection:tcp連續建立後,每個資源獲取完成後不全斷開連接,而是繼續等待其它資源請求的進行;

 

非持久鏈接:短連接

一個進程請求一個資源後必須斷開重連後再請求另一個資源,因爲可能有好多請求進程在排隊,先打發你走,每人輪流一遍,再來第二輪,防止你一直請求讓其它人一直進不來

 

保持鏈接:長連接,keep=alive,時間,數量

限定每個進程鏈接10秒後斷開或請求10個資源後自動斷開

保持鏈接的副作用:對併發訪問量較大的服務器,長連接機制會使得後續某些請求無法得到正常 響應;

爲了減少副作用:使用較短的持久連接時長,以及較少的請求數量;

 

 

在非保持鏈接下的請求演示:

在vim中輸入/KeepAlive,看到是關閉保持鏈接的

KeepAlive  Off

 

換另一臺主機請求:

[root@yph6 ~]# yum install telnet -y

[root@yph6 ~]# telnet 172.16.59.2  80 ---請求訪問apache主機的80端口;端口不一定是80,端口不對會被拒絕

Trying 172.16.59.2...

Connected to 172.16.59.2.

Escape character is '^]'.

GET /index.html HTTP/1.1 ----http協議版本爲1.1

Host: 172.16.59.2  ------指明要請求的主機。然後連按兩次回車

 

<title>hello,fuck</title>  -----------請求到的資源

Connection closed by foreign host. -------鏈接被自動斷開

 

保持鏈接下的配置

把KeepAlive  Off 改爲KeepAlive  On

[root@yph6 conf]# service httpd restart ---重載服務

換臺主機用telnet測試,發現請求完成後沒有斷開,而是過了幾秒後斷開,因爲有時間限制。

 

在往下面幾行定義的是單次請求數量和時間限制,數量和時間是或關係,任何一項超標就會斷開。

MaxKeepAliveRequests 100  單次請求數量超過100個就自動斷開

KeepAliveTimeout 15   單次請求時間超過15秒就自動斷開

 

 

 

3、MPM多路處理模塊

 

httpd-2.2不支持同時編譯多個MPM模塊,所以只能編譯選定要使用的那個;CentOS 6的rpm包爲此專門提供了三個應用程序文件,httpd(prefork), httpd.worker, httpd.event,分別用於實現對不同的MPM機制的支持;

 

確認現在使用的是哪下程序文件的方法:

# ps  aux  | grep httpd

root       3636  0.0  0.8 185928  3936 ?        Ss   14:16   0:00 /usr/sbin/httpd

apache   3639  0.0  0.6 186060  3148 ?        S    14:16   0:00 /usr/sbin/httpd

默認使用的爲/usr/sbin/httpd,其爲prefork的MPM模塊 ;

 

查看httpd程序的模塊列表

查看靜態編譯的模塊:

# httpd  -l

[root@yph6 conf]# httpd -l

Compiled in modules:

  core.c

  prefork.c  ------說明用的是爲prefork模塊

  http_core.c

  mod_so.c

 

查看靜態編譯及動態裝卸載的模塊:

# httpd  -M

[root@yph6 conf]# httpd -M

so_module (static)

auth_basic_module (shared)

 

更換使用httpd模塊,以支持其它MPM機制;

腳本文件:/etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker ---把這一行取消註釋,表示啓用worker模塊

默認這一行被註釋掉的,所以默認爲prefork;HTTPD=/usr/sbin/httpd.event 表示啓用event模塊,不過httpd-2.2對event支持不夠友好,所以最好不要在此用event。

修改完成後重啓服務進程方可生效,#service httpd restart

 

[root@yph6 conf]# ps aux | grep httpd   ----------編程worker模塊了

apache     3816  0.0  0.6 530396  3352 ?        Sl   15:14   0:00 /usr/sbin/httpd.worker

apache     3818  0.0  0.6 595932  3360 ?        Sl   15:14   0:00 /usr/sbin/httpd.worker

 

MPM的配置

[root@yph6 conf]# vim /etc/httpd/conf/httpd.conf

 編輯模式下輸入/IfModule查找

 

prefork的配置

<IfModule prefork.c>

StartServers       8   ----服務剛啓動時就啓動的子進程數

MinSpareServers    5  -----最小空閒進程

MaxSpareServers   20

ServerLimit      256   -----最大在線進程數量,要大於等於下者

MaxClients       256 -----最大允許多少進程響應用戶請求

MaxRequestsPerChild  4000 ---每個進程處理累計4000個請求後就殺死該進程

</IfModule>

 

worker的配置:

<IfModule worker.c>

StartServers         4----服務剛啓動時就啓動的子進程數

MaxClients         300

MinSpareThreads     25  ---最小空閒線程數

MaxSpareThreads     75 -----最大允許多少進程響應用戶請求

ThreadsPerChild     25   ----每個進程可生成多少個線程

MaxRequestsPerChild  0  不限制數量

</IfModule>

 

bug:啓動4個進程,每個進程25個線程,一共100個線程,但最多允許75個線程,腦殘設定

[root@yph6 conf]# ps aux | grep worker  ----一共3個worker進程,第一個不是,是主控進程

root       3813  0.0  0.8 186136  4140 ?        Ss   15:13   0:00 /usr/sbin/httpd.worker

apache     3816  0.0  0.6 530396  3352 ?        Sl   15:14   0:00 /usr/sbin/httpd.worker

apache     3818  0.0  0.6 595932  3360 ?        Sl   15:14   0:00 /usr/sbin/httpd.worker

apache     3819  0.0  0.6 530396  3360 ?        Sl   15:14   0:00 /usr/sbin/httpd.worker

 

 

[root@yph6 conf]# watch -n0.5 `ps aux | grep worker`

另一終端重啓服務,看到watch監控時剛開始是4個進程,過一會又刪掉一個進程。

 

PV:Page View 頁面瀏覽總量量

UV: User View 用戶訪問總量,按ip區分

 

4、DSO

配置指定實現模塊加載

LoadModule  <mod_name>  <mod_path>

 

模塊文件路徑可使用相對路徑:

相對於ServerRoot(默認/etc/httpd)

 

例如:

[root@yph6 conf]# ll /etc/httpd

....................modules -> ../../usr/lib64/httpd/modules

 

# vim /etc/httpd/conf/httpd.conf

查找/LoadModule,會看到好多模塊,不想啓用的註釋掉就行了

 

 

5、定義'Main' server的文檔頁面路徑

中心主機是物理主機,一箇中心主機只能提供一個網站,而虛擬主機能提供多個網站

[root@yph6 conf]# vim /etc/httpd/conf/httpd.conf

查找/DocumentRoot  會看到

DocumentRoot "/var/www/html",在此定義web服務器的根目錄爲/var/www/html,也可以手動改成其他的位置,

例如改成:DocumentRoot "/web/host1l"

[root@yph6 httpd]# service httpd restart----重啓服務

 

[root@yph6 httpd]# mkdir -pv /web/host1

[root@yph6 httpd]# vim /web/host1/index.html ---創建web的主頁

內容爲<h1>/web/host1</h1>

 

然後在瀏覽器中輸入http://172.16.59.2/就可以訪問剛纔創建的了

 

<Directory "/var/www/html">  做安全訪問控制的,httpd2.2不用改;httpd2.4必須改,否則改上述路徑會失敗。

 

 

6、定義站點主頁面

vim /etc/httpd/conf/httpd.conf

查找:

DirectoryIndex  index.html  index.html.var 定義網站主頁面,默認定義了這兩個,先找第一個,找不到再找第二個,兩個都找不到時,詳解見下一條。



7、站點訪問控制常見機制

 

可基於兩種機制指明對哪些資源進行何種訪問控制

 

文件系統路徑: 例如 /web/host1/index.html

<Directory  ""> ----引號裏面的路徑文件都受訪問控制

...

</Directory>

 

<File  "">  ----對單個文件做訪問控制

...

</File>

 

<FileMatch  "PATTERN">  -----被模式匹配到的所有文件都要受訪問控制

...

</FileMatch>

 

URL路徑:例如 /index.html

<Location  "">

...

</Location>

 

<LocationMatch "">

...

</LocationMatch>

 

 

<Directory>中“基於源地址”實現訪問控制:

(1) Options 定義此目錄下資源的訪問特性

Options後跟1個或多個以空格分隔的“選項”列表;常見的選項如下:

 

Indexes:指明的URL路徑下不存在或者與定義的主頁面資源不相符,把根目錄下的文件列出來給用戶選擇,而不是返回404頁面;對於下載頁面可以用,其他網頁最好別用,不安全。默認是啓動這一項,一定要關掉。

 

FollowSymLinks:跟蹤符號鏈接,允許打開符號鏈接指向的其他目錄下的文件,即使這個文件並不在web服務器上,也不安全,建議關閉。

None:上兩項都不允許,這樣就安全多了。Options Indexes  FollowSymLinks改成Options None

All:所有都允許,有許多個,不止上述兩個

 

Indexes測試

在文件中修改成如下:

<Directory "/web/host1">

Options Indexes  FollowSymLinks

</Directory>

 

然後重啓服務:

[root@yph6 conf]# service httpd restart

[root@yph6 httpd]# mv /web/host1/index.html{,.bak}

[root@yph6 httpd]# ls /web/host1  

index.html.bak    ------------------現在即沒有index.html又沒有index.html.var

[root@yph6 httpd]# touch /web/host1/{a,b,c}  ------再創建幾個文件,便於稍後查看

 

[root@yph6 httpd]# vim /etc/httpd/conf.d/welcome.conf  ---這個一定要改,否則跳轉到apache官方指定頁面去了

 把 Options -Indexes 改爲   Options Indexes


在瀏覽器輸入172.16.59.2會看到下列列表:

a            12-Jan-2016 17:28    0

b            12-Jan-2016 17:28    0

c            12-Jan-2016 17:28    0

index.html   12-Jan-2016 16:25    20


FollowSymLinks測試

[root@yph6 httpd]# ln -sv /etc/fstab /web/host1/test.html

`/web/host1/test.html' -> `/etc/fstab'

瀏覽器輸入http://172.16.59.2/test.html就可以看到/etc/fstab文件的內容了,雖然這個文件並不在web服務器上。

 

 

(2)  AllowOverride

與訪問控制相關的哪些指令可以放在.htaccess文件(網站中每個目錄下都可以有一個這個文件)中;放入這個文件後,在當前配置文件httpd.conf配置的指令就無效,在這個.htaccess文件中配置的纔有效。但是這樣會降低服務器性能,所以用處不大。一般用法爲AllowOverride None。

 

(3) order和allow、deny

控制誰可以訪問指定頁面的資源

order:定義生效次序;allow和deny它兩個誰寫在後面誰默認生效;

 

 

<Directory "/web/host1"> ------"/web/host1"表示針對這單個服務器,對其他服務器不做限制。

Order allow,deny   ----------deny在後,表示都拒絕訪問,除了Allow from定義的ip

    Allow from 172.16.59.0

</Directory >

 

<Directory />   -------表示本主機的所有服務器都生效。

Order deny,allow   ---------allow在後,表示都允許訪問,除了Deny from定義的ip

    Allow from 172.16.59.0

 

</Directory>

 

allow和deny ip的格式:

單個IP

網絡地址NetAddr:以下寫法效果都一樣,看個人喜好

172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

 

用linux主機訪問web服務器:

curl http://172.16.59.2

 

8、定義路徑別名

格式:

Alias  /URL/  "/PATH/TO/SOMEDIR/"

 

# vim /etc/httpd/conf/httpd.conf

在Alias /icons/ "/var/www/icons/"一行下面加一行:

Alias /download/ “/www/htdocs/”

在瀏覽器輸入172.16.59.2/download/,會自動顯示出/www/htdocs/目錄下的頁面,就算不存在download目錄也可以

 

 

9、設定默認字符集

查找AddDefaultCharset,會看到下面一行:

AddDefaultCharset  UTF-8   ------表示用UTF-8字符標準

若改成下面的:

AddDefaultCharset  GBK UTF-8 ----以第一個爲準,即是GBK標準

中文字符集包括:UTF-8 ,GBK, GB2312, GB18030

 

10、日誌設定

錯誤日誌:

# vim /etc/httpd/conf/httpd.conf

查找:/ErrorLog 若顯示出的是後面的,想要看前面的,用#可以向上翻,找到上一個ErrorLog

ErrorLog logs/error_log  -----用的是相對路徑,絕對路徑是/etc/httpd/logs/error_log

 

LogLevel  warn ----定義日誌級別

可用級別如下:

debug, info, notice, warn, error, crit, alert, emerg.

debug:最低,所有出錯的統統記錄下來

notice:開始需要引起注意了

crit:嚴重了

alert:紅色警戒

emerg:十萬火急,千鈞一髮

 

訪問日誌

查找:

CustomLog  logs/access_log  combined 

combined表示記錄的格式,例如要記錄訪問時間,ip,瀏覽器類型等

 

除了combined還有三種類型common,referer,agent,如下:

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

combined混合了下面三種格式,是他們三個的總和;\是用來轉義雙引號的

 

日誌格式類型官方文檔說明:

http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

 

%h:記錄客戶端IP地址;----------172.16.59.0

%l:Remote User, 通常爲一個減號(“-”);登陸名,-

%u:Remote user (from auth; 非爲登錄訪問時,其爲一個減號;用戶名,-

%t:服務器收到請求時的時間;--------------------[12/Jan/2016:19:14:06 +0800]

%r:First line of request,即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本;---------------------------"GET /favicon.ico HTTP/1.1"

%>s:響應狀態碼;404頁面,304等; -----------------404

%b:響應報文的大小,單位是字節;不包括響應報文的http首部;  ----------286

%{Referer}i:請求報文中首部“referer”的值;即從哪個頁面中的超鏈接跳轉至當前頁面的;直接輸入的用“-”表示。

%{User-Agent}i:請求報文中首部“User-Agent”的值;即發出請求的應用程序;瀏覽器程序及curl,爬蟲等。

------------------------------"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"

 

[root@yph6 httpd]# tail -1 /var/log/httpd/access_log

172.16.59.0 - - [12/Jan/2016:19:14:06 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"

 

 

11、基於用戶的訪問控制

通過http協議認證的,可以設置必須登陸才能訪問,但http協議認證密碼是明文的,非常容易被破解;不像是京東是通過服務器數據庫認證的

 

http認證方式:

basic:

digest:摘要認證(不過現在很少使用)

 

認證質詢:

WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼;

認證:

Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過時,則服務器發送響應的資源;

 

安全域:用戶認證後能夠訪問的資源;應該通過名稱對其進行標識,以便於告知用戶認證的原因;

 

用戶的賬號和密碼,由於不是登陸系統的賬號稱爲虛擬賬號

虛擬賬號:僅用於訪問某服務時用到的認證標識

 

賬號密碼存儲位置:

文本文件;

SQL數據庫;

ldap目錄存儲;輕量級目錄服務訪問協議

 

basic認證配置示例

(1) 定義安全域

<Directory "">

Options None

AllowOverride None

AuthType Basic  ------認證類型

AuthName "String“  ------給用戶的提示信息

AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"  -----認證賬號密碼存放的文件

Require  user  username1  username2 ...  -----賬號密碼文件中的這些用戶才能登錄

</Directory>

 

若要允許賬號文件密碼中的所有用戶登錄訪問,則換成下面一行:

Require  valid-user   -----注意 容易寫錯,別忘記把Require後的user刪掉

 

下面演示操作過程:

[root@yph6 httpd]# cd /web/host1

[root@yph6 host1]# mkdir admin

[root@yph6 host1]# vim admin/index.html ---新增一個目錄併爲之創建主頁

<h1>admin page</h1>

 

[root@yph6 conf]# vim /etc/httpd/conf/httpd.conf

添加:

<Directory "/web/host1/admin">

        Options None

        AllowOverride None

        AuthType Basic

        AuthName "fuck you ,please enter your login name and passwd"

        AuthUserFile "/etc/httpd/conf/.htpasswd"

        Require user tom

</Directory>

 

創建用戶賬戶和密碼

[root@yph6 conf]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom

[root@yph6 conf]# htpasswd  -m /etc/httpd/conf/.htpasswd jack

添加兩個用戶tom和jack,併爲之設置密碼。

-c表示創建此文件,如果文件存在會清空文件,所以第二次不能加-c

 

[root@yph6 conf]# httpd -t    -----測試語法錯誤

Syntax OK

[root@yph6 host1]# service httpd configtest -----也可測試語法

Syntax OK

 

[root@yph6 conf]# service httpd reload  ----重載配置文件

 

在瀏覽器中輸入http://172.16.59.2/admin/,會提示你fuck you ,please enter your login name and passwd,登錄tom用戶後就能訪問,但jack不能,因爲沒把jack加入列表;但是這個賬號密碼會保留一段時間,這短時間內不需重新輸入密碼。

 

(2) 提供賬號和密碼存儲的命令

htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username

-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用,如果文件存在會清空文件;

-m:md5格式加密

-s :sha格式加密

-D:刪除指定用戶

 

 

基於組賬號進行認證

(1) 定義安全域

<Directory "/web/host1/admin">

        Options None

        AllowOverride None

        AuthType Basic

        AuthName "fuck you ,please enter your login name and passwd"

        AuthUserFile "/etc/httpd/conf/.htpasswd"

        AuthGroupFile "/etc/httpd/conf/.htgroup"  -------與基於用戶演示,僅新增了這一行,和修改了下一行

        Require group mygrp       ------------修改最後一行

</Directory> 

 

(2)創建組文件

[root@yph6 host1]# vim /etc/httpd/conf/.htgroup  ----由於組不用加密,可以直接vim編輯

mygrp:tom obama   ----每行一個組

[root@yph6 host1]# htpasswd -m /etc/httpd/conf/.htpasswd obama -----剛纔沒添加obama,現在加上

 

[root@yph6 host1]# httpd -t  ------檢測語法

Syntax OK

[root@yph6 host1]# service httpd reload  ----重載配置文件

 

再去瀏覽器測試就會發現只有組內的tom和obama可以登錄,組外的jack無法登錄。

 

 

 

12、虛擬主機:  --------至關重要

通常一個物理主機只能提供一個網站,但一個物理主機可以模擬多個虛擬主機,每個主機可以提供一個網站。對於訪問量不是很大的服務器非常適合做虛擬主機。

一般虛擬機不要與中心主機混用;因此,要使用虛擬主機,得先禁用'main'主機;

禁用方法:註釋中心主機的DocumentRoot指令即可;

 

如何在一臺主機上標示不同網站呢?

站點標識方法: socket

IP相同,但端口不同; ----一旦你不使用80端口,用戶不知道如何訪問

IP不同,但端口均爲默認端口;  -----公網IP收費的,許多IP話費很高的

FQDN,域名不同;

-------通過請求報文中的http首部實現,不是通過IP首部實現。粗略可以理解爲這種socket由FQDN,IP和端口三個組成,域名不同套接字就不同了。

 

 

虛擬主機的配置方法,兩條指令就可以了:

<VirtualHost  IP:PORT>

ServerName FQDN

DocumentRoot  ""

</VirtualHost>

 

其它可用指令:

ServerAlias:虛擬主機的別名;可多次使用;

ErrorLog:虛擬主機自己專用的錯誤日誌

CustomLog:虛擬主機自己專用的訪問日誌

 

<Directory ""> ----基於文件路徑做訪問控制

...

</Directory>

Alias    --------路徑別名

...

 

基於IP的多個虛擬主機配置

(1)配置IP,創建虛擬主機的根目錄及html文件:

[root@yph6 host1]# ifdown eth1  -----關閉eth1網卡,給eht0再配2個IP地址,方便演示

[root@yph6 host1]# ifconfig eth0:0 172.16.59.4/16

[root@yph6 host1]# ifconfig eth0:1 172.16.59.5/16

 

[root@yph6 host1]# mkdir -pv /www/{a,b,c}.com/htdocs ---給三個主機web服務器創建根目錄

 

[root@yph6 host1]# vim /www/a.com/htdocs/index.html -----分別給給三個虛擬主機web服務器創建主頁面

<h1>a.com 172.16.59.2</h1>   -----------------------------文件的內容

[root@yph6 host1]# vim /www/b.com/htdocs/index.html

<h1>b.com 172.16.59.4</h1>

[root@yph6 host1]# vim /www/c.com/htdocs/index.html

<h1>c.com 172.16.59.5</h1>

 

 

(2)修改配置文件:

[root@yph6 host1]# vim /etc/httpd/conf/httpd.conf

註釋掉下面這一行

#DocumentRoot "/web/host1"

[root@yph6 host1]# vim /etc/httpd/conf.d/vhosts.conf ------新建文件並添加下面內容添加

<VirtualHost 172.16.59.2:80>

        ServerName www.a.com

        DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.59.4:80>

        ServerName www.b.com

        DocumentRoot "/www/b.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.59.5:80>

        ServerName www.c.com

        DocumentRoot "/www/c.com/htdocs"

</VirtualHost>

 

[root@yph6 host1]# httpd -t  -----語法檢測

Syntax OK

[root@yph6 host1]# service httpd reload  -----重載配置文件

 

(3)成敗測試:

分別在瀏覽器中輸入172.16.59.2,172.16.59.4,172.16.59.5就可以看到剛纔定義的三個主頁了,親自試驗成功。

不過成功之前歷經波折,剛開始只有b.com,c.com可以正常訪問,a.com還是跳轉到原來的中心主機,怎麼改都不行,DocumentRoot明明註釋掉了,而且把中心主機的根目錄都刪掉了,怎麼可能會訪問到中心主機的主頁呢!?非常詭異。後來回去睡一覺在開機就好了,想想可能是瀏覽器緩存,瞎猜的。不過重啓後只有a.com 可以用,b.com和c.com不能訪問,後來發現是後兩者之前配置的ip是臨時的,重啓後需重新配置,這下就把問題解決了。

 

[root@yph6 ~]# vim /etc/httpd/conf/httpd.conf

把#ServerName www.example.com:80改成下面,並取消註釋

ServerName localhost:80

不改的話語法檢測時會有警告,雖然不是錯誤

 

 

基於端口的虛擬主機

把文件內容改成如下:

Listen 808 -------這兩個端口默認未被監聽,所以要加上

Listen 8080

<VirtualHost 172.16.59.2:80>

        ServerName www.a.com

        DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.59.2:808>

        ServerName www.b.com

        DocumentRoot "/www/b.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.59.2:8080>

        ServerName www.c.com

        DocumentRoot "/www/c.com/htdocs"

</VirtualHost>

 

[root@yph6 ~]# httpd -t

Syntax OK

[root@yph6 ~]# service httpd restart -----改端口後要重啓,而不是重載

 

瀏覽器中分別輸入http://172.16.59.2/,http://172.16.59.2:808/,http://172.16.59.2:8080/,就發現三個頁面都可以訪問了。

 

基於IP和端口是可以混合使用的。

 

 

基於FQDN的虛擬主機

把配置文件改成:

NameVirtualHost 172.16.59.2:80

<VirtualHost 172.16.59.2:80>

        ServerName www.a.com

        DocumentRoot "/www/a.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.59.2:80>

        ServerName www.b.com

        DocumentRoot "/www/b.com/htdocs"

</VirtualHost>

<VirtualHost 172.16.59.2:80>

        ServerName www.c.com

        DocumentRoot "/www/c.com/htdocs"

</VirtualHost>

 

語法檢查及重啓服務

[root@yph6 ~]# httpd -t

Syntax OK

[root@yph6 ~]# service httpd restart

 

修改hosts文件:

[root@yph6 ~]# vim /etc/hosts ------win7修改hosts文件方法與linux完全一樣,也是下面兩種形式

172.16.59.2 www.a.com www.b.com www.c.com

或者

172.16.59.2 www.a.com a.com

172.16.59.2 www.b.com b.com

172.16.59.2 www.c.com c.com

 

測試結果:

[root@yph6 ~]# curl www.a.com

<h1>a.com 172.16.59.2</h1>

[root@yph6 ~]# curl www.b.com

<h1>b.com 172.16.59.4</h1>

[root@yph6 ~]# curl www.c.com

<h1>c.com 172.16.59.5</h1>

 

 

13、status頁面

此頁面可以顯示整個服務器的各進程的狀態,一般此頁面不允許外人看到的

[root@yph6 ~]# vim /etc/httpd/conf/httpd.conf

確保此模塊是裝載的,即這一行沒被註釋掉

LoadModule status_module modules/mod_status.so 

 

然後仍在此文件查找下面內容

#<Location /server-status>

#    SetHandler server-status

#    Order deny,allow

#    Deny from all

#    Allow from .example.com

#</Location>

然後修改成下面內容,取消註釋

<Location /server-status>

SetHandler server-status

Order allow,deny

Allow from 172.16

</Location>

 

[root@yph6 ~]# httpd -t ----語法檢測

Syntax OK

[root@yph6 ~]# !ser  -----表示引用上一個以ser開頭的命令

service httpd restart-----重啓

 

瀏覽器訪問http://www.a.com/server-status會看到Apache Server Status for www.a.com頁面。

 

__W__K__........................................................

................................................................

................................................................

................................................................

 

一共有8個進程,一個K狀態,一個W狀態,其餘是空閒狀態

Scoreboard Key:

"_" Waiting for Connection,  表示空閒狀態

"S" Starting up,  正在創建

"R" Reading Request,正在讀取請求

"W" Sending Reply, --表示正在發送響應的進程

"K" Keepalive (read), 正在讀取

"D" DNS Lookup, 正在進行DNS查詢

"C" Closing connection, 正在關閉鏈接

"L" Logging, 正在近路日誌

"G" Gracefully finishing,正在優雅關閉,已經啓動關閉模式,等待對方把進程完全關閉,然後自己才關閉

"I" Idle cleanup of worker, 空閒的清理線程

"." Open slot with no current process空閒位,每個空閒位都可啓動一個進程

 

PID Key: 這8個進程的進程號,和所處狀態

   4153 in state: _ ,   4154 in state: _ ,   4155 in state: W 

   4156 in state: _ ,   4157 in state: _ ,   4158 in state: K 

   4159 in state: _ ,   4160 in state: _ ,



客戶端和服務器程序套接字鏈接過程:


wKioL1aWUvjyhXoRAABXJtZGCOk305.png



服務器:

socket:向內核或庫發起socket庫調用,創建套接字;

bind:套接字綁定端口,例如web服務器綁定80端口(IP+端口組成;會霸佔一個端口,其他套接字就不能再用此端口)

listen:監聽此套接字上,監聽並不一定接待

accept:處於等待隨時接客的狀態,如果一直沒有客戶端請求,則一直等待接客(也叫阻塞或睡眠狀態)一旦客戶機的connect到達,就立即經過三牽手建立連接,

read:從套接字裏讀取客戶的請求,看它想要什麼

write:然後處理後,把客戶想要的東西寫入套接字

read:服務器讀到了客戶機的分手請求,心想你妹啊,分就分。

close:關閉服務,等待遇到新的另一半。

客戶端:

connect:拿着服務器ip和端口,並連接服務器

write:在三牽手中的第三次牽手時,客戶機把請求寫入套接字,(把找服務器的第一件事告訴它);一切皆文件,套接字也是文件,寫入文件。

read:從套接字裏拿走自己想要的,如果一件事辦完後還想辦第二件事,就繼續write

close:客戶端已經拿到自己想要的東西了,就應該把分手把服務器甩了,即關閉請求。經過四次分手。



TCP FSM:有限狀態機狀態轉換

closed listen syn_sent syn_recv establish fin_wait1 close_wait fin_wait2 last_ack timewait closed

鏈接三牽手:每個連接都是單向的

一牽手:客戶機的請求進程請求,服務器受到後,用自己的接收進程與之配對

二牽手:服務器的請求進程請求,客戶機接收進程再與之配對

三牽手:服務器與之應答,告訴客戶機連接建立完成,確立戀愛關係


四次分手圖例:
wKiom1aWUsbRxUZGAAEe19rUVi0383.jpg


斷開四分手:

一分手:客戶機說要分手,要關閉一牽手時的請求進程

二分手:服務器同意,關閉與之配置的進程

三分手:服務器說要關閉二牽手時的請求進程

四分手:客戶機同意並關閉與之配對的進程

 

四分手:

a:客戶機提出分手

b:服務器同意分手

c:客戶機收到服務器的同意回答

d:服務器把之前的信件都還給客戶端

e:客戶機收到還回來的信件

f:客戶端把服務器的信件還給服務器

g:服務器收到信件,分手完成

 

fin_wait1:a-c

fin_wait2:c-e

time_wait:e-f,應爲報文傳輸時間的二倍

close_wait:b-d

last_ack:d-g

closed:g--重回單身時代,listen



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章