linux上的web服务器搭建
Web服務器
基礎知識篇
1) https:基于openssl的http
? ?http:hypertext transfer protocol 超文本傳輸協議
? ? ? ? ? ? 傳輸文本信息
? ? 80/tcp端口
html: hypertext mark language ?超文本標記語言
c/s架構:client/server
css:Cascading Style Sheet 風格樣式表/層疊樣式表
CGI :common gateway interface 通用網關接口
TCP:Transmission Control Protocol 傳輸控制協議
UDP 是User Datagram Protocol的簡稱,用戶數據報協議
MIME:multipurpose internet mail extensions 多功能聯網郵件擴展
URI: uniform resource indentifier 統一資源標識符
url:uniform resource locator 統一資源定位
urn:uniform resource name ?統一資源命名符
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用于組織代碼用一種業務邏輯和數據顯示分離的方法.
MPM:multipath processing module ?多功能進程模塊
? ? prefork--一個進程響應一個請求
worker:一個進程生成多個線程,一個線程響應一個請求
? ? event:事件驅動模式
HTTP協議詳解之請求篇
http請求由三部分組成,分別是:請求行、消息報頭、請求正文
1、請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協議的版本,格式如下:Method Request-URI HTTP-Version CRLF ?
其中 Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現單獨的CR或LF字符)。
請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:
GET ? ? ?請求獲取Request-URI所標識的資源
POST ? ? 在Request-URI所標識的資源后附加新的數據
HEAD ? ? 請求獲取由Request-URI所標識的資源的響應消息報頭
PUT ? ? ?請求服務器存儲一個資源,并用Request-URI作為其標識
DELETE ? 請求服務器刪除Request-URI所標識的資源
TRACE ? ?請求服務器回送收到的請求信息,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
應用舉例:
GET方法:在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器采用GET方法向服務器獲取資源,eg:GET /form.html HTTP/1.1 (CRLF)
POST方法要求被請求服務器接受附在請求后面的數據,常用于提交表單。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:p_w_picpath/gif,p_w_picpath/x-xbit,... (CRLF)
...
HOST:www.nit.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF) ? ? ? ? ?//該CRLF表示消息報頭已經結束,在此之前為消息報頭
user=jeffrey&pwd=1234 ? //此行以下為提交的數據
HEAD方法與GET方法幾乎是一樣的,對于HEAD請求的回應部分來說,它的HTTP頭部中包含的信息與通過GET請求所得到的信息是相同的。利 用這個方法,不必傳輸整個資源內容,就可以得到Request-URI所標識的資源的信息。該方法常用于測試超鏈接的有效性,是否可以訪問,以及最近是否 更新。
HTTP協議詳解之請求篇
應用舉例:
GET方法:在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器采用GET方法向服務器獲取資源,eg:GET /form.html HTTP/1.1 (CRLF)
POST方法要求被請求服務器接受附在請求后面的數據,常用于提交表單。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:p_w_picpath/gif,p_w_picpath/x-xbit,... (CRLF)
...
HOST:www.nit.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF) ? ? ? ? ?//該CRLF表示消息報頭已經結束,在此之前為消息報頭
user=jeffrey&pwd=1234 ? //此行以下為提交的數據
HEAD方法與GET方法幾乎是一樣的,對于HEAD請求的回應部分來說,它的HTTP頭部中包含的信息與通過GET請求所得到的信息是相同的。利 用這個方法,不必傳輸整個資源內容,就可以得到Request-URI所標識的資源的信息。該方法常用于測試超鏈接的有效性,是否可以訪問,以及最近是否 更新。
HTTP協議詳解之響應篇
HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文
1、狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態代碼、狀態描述、說明:
200 OK ? ? ? //客戶端請求成功
400 Bad Request ? //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報 ? ? ? ? ? ? ? ? ?//頭域一起使用
403 Forbidden ? //服務器收到請求,但是拒絕提供服務
404 Not Found ? //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable ? //服務器當前不能處理客戶端的請求,一段時間后, ? ? ? ? ? ? ? ? ? ? ? ? ?//可能恢復正常
eg:HTTP/1.1 200 OK (CRLF)
Web服務器搭建的過程
一.基于rpm包的 httpd的基礎信息:
首先必須下載安裝httpd服務程序包,其他相應的包,如果沒安裝的也要安裝,這里不再多說。
服務腳本:/etc/rc.d/init.d/httpd
運行目錄:/etc/httpd
配置文件:/etc/httpd/conf/
主配置文件:httpd.conf
擴展配置:/etc/httpd/conf.d/*.conf
socket: http: 80/tcp, https: 443/tcp
網頁文件目錄(DocumentRoot):/var/www/html
CGI: /var/www/cgi-bin/
二.配置文件/etc/httpd/conf/httpd.conf的構成:主服務器和虛擬主機不能同時啟用
全局配置:對主服務器或虛擬機都有效,且有些功能是服務器自身工作屬性;
主服務器:主站屬性;
虛擬主機:虛擬主機及屬性定義
全局配置:
Listen ip:port------------監聽端口
Eg:Listen 172.16.0.0:80監聽172.16網段內所有主機的80端口
# httpd -D DUMP_MODULES ?---------------顯示出所有與httpd有關的模塊
Prefork:多道處理模式的一種,一個進程響應一個請求
主進程功能
(1) 綁定特權端口;
(2) 派發或回收子進程;
(3) 讀取分析主配置文件;
<IfModule prefork.c>
StartServers ? ? ? 8 ? ? ? ? ? ? ? ? ? ? ----------------服務器啟動了的空閑子進程數
MinSpareServers ? ?5 ? ? ? ? ? ? ? ? ? ?----------------最小空閑子進程數,為了保證有足夠的進程能夠接受請求
MaxSpareServers ? 20 ? ? ? ? ? ? ? ? ? ?----------------最大空閑子進程數,為了確保服務器負載不要過大
ServerLimit ? ? ?256 ? ? ? ? ? ? ? ? ? ?-----------------最多允許主進程派生的處于活動狀態的進程
MaxClients ? ? ?256 ? ? ? ? ? ? ? ----------------最大允許的客戶請求,多于上邊的進程就排隊,小于進程服務器就很輕松了
MaxRequestsPerChild ?4000 ? ? ? ? ? ? ? ----------------每個進程在保持連接的時候最多允許多少請求,超出就kill掉
</IfModule>
Worker:多道處理模式的一種,一個進程生成多個線程,一個線程響應一個請求。
<IfModule worker.c>
StartServers ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? 與prefork相似,只不過,這時的進程都變成了線程。
MaxClients ? ? ? ? 300 ? ? ? ? ? ? ? ? ? ? 最多允許連進來的客戶端個數
MinSpareThreads ? ? 25 ? ? ? ? ? ? ? ? ? ? 最小空閑線程
MaxSpareThreads ? ? 75 ? ? ? ? ? ? ? ? ? ? 最大空閑線程
ThreadsPerChild ? ? 25 ? ? ? ? ? ? ? ? ? ? ?每個進程允許生成多少個線程
MaxRequestsPerChild ?0 ? ? ? ? ? ? ? ? ? ? ?0表示無限,子線程永不銷毀
</IfModule>
MaxRequestsPerChild設置的是每個子進程可處理的請求數,0意味著無限,即子進程永不銷毀。雖然缺省設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:
◆ 可防止意外的內存泄漏;
◆ 在服務器負載下降的時侯會自動減少子線程數。
Linux不是真正意義的對線程管理的內核,對進程和線程的管理一樣,因此,在輕量級linux上使用worker模式性能沒有prefork好。所以,默認使用prefork,而不是worker。要啟用worker工作模式,就得修改配置文件/etc/sysconfig/httpd,啟用HTTPD=/usr/sbin/httpd.worker,啟用/etc/sysconfig/httpd配置文件中的HTTPDD=/user/sbin/httpd.worker后,系統再次啟動httpd服務,就是工作在了httpd.worker的工作模式下。
沒有啟動worker工作模式時候的httpd進程
# ps aux | grep httpd
root ? ? ?3664 ?0.0 ?0.3 184252 ?3884 ? ? ? ? ?Ss ? 10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3666 ?0.0 ?0.2 184164 ?2748 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3667 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3668 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3669 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3670 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3671 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3672 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3673 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
apache ? ?3674 ?0.0 ?0.2 184252 ?2540 ? ? ? ? ?S ? ?10:07 ? 0:00 /usr/sbin/httpd
root ? ? ?3676 ?0.0 ?0.0 103244 ? 832 pts/0 ? ?S+ ? 10:07 ? 0:00 grep httpd
啟動worker工作模式后的httpd進程
# ps aux | grep httpd
root ? ? ?3532 ?0.0 ?0.4 184456 ?4088 ? ? ? ? ?Ss ? 10:06 ? 0:00 /usr/sbin/httpd.worker
apache ? ?3534 ?0.0 ?0.2 184172 ?2748 ? ? ? ? ?S ? ?10:06 ? 0:00 /usr/sbin/httpd.worker
apache ? ?3535 ?0.0 ?0.5 528716 ?5428 ? ? ? ? ?Sl ? 10:06 ? 0:00 /usr/sbin/httpd.worker
apache ? ?3536 ?0.0 ?0.5 528716 ?5432 ? ? ? ? ?Sl ? 10:06 ? 0:00 /usr/sbin/httpd.worker
apache ? ?3537 ?0.0 ?0.5 528716 ?5432 ? ? ? ? ?Sl ? 10:06 ? 0:00 /usr/sbin/httpd.worker
root ? ? ?3648 ?0.0 ?0.0 103244 ? 832 pts/0 ? ?S+ ? 10:06 ? 0:00 grep httpd
雖然worker已經啟動,但筆者不明白為什么httpd -l顯示出來的模塊還是prefork,有懂的讀者,請為筆者留言。
# httpd -l ? ? ? ? ? ? ? ? ? ? ? ? ? ?--------------------顯示核心模塊,httpd不需要寫成httpd.prefork,這是默認的
Compiled in modules: ? ? ? ? ? ? ? ? ?-------------------系統默認直接編輯進的模塊
?core.c
?prefork.c
?http_core.c
?mod_so.c
# httpd -t ? ? -----------檢測語法錯誤
# service httpd configtest ? ----測試語法,與上相同
# httpd -D DUMP_MODULES ? 共享模塊
大多數配置修改后,使用service httpd reload即能生效;而修改監聽的地址和端口通常需要重啟服務;
Event:多道處理模式的一種,用來測試,就不做多說了。
Keepalive:保持連接---------長連接
KeepAlive {On|Off}------------------------------空間的服務器使用on,繁忙的服務器使用off,保持連接,請求多了,滿足不了大多數客戶需求。
KeepAliveTimeout 2
MaxKeepAliveRequests 50
配置加載的模塊
LoadModule foo_module modules/mod_foo.so
? ? ? ? ? LoadModule 模塊名稱 ? 模塊路徑
ServerName www.example.com-----定義站點名稱, 要啟用或編輯/etc/hosts,否則會因為web服務器反解ip找尋主機名,如果找到的主機與當前主機名不匹配就會報錯。
如果沒有啟用,/etc/sysconfig/network中定義的主機名為www.website.com,而在/etc/hosts中沒有為主機定義相應的ip,那么就會出現如下錯誤
# httpd -t
httpd: apr_sockaddr_info_get() failed for www.website.com
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
Syntax OK
這是一個很煩人的錯誤,要想通過,必須同時修改兩個地方,即:/etc/hosts和/etc/sysconfig/network
在/etc/hosts文件中添加解析記錄,在/etc/sysconfig/network中將主機名修改為和添加的解析記錄主機名相同。
不過這時,主機還不能識別,需要重新啟動才能識別,不過,通過一條命令可以免除重啟。
#hostname 主機名
這里的主機名要跟上面配置的主機名相同。
也可以在/etc/httpd/conf/httpd.conf文件中直接啟用主機名的 配置。
主服務器配置
DocumentRoot "/var/www/html"-------------定義站點根目錄
<Directory "/var/www/html">------------如果是站點根目錄,定義的是整個站點的屬性,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果是站點上的某個目錄,定義的就是這個目錄的屬性。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 若要對某個目錄進行定義,最好跟站點分開寫。
Options
Indexes: 是否允許索引頁面文件,建議關閉;否則,站點上的內容會被別人下載
FollowSynLinks: 是否跟隨軟鏈接文件;
SymLinksifOwnerMatch:跟隨符號鏈接,文件的屬主必須是系統的屬主
ExecCGI:是否允許執行CGI腳本;
All--------------包含以上所有
None--------------采用默認選項
AllowOverride AuthConfig---是否允許覆蓋----授權是對網頁瀏覽的最高優先級,必須通過才能瀏覽,相當于覆蓋于對ip認證之上
AuthName "Realm"---認證名稱,隨便寫
AuthType Basic----認證類型
AuthUserFile /web/host/userfile----用戶帳號文件
# htpasswd -c -m /web/host/userfile tom------------給授權的目錄添加一個可以訪問的用戶。
-c 表示創建密碼文件,如果文件中有內容,會覆蓋。
-m 表示md5算法
-D 表示刪除某個用戶
# htpasswd -c -m userfile tom-------------添加tom的帳號密碼到userfile文件
# htpasswd -m userfile jerry --------------添加jerry的帳號密碼到userfile文件
# htpasswd -D userfile jerry---------------從文件userfile中刪除jerry的記錄。
</Directory>
Order:定義allow和deny哪個為默認法則;寫在后面的為默認法則:寫在前面的指令沒有顯式定義的即受后面的指令控制;
Order allow,deny--------------------對ip的認證
? ?Deny from 172.16.100.177------------禁止這個ip訪問
Allow from 172.16.0.0/16-------------允許這個網段的所有ip訪問,除了上邊的那個例外。
這種用法在2.4版本中已經不再適用,給某人或者一個組授權,應用
require user username ?允許用戶
require group groupname ?允許組
require host hostname ? 允許這些主機
require all granted ? 允許所有主機
require all deny ?拒絕所有人
注意,在配置虛擬主機的時候,要是對某個目錄進行授權,可能會出現如下錯誤。
錯誤提示
這時,不妨在Allowoverride Authconfig上面加上Order allow,deny;Allow from all 這樣的內容,就可以授權通過了。
虛擬服務器配置
第一步,注釋掉主服務器的DocumentRoot
第二部,添加配置
<VirtualHost 172.16.254.88:80>----------虛擬主機的ip
ServerName www.website.com---------- 網站的名字,輸入效果跟ip相同
DocumentRoot "/web/vhost/"--------------------網站根目錄
? ? CustomLog /web/vhost/logs/access.log common訪問不出錯時,日志的存放位置,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 屬于虛擬主機的主要配置,不能定義在 Directory中
? ? ErrorLog /web/vhost/logs/err.log----------------------訪問出錯時,日志的存放位置,屬于虛擬主機的主要配置
<Directory "/web/vhost/test1">------------------------------目錄授權
? ? Options Indexes------------------------以下三行是ip授權
? ? Order allow,deny
? ? allow from all
? ? Allowoverride Authconfig------------------------以下五行,是授權配置
? ? AuthName "friends"
? ? Authtype Basic
? ? AuthUserFile /web/vhost/userfile
? ? Require valid-user
</Directory>
</VirtualHost>
日志文件配置成功后,訪問成功,日志信息如下
日志文件所在目錄/web/vhost/logs/
# tail logs/access.log
172.16.254.79 - - [21/Aug/2013:13:05:17 +0800] "GET / HTTP/1.1" 304 -
172.16.254.79 - tom [21/Aug/2013:13:05:22 +0800] "GET /test1/ HTTP/1.1" 200 710
172.16.254.79 - - [21/Aug/2013:14:01:47 +0800] "GET /img/skin/templates/thumb/107.png HTTP/1.1" 404 311
172.16.254.79 - - [21/Aug/2013:14:01:47 +0800] "GET /img/skin/templates/thumb/25.png HTTP/1.1" 404 310
172.16.254.79 - - [21/Aug/2013:14:01:47 +0800] "GET /img/skin/templates/thumb/46.png HTTP/1.1" 404 310
172.16.254.79 - - [21/Aug/2013:14:01:47 +0800] "GET /img/skin/templates/thumb/56.png HTTP/1.1" 404 310
172.16.254.79 - - [21/Aug/2013:14:01:47 +0800] "GET /img/skin/templates/thumb/108.png HTTP/1.1" 404 311
172.16.254.79 - - [21/Aug/2013:14:04:02 +0800] "GET / HTTP/1.1" 200 40
訪問失敗,日志信息如下
# tail logs/err.log
[Wed Aug 21 14:01:47 2013] [error] [client 172.16.254.79] File does not exist: /web/vhost/img, referer: http://www.website.com/
[Wed Aug 21 14:01:47 2013] [error] [client 172.16.254.79] File does not exist: /web/vhost/img, referer: http://www.website.com/
[Wed Aug 21 14:01:47 2013] [error] [client 172.16.254.79] File does not exist: /web/vhost/img, referer: http://www.website.com/
[Wed Aug 21 14:01:47 2013] [error] [client 172.16.254.79] File does not exist: /web/vhost/img, referer: http://www.website.com/
[Wed Aug 21 14:01:47 2013] [error] [client 172.16.254.79] File does not exist: /web/vhost/img, referer: http://www.website.com/
[Wed Aug 21 14:07:50 2013] [error] [client 172.16.254.79] File does not exist: /web/vhost/test
配置基于主機的虛擬主機
<VirtualHost 172.16.254.88:80>
? ?ServerName www.a.com
? ?DocumentRoot "/www/website1/"
</VirtualHost>
<VirtualHost 172.16.254.88:80>
? ?ServerName www.b.com
? ?DocumentRoot "/www/website2/"
</VirtualHost>
配置完成后,在物理機上添加www.a.com和www.b.com的解析記錄
這樣,在物理機瀏覽器的地址欄里輸入網址www.a.com或者www.b.com就能驗證其效果了。
注意,如果在地址欄里輸入的是ip地址,瀏覽器會默認選擇web服務器上定義的第一個虛擬機
基于ip的虛擬主機配置
<VirtualHost 172.16.254.80:80>
ServerName www.website1.com
DocumentRoot "/web/vhost/web1"
</VirtualHost>
<VirtualHost 172.16.254.88:80>
ServerName www.website2.com
DocumentRoot "/web/vhost/web2"
</VirtualHost>
配置完成后,在物理機配置hosts信息,否則,瀏覽機無法解析
基于端口的虛擬主機配置
這時,還需要在全局配置中添加一條記錄
Listen 8080------------啟用8080端口
<VirtualHost 172.16.254.80:8080>
ServerName www.website1.com
DocumentRoot "/web/vhost/web1"
</VirtualHost>
<VirtualHost 172.16.254.88:80>
ServerName www.website2.com
DocumentRoot "/web/vhost/web2"
</VirtualHost>
三.補充知識
路徑別名
Alias /imges/ “/test/www/”
這里需要注意幾點
1,/p_w_picpaths/ 和 /test/www/ 格式必須一致,即前后的/不能少
2,/p_w_picpaths/是站點的根目錄下目錄,而/test/www/則是服務器根目錄下的目錄
3,同時在兩個目錄下創建index.html注意,一般網站上的網頁只要不是連接的網頁,一般都需要使用index.html才能被識別。
4,然后再配置文件中全局配置添加記錄Alias /imges/ “/test/www/”
5,若站點名字叫www.web.com,則輸入www.web.com/p_w_picpaths顯示的內容就會變成/test/www/下的index.html文件的內容。
Cgi腳本
可以在目錄中定義,即
<Directory 目錄>
Options ExecCGI
........
</Directory>
也可以定義別名
定義同路徑別名
讓系統上每個用戶都有自己的網站
只需要將配置文件中的UserDir disabled禁用,啟用Userdir public.html,然后在該用戶的家目錄下創建public.html目錄,在該目錄中創建index.html文件并編輯即可。
注意,tom的家目錄訪問權限必須修改。
<IfModule mod_userdir.c>
Userdir public.html
</IfModule>
# mkdir /home/tom/public.html/index.html
# cd /home/tom/public.html
# vim index.html
# chmod o+x /home/tom
服務器的狀態信息
<Location /status>
? ?SetHandler server-status ---------------apache內部獨立的子功能,處理器(server-status)
Authtype Basic------------------沒有啟用基于ip認證order語句,就不用寫allowoverride語句
? ?AuthName "tom"
? ?AuthUserFile "/www/userfile"
? ?Require valid-user
# ? ?Order deny,allow
# ? ?Deny from all
# ? ?Allow from .example.com
</Location>
排錯:
Web出現這種錯誤
# service httpd status
httpd dead but subsys locked
檢查服務腳本中pid文件有沒有寫錯
pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}
編譯安裝 httpd
編譯安裝httpd-2.4.4
依賴于更高版本的apr和apr-util,因此需要事先安裝此兩個包。此外,httpd還依賴于pcre的開發功能,因此,要事先安裝pcre-devel包。
# yum -y install pcre-devle
(1) 編譯安裝apr
# tar xf apr-1.4.6.tar.bz2 # cd apr-1.4.6 # ./configure --prefix=/usr/local/apr # make && make install
(2) 編譯安裝apr-util
# tar xf apr-util-1.5.2.tar.bz2
# cd apr-util-1.5.2
# ./configure --prefix=/
# tar xf apr-util-1.5.2.tar.bz2 # cd apr-util-1.5.2 # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make && make install(3) 編譯安裝httpd
# tar xf httpd-2.4.4.tar.bz2 # cd httpd-2.4.4 # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event # make && make install
httpd 2.4新特性:
1、MPM可于運行時裝載;
--enable-mpms-shared=all --with-mpm=event
2、Event MPM
3、異步讀寫
4、在每模塊及每目錄上指定日志級別;
5、每請求配置;<If>, <ElseIf>, <Else>;
6、增強的表達式分析器;
7、毫秒級的KeepAlive Timeout;
8、基于域名的虛擬主機不再需要NameVirtualHost指令;
9、降低了內存占用;
10、支持在配置文件中使用自定義變量;
--enable-modules=most
新增加的模塊:
mod_proxy_fcgi
mod_proxy_scgi
mod_proxy_express
mod_remoteip
mod_session
mod_ratelimit
mod_request
等等;
對于基于IP的訪問控制
Order allow,deny
allow from all
2.4中不再支持此方法
2.4 使用Require user
Require user USERNAME
Require group GRPNAME
Require ip IPADDR
Require not ip IPADDR
IP
NETWORK/NETMASK
NETWORK/LENGTH
NET
172.16.0.0/255.255.0.0 = 172.16.0.0/16 = 172.16
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME
DOMAIN
www.magedu.com
.magedu.com
允許所有主機訪問:
Require all granted
拒絕所有主機訪問:
Require all deny
Curl------------web站點測試工具之一
curl的常用選項:
? ?-A/--user-agent <string> 設置用戶代理發送給服務器
? ?-basic 使用HTTP基本驗證
? ?--tcp-nodelay 使用TCP_NODELAY選項
? ?-e/--referer <URL> 來源網址
? ?--cacert <file> CA證書 (SSL)
? ?--compressed 要求返回是壓縮的形勢
? ?-H/--header <line>自定義頭信息傳遞給服務器
? ?-I/--head 只顯示響應報文首部信息
? ?--limit-rate <rate> 設置傳輸速度
? ?-u/--user <user[:password]>設置服務器的用戶和密碼
-0/--http1.0 使用HTTP 1.0
實例
Web站點地址為www.a.com
# curl www.a.com-------------j將首頁內容原封不動下載到本地 welcome to my home! # curl -I www.a.com 報文的首部信息 HTTP/1.1 200 OK Date: Fri, 23 Aug 2013 10:04:05 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Thu, 22 Aug 2013 20:43:52 GMT ETag: "460004-14-4e48f591062e8" Accept-Ranges: bytes Content-Length: 20 Connection: close Content-Type: text/html; charset=UTF-8解釋:curl -I ?測試服務器某些頁面是否存在,只需要看響應報文的狀態碼
# curl -I www.a.com/status HTTP/1.1 401 Authorization Required Date: Fri, 23 Aug 2013 10:07:09 GMT Server: Apache/2.2.15 (CentOS) WWW-Authenticate: Basic realm="status" Connection: close Content-Type: text/html; charset=iso-8859-1
解釋:響應報文報錯,因為訪問狀態頁需要密碼,沒有給出密碼就報錯。
可以給出帳號和密碼,用-u選項
# curl -I -u tom:tom www.a.com HTTP/1.1 200 OK Date: Fri, 23 Aug 2013 10:08:50 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Thu, 22 Aug 2013 20:43:52 GMT ETag: "460004-14-4e48f591062e8" Accept-Ranges: bytes Content-Length: 20 Connection: close Content-Type: text/html; charset=UTF-8看下圖是我配置的虛擬主機,正確訪問日志為combined格式,可以通過訪問日志查看curl的訪問信息。
先查看正常訪問信息
# curl www.a.com 正常訪問 # tail -1 /www/website/logs/access.log 查看最后一行信息 172.16.254.1 - - [23/Aug/2013:18:11:37 +0800] "GET / HTTP/1.1" 200 20 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"解釋:172.16.254.1 來自哪個客戶端,訪問時間,使用的http方法,返回的狀態嗎,使用的瀏覽器
# curl -A "mybrother" www.a.com 設置用戶代理,也可以說是模擬一個瀏覽器 # tail -1 /www/website/logs/access.log 172.16.254.1 - - [23/Aug/2013:18:19:35 +0800] "GET / HTTP/1.1" 200 20 "-" "mybrother"
我們可以看到模擬出的效果
# curl -e "www.sohu.com" www.a.com -e 來源網址 # tail -1 /www/website/logs/access.log 172.16.254.1 - - [23/Aug/2013:18:22:02 +0800] "GET / HTTP/1.1" 200 20 "www.sohu.com" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
我們可以看到,打開網頁是從www.sohu.com跳轉而來。
# curl -0 www.a.com -0 所使用的http的版本 # tail -1 /www/website/logs/access.log 172.16.254.1 - - [23/Aug/2013:18:25:22 +0800] "GET / HTTP/1.0" 200 20 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
可以看到HTTP的版本由之前的1.1變成了1.0
轉載于:https://blog.51cto.com/qiufengsong/1279885
總結
以上是生活随笔為你收集整理的linux上的web服务器搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios开发入门资料整理
- 下一篇: linux 其他常用命令