HTTP的基本操作 3月17資源子網和通信子網套接字:兩類 socket:IP port IP:port Ip.port unix sock:基於文件系統通信實現 BSD發明: MTU:最大傳輸單元傳輸層協議: 面向連接的:TCP 虛連接(95%) 無連接的:UDP套接字的類型: TCP套接字 UD ...
HTTP的基本操作
3月17
資源子網和通信子網
套接字:兩類
socket:IP port
IP:port
Ip.port
unix sock:基於文件系統通信實現
BSD發明:
MTU:最大傳輸單元
傳輸層協議:
面向連接的:TCP
虛連接(95%)
無連接的:UDP
套接字的類型:
TCP套接字
UDP套接字
raw套接字(由程式自身維護)
物理層=硬體
數據鏈路層=驅動
通信:點對點
c/s(client/server)
客戶端的為隨機埠
c/s:
通信子網:只負責傳輸,內容是什麼不管
, 應用層協議:特定的
http,https,smtp,pop,imap,ftp,ldap
http 超文本傳輸協議(hyprttext transport protcol)
html:hypertext mark language(超文本標記語言)
client:browser
URI(統一資源提示符)的子集:URL(統一資源定位符)
server:http server
GUI
CLI
html格式的文件
<html>
<head>
<title></title>
</head>
<boby>
<h1></h1>
<p><img src=""></p>
<h2></h2>
<p> <a href="a.html" > </a> </p>
</body>
</html>
css: Cascading style sheet(層疊樣式表)
動態頁面:
程式腳本
客戶端
伺服器端 CGI(common gateway interface程式通用介面)
c,c++
perl
python
php
asp.net
jsp
一個頁面中可能會包含多個頁面對象
URI:Uniform Resource Identifier
URL: Uniform Resource Locator
方案:主機地址:資源
http協議的版本:
http0.9:只能傳輸html文檔,1991年
http1.0:支持多媒體數據的處理,保持連接。有緩存功能
http1.1:支持更多的請求方法,更加精細的緩存控制,持久連接
MIME:multipurpose Internet mail extension 互聯網多用戶郵件擴展
nase64:將二進位數據編碼成文本發送,並能夠讓接受方還原回原來的格式
HTTP報文:
HTTP事務:一次請求以與其對應的響應
HTTP方法:GET、PUT、HEAD、POST、DELETE
HTTP請求:request
HTTP請求報文
報文格式:
<method><request-url><version>
<headers>首部
<entity-body>
首部:
name:value
content-type:images/gif
分三類:
通用首部
請求首部
響應首部
HTTP響應:response
HTTP響應報文
報文格式:
<version><status><reason-phrase>
<headers>
<entity-body>
<method>:請求方法,希望伺服器端執行的動作,如GET、HEAD、POST等
<request-url>:請求的資源,可以是相對路徑,也可以是完整的URL
<version>:協議版本,格式HTTP/,如http/1.0
<major>。<minor>多媒體主類型/從類型
<headers>:HTTP首部
<status>:狀態碼
<reason-phrase>:原因短語,數字狀態嗎易讀信息
<entity-body>:主體部分
http協議:是一種stateless(無狀態)協議,
一次HTTP事務結束後,鏈接即行斷開,例如一次請求需要TCP的三次握手,然後請求到一個文件後斷開。那麼如果有100個文件。就需要執行100次這樣的過程。
加速方式:
並行請求:即利用多線程。第一次連接是直接反問,後續才用並行
持久連接:保持TCP的連接。
伺服器的連接是有限的,連接用戶達到閾值時,後續用戶就得排隊。所以持久連接也需要斷開。斷開的方式:給予請求文件最大的數量和請求持續的時間。哪個超過或達到要求了便斷開。而例如設置時間為10S 那麼對於一個繁忙的伺服器來講,後續的用戶便需要等待10S。所以是否持久,如何選擇到一個最佳分配點,是運維時間分配的重要方向。
HTTP的請求方法:
安全的方法:GET、HEAD
POST、PUT、DELETE、OPTIONS、TRACE
擴展方法:LOCK、MKCOL、COPY、MOVE
GET:請求獲取一個資源,需要伺服器發送
HEAD:跟GET相似,但其不需要服務發送資源而僅傳迴響應首部
POST:支持HTML表單提交,表單中有用戶填入的數據,這些數據會發送到伺服器端,由伺服器存儲至某位置(例如發送處理程式)
PUT:與GET相反,向服務寫入文檔;發佈系統
DELETE:請求刪除URL指向的資源
OPTIONS:探測伺服器端對某資源所支持的請求方法
TRACE:追蹤請求資源要經過的防火牆、代理或網關等
響應報文代碼
1XX:信息性狀態碼
100:
2XX:成功狀態碼
200:OK
201:Created OK
3XX:重定向狀態碼
301:Moved Permanebtly 永久重定向,在響應報文中使用首部“Location:URL”指定資源現在所在的位置
302:Found 臨時重定向,在響應報文中使用首部“Location:URL”指定臨時資源位置
304:Not Modified,條件式請求中使用
4XX:客戶端的錯誤
403:Forbidden,請求被伺服器拒絕
404:Not Found,伺服器無法找到請求的URL
405:Method Not Allowed,不允許使用此方法請求響應的URL
5XX:伺服器類的錯誤
500:Internal Server Error,伺服器內部錯誤
502:Bad Gateway:代理伺服器從上游收到一條偽響應
503:Service Unavailable,伺服器此時無法提供服務,但將來可能可用
HTTP首部
通用首部:請求和響應都可以使用的
請求首部:
響應首部:
實體首部:用於指定實體屬性
擴展首部:非標準首部,可能是由程式開發者創建的,例如X-Forward-For
通用首部:
Connection:定義C/S之間關於請求/響應的有關選項
對於http/1.0,Connection keep-alibe
Via:顯示了報文經過的中間節點
Cache-Control:緩存指示
Pragma
請求首部:
Cilent-IP:請求端IP
Host:請求的主機名和埠號,虛擬主機環境下用於不同的虛擬主機
Referer:指明瞭請求當前資源的原始資源的URL
User-Agent:用戶代理,使用什麼工具發出的請求
Accept首部:用戶標明客戶自己更傾向於支持使用的能力
Accept:指明伺服器能發送的媒體類型
Accept-Charset:支持使用的字元集
Accept-Encoding:支持使用的編碼方式
Accept-Language:支持使用語言
條件請求首部:
Expect:期望的行為
If-Modified-Since:是否在指定的時間以來修改過此資源(一般用於詢問緩存是否修改過),沒有修改過發304
If-None-Match
跟安全相關的請求首部:
Authorication:客戶端提交給服務端的認證數據,如賬號和密碼
Cookie:客戶端發送給伺服器端身份標識
Cookie2
響應首部:
Age:響應持續的時間
Server:向客戶端標明伺服器程式名稱和版本
協商首部:
Accept-Ranges:對當前資源來講,伺服器所能夠接受的範圍類型
Vary:首部列表,伺服器會根據列表中的內容挑選出最適合的版本發送給客戶端
跟安全相關的響應首部
Set-Cookie:伺服器端在某客戶端第一次請求時發給的令牌
Set-Cookie2:
WWW-Authenication:質詢,即要求客戶端提供賬號和密碼
實體首部:
Location:資源的新位置
Allow:允許對此資源使用的請求方法
內容首部:
Contern-Encoding
Contern-Language
Contern-Length
Contern-type
Contern-Range
Contern-Location
緩存首部:
ETag:實體標簽
Expires:過期標簽
Last-Modified:上一次的修改時間
回顧:
1.IPC(Inter Process Communication)進程通信
同一主機進程
信號、旗語、shm
Unix Sock
跨主機的進程
rpc
socket
緩存:內核所維護的記憶體空間
Client:
GUI:
IE、Fierfox、Safari、chrome、Opera
CLI:
elinks,curl
Server:
靜態
ASF:httpd
Nginx
lighttpd
gws
APP Server
IIS
tomcat
jetty
resin
http:html
http/1.0
一個Web請求的基本過程
建立連接
接收請求
處理請求
訪問資源
構建響應
發送響應
記錄日誌
Web伺服器的輸入輸出結構
單線程I/O結構
多線程I/O結構 一個線程響應一個請求 與復用的I/O結構的區別是同一個文件需要被讀取多次,降低了記憶體使用率,但是即使一個線程奔潰,其他線程不受影響,安全性增加
復用的I/O結構 單個線程響應多個請求,增加記憶體使用率, 但是不安全。
復用多線程I/O結構:多個線程,每個線程響應多個請求 其實就是多個復用的I/O結構
sendfile:可以讓內核在取出請求的文件後直接調用系統功能加工成報文,發送給客戶端。這是一種優化機制,但是不能對過大的文件提供此服務
日誌寫入緩衝,再由緩衝寫入磁碟。緩衝有多大需要根據情況來調配。因為緩衝中的數據在電腦突然崩潰時就會被清除。
httpd:俗稱apache
a pachey server=apache
www.netcraft.com
httpd:高度模塊化
core+modules
DSO:Dynamic Shared Object 動態模塊對象
MPM:Multipath Processing Module
多道處理模塊,非一個模塊,而是對一種特性的稱謂
prefork:一個進程一個請求(預先創建好),有最小空閑進程數和最大空閑進程數。select():1024 規定最多涌進來的請求數
worker:一個進程多個線程,一個線程一個請求,與上述的prefork兩者性能其實不分伯仲,實際上並沒有改變一個線程一個請求的本質,但是節省了很多記憶體
實際上prefork和worker都是上述所說的結構中的多線程I/O結構
event:一個線程響應多個請求,不生成進程
event-driven:事件驅動,主要目的在於實現進程響應多個請求 屬於復用多線程I/O結構
上述幾種工作方式其實都是由一個主進程來創建子進程來實現,主進程也負責回收子進程
http版本
http-1.3
http-2.0
http-2.2,不支持event
http-2.4
httpd的功能特性:
路徑別名:alias
用戶認證:authentication
虛擬主機:virtual host
反向代理:
負載均衡:
用戶站點:
CGI:Common Gateway Interface
安裝httpd
yum -y install httpd
服務腳本:/etc/rc.d/init.d/httpd
腳本配置文件:/etc/sysconfig/httpd
運行目錄:/etc/httpd
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
擴展配置:/etc/httpd/conf.d/*.conf 可以被主配置文件所調用
Socket:80/tcp,443/tcp
文檔根目錄:/var/www/html
CGI:/var/www/cgi-bin/ 能夠執行的動態腳本
日誌滾動:
日誌切割
時間、空間
Docroot:文檔根目錄 /var/www/html/
配置文件:
/etc/httpd/conf/httpd.conf
配置參數 值
配置指令不區分字元大小寫
值有可能區分大小寫
有些指令可以重覆出現多次
配置文件格式
全局配置
主機配置:用於僅提供一個站點時
虛擬主機配置:用於提供多個站點時
配置文件語法測試
serviice httpd configtest
httpd -t
絕大多數配置修改後,可以用過service httpd reload 來生效,如果修改了監聽的地址或埠,必須重啟服務才能生效
1.監聽套接字
Listen [IP:]port
此指令可以出現多次,用於指定監聽多個不同的套接字
Listen 80
Listen 172.16.100.7:8080
2.配置使用Keepalive
KeepAlive {On|Off}
KeepAliveTimeout 2 超時時間
MaxKeepAliveRequests 50 最大連接
3.MPM
多道處理模塊
httpd -l 查看編譯進內核的模塊
想使用不同的機制,修改配置文件即可 /etc/syconfig/httpd文件
<IfModule preforck.c>判斷模塊是否存在
StartServers 8 預設啟動的工作進程數
MinSpareServers 5 最少空閑進程數
MaxSpareServers 20 最大空閑進程數
ServerLimit 256 最大活動進程數
MaxClients 256 最大併發連接數,最多允許發起的連接請求的個數
MaxRequestsPerChild 4000 每個子進程在生命周期內最大允許服務的最多請求個數
</IfModule>
<IfModule worker.c>
StartServers 4 啟動的子進程的個數
MaxClients 300 最大併發連接數,最多允許發起的連接請求的個數
MinSpareThreads 25 最少空閑線程數
MaxSpareThreads 75 最大空閑線程數
ThreadsPerChild 25 每個子進程生成的線程數
MaxRequestsPerChild 0 每個子進程在聲明周期內最大允許服務的最多請求個數
</IfModule>
4、DSO模塊的載入方式
LoadModule module_name /path/to/module
如果使用相對路徑,則對於ServerRoot所定義的位置而言
LoadMoudule php5_module /usr/lib64/httpd/modules/php.so
讓服務重載配置文件方能生效
httpd -m 列出與載入到所有DSO模塊與非DOS模塊
不想載入某個模塊的話,配置文件中註釋掉即可
5、配置站點根目錄
DocumentRoot /path/to/somewhere
6、頁面訪問屬性
<Direcotry "/path/to/somewhere">
Options 選項
Indexes:缺少指定的預設頁面時,允許將目錄中的所有文件已列表形式返回給用戶:危險:慎用
FollowsymLinks:允許跟隨符號鏈接所指向的原始文件
None:所有都不啟用
All:所有的都啟用
ExecCGI:允許使用mod_cgi模塊執行CGI腳本
Includes:允許使用mod_include模塊實現伺服器端包含(SSI)
IncludesNOEXEC:允許包含但不允許執行腳本
MultiViews:允許使用mod_negotiation實現內容協商
SymLinksIfOwnerMatch:在鏈接文件屬主屬組與原始文件的屬主屬組相同時,允許跟隨符號連接所指向的原始文件
AllowOverride 用戶認證的配置
</Direcotry>
可以使用正則表達式,使用~
7.基於主機的訪問控制
<Direcotry "/path/to/somewhere">
Options
AllowOverride
None 不禁用下麵
order 次序,寫在後面的為預設 即兩者都有或者兩者都沒有的情況下,以寫在後面的為預設
Allow from
Deny from
</Direcotry>
如果都匹配或都不匹配時以預設為準
否則則以匹配到的為準
Allow from
Deny from
IP,Network Address
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
基於用戶做訪問控制
8.定義預設主頁面
DirectoryIndex index.html 123.html 。。。依次查找
9.用戶目錄
如果期望讓每個用戶都可以創建個人站點:http://Server_IP/~Username/
userdir disablied:禁止
userdir public_html:
public_html是用戶家目錄下的目錄名稱,所有位於此目錄中的文件均可通過前述的訪問路徑進行訪問
用戶的家目錄得賦予進行httpd進程的用戶擁有執行許可權
setfacl -m u:apache:x ~Username
10、配置日誌功能
/var/log/http/
access.log:訪問日誌,其需要記錄的內容需要自定義
error.log
訪問日誌:
CustomLog "/path/to/log_file" LogFormat
LogFormat定義日誌格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
%h:客戶端地址
%l:遠程的登錄名,通常為-
%u:認證時的遠程用戶名,沒有認證時為-
%t:接收到的請求時的時間,為標準英文格式時間+時區
\" :轉義,顯示""
%r:請求報文的起始行
%>s:響應狀態碼,
%b:以位元組響應報文的長度,不包含http報文
%{Header_Name}i:記錄指定請求報文首部的內容(value)
%u:請求的URL
詳情請參考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
錯誤日誌:
ErrorLog
11、路徑別名
Alias /alias/ "/path/to/somewhere/"
意味著訪問http://Server_IP/alias時,其頁面文件來自於/path/to/somewhere/中
12、指定預設的字元集
AddDefaultCharset
HTTP基本操作丶編譯
MIME:多媒體類型
major/minor
HTML: text/html
ASCII:text/plagin
JPEG:image/jpeg
GIF:image/gif
QuickTime(流媒體):video/quicktime
13.腳本路徑別名(CGI介面)
URL-->FileSystem Directory
CGI:Common Gateway Interface(通用網關介面)使WEB伺服器可以跟一個應用程式進行通信,該應用程式將運行的結果返還給WEB伺服器。從通信環境中獲得結果。 如當你訪問一個腳本時,可能返回的只是腳本的文本內容,這時就需要伺服器利用CGI進行通信,讓shell解釋器將腳本運行的結果返還
CGI是不安全的 所以現在極少被使用。取而代之的是php,python等腳本語言使用的 不同的介面
在第一行寫入
echo “Content-Type:text/html:
mod_alias,mod_cgi
ScriptAlias /URL/ "/path/to/somewhere" somewhere 例如配置時ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 訪問時 http://IP/cgi-bin/文件名
CGI文件需要放在此目錄下才可以被執行
也可以在目錄中實現
腳本格式一般為
cat << EOF
Content-Type:text/html
<pre>
The time is : `date`.
</pre>
EOF
14.基於用戶的訪問控制
虛擬用戶:不是系統用戶,只是為了獲取某種資源類型的一種虛擬的用戶
文件/etc/httpd/conf/.htpasswd
SQL資料庫
dbm:
ldap:輕量級目錄訪問協議
認證類型(auth):
basic:基本認證,賬號和密碼明文發送
digest:摘要認證,hash編碼之後發送
認證提供者(authentication provider):賬號和密碼的存放位置
authn
授權機制(authorization):根據什麼進行授權
案例:基於文件,做基本認證 根據用戶和組進行授權
1、編輯配置文件,為需要認證的目錄配置認證機制
<Directory "/www/htdocs/fin">A
options None
AllowOverride AuthConfig 使用認證配置
AuthType Basic 使用基本認證
AuthName "Private Area" 質詢時標題
AuthUserFile /etc/http/conf/.htpasswd 密碼的存放位置
Require vaild-user 可訪問的用戶
</Directory>
2、使用htpasswd命令使用生成認證庫
htpasswd
-c 創建密碼,創建第一個用戶時使用 ,後續在同一個身份認證庫中添加用戶名和密碼時記得不需要加-c選項,否則會覆蓋掉原有文件
htpasswd -c -m /etc/http/conf/.htpasswd tom
-m MD5格式存放
-b 批量模式
-D 刪除用戶
3、基於組認證
<Directory "/www/htdocs/fin">
options None
AllowOverride AuthConfig 使用認證配置
AuthType Basic 使用基本認證
AuthName "Private Area" 質詢時標題
AuthgroupFile /etc/http/conf/.htpasswd 密碼的存放位置
Require group GroupName 可訪問的用戶
</Directory>
先創建用戶,在創建組
組文件:
組名:用戶1 用戶2 用戶3
15.虛擬主機
一個物理伺服器提供多個站點;使用虛擬主機得先取消中心主機(預設主機)
基於不同的IP實現不同的虛擬主機
變化IP
基於不同的port實現不同的虛擬主機
變化port
基於不同主機名實現不同的虛擬主機
變化ServerName的值
通過請求報文中的HOST來實現不同的虛擬主機訪問 首先要將上面的#NameVirtualHost *:80註釋去掉,並且在VirtualHost中IP:port都需要以*:80來標註 還要修改LINUX機中的主機指向地址,WINDOWS中也需要進行一些修改。
<VirtualHost IP:port>
SeverName
DocumentRoot ""
<Directory "">
</Directory>
ServerAlias
ServerAdmin
</VirtualHost>
將全局中的DocumentRoot""註釋掉
虛擬主機的單獨配置
用戶認證
訪問日誌
錯誤日誌
別名
腳本別名
基於IP認證機制,基於用戶認證
http協議認證、表單認證
16.https協議
x509.3證書格式
證書格式的版本號
證書序列號
證書簽名演算法
證書頒發者
有效期
持有者的名稱
持有者的公鑰
CA的ID
持有者的ID
其他擴展信息
基本約束
證書策略
密鑰的使用限制
CA簽名
ssl握手要完成的工作
交換協議版本號
選擇一個雙方都支持的加密方式
對兩端實現身份驗證
密鑰交換
http:文本協議 80/tcp
https:二進位格式的協議 443/tcp
SSL會話基於IP地址進行:不支持在基於主機名的虛擬主機上實現 因為SSL回話進行是在DNS功能變數名稱解析後進行的,所以進行的還是IP地址的通信
客戶端驗證伺服器端證書時:
日期檢查:證書是否在有效期內
證書頒發者的可信度
證書的簽名檢測:
持有者的身份檢測
httpd:基於mod_ssl模塊實現對ssl的支持
可以在/etc/pki/tls/certs
openssl s_client
-connet:驗證的地址:埠
-CAfile:CA證書的路徑
1)、準備好伺服器的私鑰和證書
2)、安裝mod_ssl模塊
yum -y install mod_ssl
3)、配置/etc/httpd/conf.d/ssl.conf
配置實用ssl的虛擬主機
ServerName
DocunmentRoot
配置證書和私鑰
SSLCertificatFile 證書文件
SSLCertificatKeyFile 密鑰文件
4)、重啟httpd服務
5)、測試
openssl s_client -connet:驗證的地址:埠 -CAfile:CA證書的路徑
URL Rewrite:URL重寫
17、伺服器status頁面
內生的status信息,且此信息可以通過web予以顯示
基於文件系統路徑訪問屬性
<Directory [~] "">
</Directory>
基於URL訪問屬性
<Location [~] "">
</Location >
也可以使用<LocationMatch "">
</LocationMatch>來實現正則表達式的配置
基於單個文件的訪問屬性
<File [~] "">
</File>
如果要配置其屬性的URL能映射到某具體文件系統路徑,建議使用<Directory>
處理器:當文件被調用時,Apache內部表現形式:一般每種文件類型都有其隱式處理器;否則需要自己定義
顯式的定義使用的處理器:SetHandler
<Location /URL>
setHeandler server-status
</Location>
定義訪問控制機制
基於IP控制
基於用戶控制
示例:
<Location /server-status>
SetHandler sever-status
AuthType Basic
AuthName "Sever Status"
AuthUserFile "/etc/http/conf/.htpasswd"
Require valid-user 允許所有用戶
Order deny,allow
Allow from all
</Location>
18、curl命令
curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議。curl支持HTTPS認證,並且支持HTTP的POST、PUT等方法, FTP上傳, kerberos認證,HTTP上傳,代理伺服器, cookies, 用戶名/密碼認證, 下載文件斷點續傳,上傳文件斷點續傳,,http代理伺服器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理伺服器,,通過http代理伺服器上傳文件到FTP伺服器等等,功能十分強大。
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
19、使用mod_deflate模塊壓縮頁面優化傳輸速度,可以寫為一行,也可以寫多行,預設為gzip
SetOutputFilter DEFLATE
# mod_deflate configuration
<IfModule mod_deflate.c>
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)預設為6
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
</IfModule>
擴展功能
apachectl
Apache HTTP服務控制工具
ab
Apache HTTP伺服器性能測試工具
apxs
Apache 擴展工具
configure
配置源代碼
dbmmanage
為基本認證創建和更新DBM格式的用戶認證文件
htcacheclean
清理磁碟緩存
htdigest
為摘要認證創建和更新用戶認證文件。
htdbm
操作 DBM 密碼資料庫。
htpasswd
為基本認證創建和更新用戶認證文件。
httxt2dbm
為 RewriteMap 創建 dbm 文件。
logresolve
將 Apache 日誌文件中的 IP 地址解析到主機名稱。
rotatelogs
不關閉 Apache 而切換日誌文件。
suexec
執行外部程式前切換用戶。
20.資源限定
軟限制:可以超出的限制,但僅能超出一定時長
硬限制:絕對不能超出的限制
ulimit:只能修改軟限制
-n [N]:顯示或限制能打開的最大的文件句柄數,
-u [N]:所能夠打開的最大進程數
如果修改硬限制
/etc/security/limits.conf,擴展配置etc/security/limits.d/*.conf
對誰進行限定 類型 要限定的選項 值
21、ab工具的初步使用
-c 模擬的併發數
-n 模擬的總請求數
一般併發數應該小於等於請求數
http_load webbench seige(只做參考)
tcp_copy
22、httpd-2.4編譯安裝 01:00
依賴於更高版本的apr和apr-util
apr全程 apache portable runtime
1)解決依賴關係
yum -y install pcre-devel
2)編譯安裝apr
tar
cd
./configure --prefix=/usr/local/apr
make && make install
3)編譯安裝apr-util
tar
cd
./configure --frefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
httpd2.4新特性
1)MPM支持在運行時裝載
--enable-mpms-shared=all --with-mpm=event 啟用預設的event
2) 支持event
3)非同步讀寫
4) 在每模塊及每目錄上指定日誌級別
5)每請求配置:<If> <Elseif>
6) 增強版的表達式分析器
7) 毫秒級的keepalive timeout
8)支持主機名的虛擬主機不在需要NameVirtualHost指令
9) 支持使用自定義變數
新增一些模塊:mod_proxy_fcgi,mod_ratelimit,mod_request,mod_remoteip
對於基於IP的訪問做了修改,不在使用order,allow,deny這些機制;而是統一使用require進行
4)編譯httpd
tar
cd
./configure --prefix=/usr/local/apache(安裝路徑) --sysconfdir=/etc/httpd24(配置文件) --enable-so(基於DSO動態載入模塊) --enable--ssl(能基於SSL協議) --enable-cgi(支持CGI機制) --enable-rewrite(支持URL重寫) --with-zlib(支持數據壓縮發送) --with-pcre(perl語言相容正則表達式庫) --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modeles=most(常用的,也可以改成all啟用全部的) --enable-mpms-shared=all(將所有的mpm模塊編譯進來) --with-mpm=event(預設使用event模塊)
make && make install
頭文件、庫文件、幫助文檔、二進位
後續的配置
1 導出頭文件
ln -sv /usr/local/appache/include /usr/include/httpd
2 導出庫文件
ldconfig -p 顯示當前系統的庫文件
該安裝並沒有提供庫文件
3 導出幫助文件
vim /etc/man.config
添加MANPATH /usr/local/apache/man
man -M /usr/local/apache/man httpd
4 導出二進位文件
vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache/bin:$PATH
5 修改啟動的腳本
cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24
vim /etc/httpd24/httpd.conf
隨意在空白處添加 PidFile "/var/run/httpd24.pid" 此為自定義PID文件位置
vim /etc/rc.d/rc.d/httpd24
apachectl=/usr/local/apache/bin/apachectl
httpd=/usr/local/apache/bin/httpd
prog=httpd
pidfile=${PIDFILE-/var/run/httpd24.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
最後
chkconfig --add httpd24
博客:配置CGI、虛擬主機、https、mod_defaults mod_status
基於IP訪問控制:
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制某主機的訪問
Require ip IPADDR
Require not ip IPADDR
IPADDR:
單個IP地址,例如172.16.100.7
network/netmask 例如172.16.0.0/255.255.0.0
network/Length 例如172.16.0.0/16
Net 172.16
Require host IPADDR
Require not host IPADDR
Hostname
GQDN:具體的主機
域:.magedu
I/O:
阻塞: 進程發起I/O調用,未完成之前,當前進程會被掛起
非阻塞:進程發起I/O調用,被調用函數完成之前不會阻塞當前進程而是立即返回 進程可以去乾別的事,但是卻不知道該I/O請求何時完成,需要重新回來查看
同步:進程發起一個過程調用(功能、函數)調用後,在沒得到結果之前,該調用將不會返回
非同步:進程發起一個過程調用,即便調用者不能立即得到結果,當調用卻會返回,返回時未完成狀態,當調用完成後,內核會自行通知調用者已經OK
同步阻塞
非同步非阻塞
非同步阻塞
記憶體映射:mmap
I/O模型有5種:幾種情況的簡單解釋 第一階段:內核向磁碟發起請求數據並存到內核空間中。第二階段:內核空間複製數據到進程記憶體空間中,併發送給進程 。一般來講阻塞和非阻塞發生在第一階段中 而同步與非同步發生在第二階段中
同步阻塞 即第一階段阻塞,第二階段同步
同步非阻塞 第一階段非阻塞,即內核可以去乾自己事。但是第二階段同步,所以 其實與同步阻塞沒有多大區別
I/O復用 select()poll() 第一階段阻塞
事件驅動 epoll()wqueue()
邊緣觸發
水平觸發
AIO(非同步非阻塞)
mysql丶lamp
併發響應用戶請求時網路I/O
單進程
多進程/線程:prefork(一個進程響應一個請求),worker(一個線程響應一個請求)
select()
復用模型:單線程響應多個用戶請求(事件驅動)
epoll()
多線程,每個線程響應多個請求 m*n
網路不支持非同步
I/O模型
同步阻塞
同步非阻塞
I/O復用
時間驅動
AIO
web: httpd nginx lighttpd
html plaintext jpeg gif png video
多媒體類型 主類型/次類型
首部:通用、請求、響應、實體、擴展
條件式請求:If-Modified-Since If-None-Match
請求報文格式 <method> <request-URL> <version>
首部
<entity-body>
響應報文格式 <version><status><reason>
首部
<entity-body>
httpd:虛擬主機、https、別名、<Directory><Location><File>
Options
動態網站:
程式:
java applet 早期在客戶端上執行的,通過JVM(JAVA虛擬機)上運行下載下來的JAVA程式 來執行。不太安全
伺服器端執行
靜態資源:jpeg,html,plaintext
動態資源:程式
硬編碼:直接嵌套進程式中,而且很難剝離出來
分體式結構:即前端設計歸前端設計,程式開發歸程式開發。只需要在HTML中引用程式,
可嵌入html中的web開發機制:
程式=指令+數據
程式=演算法+數據結構
文本資料庫缺陷
數據冗餘和不一致
數據訪問困難
數據孤立
完整性問題
原子性問題
併發訪問問題
安全性問題
DMBS: DataBase Management System
用戶層 邏輯層 物理層 資料庫的訪問類似於操作系統。操作系統給我們提供了很多API(庫)程式員給他們全部編寫成程式,我們可以執行程式來實現功能,但是確缺少一個更好的溝通平臺。於是有了BASH SHELL 再提供一個更好與電腦溝通的平臺,讓用戶執行某些程式員編寫好的命令,就可以與內核進行溝通。而資料庫的用戶層與邏輯層之間也是基於類似的機制,此成為SQL
數據模型
層次模型
網狀模型
關係模型
庫和表
非關係型資料庫模型:nosql
笛卡爾乘積
what is CAP???????
LAMP:Linux Apache MySql php/perl/python
開源資料庫:
salite
MySql,PostgreSQL(EnterpriseDB)
MariaDB
收費資料庫
Oracle
MySQL:
(存取方法)文件管理器
緩衝區管理器
磁碟空間管理器
數據 索引 事務日誌
事務:一個事情的多次操作的組合,M滿足ACID測試
A:原子性
C:一致性
I:隔離性
D:持久性
SQL: struct query language
支持
DCL:數據控制
DDL :date definbation 數據定義語言
CREATE/ALTER/DROP
DML:data Manipulation 數據查詢語言
INSERT/DELETE/SELECT/UPDATE
解釋器:接受並解釋命令
查詢引擎包括:分析器,查詢計劃器,求解器,優化器
驅動:一個程式員使用的API連接資料庫的,在應用程式端
線程池:用來管理連接的管理件
線程管理器:
ODBC:Open DataBase Connectivity
ANSI:
SQL-86,SQL-89,SQL-92,SQL-99,SQL-2003
mysqld/mysql
安裝使用mysql:mysql.com
1、Vendor:操作系統自帶的rpm包
2、MySql官方rpm包
3、通用二進位格式
4、源碼編譯
建議做在硬raid的lvm上
基於通用二進位格式,以5.5為例
記憶體足夠大,硬碟足夠快
tar xf -C /usr/local/
ln -sv mysql
執行資料庫初始化腳本
cd scripts
mysql_install_db
--basedir 安裝目錄
--datadir 數據目錄
--defaults-extra-file 額外文件的目錄(安裝文件)
--user 運行用戶
frm:欄位
myd:數據
myi:索引
scripts/mysql_install_db --datadir=/data/mydata/ --usr=mysql
cp support-files/mysql.server /etc/rc.d/init.d/mysqld 添加服務啟動腳本到init.d下
cp support-files/my-large.cnf /etc/my.cnf
vi /etc/my.cnf
添加
datadir=
ibdatal
事務日誌
ib_logfile0
ib_logfile1
二進位日誌
mysql-bin
二進位日誌的索引文件
mysql-bin.index
mysql存儲引擎 表類型
MyISAM
InnoDB --> XtraDB(percona) Xtrabackup
將客戶端運行程式添加到環境變數中
vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile
這樣輸入mysql就啟動mysql客戶端
導出頭文件
導出庫文件
ldconfig -p 查看
ldconfig 載入所有的
mysql客戶端
用戶名
--user=Username
-u Username
密碼
-p
--password=
主機
-h Hostname
--host=Hostname
執行命令
-e ‘SQL COMMAND’
用戶賬號
用戶@主機
修改管理員密碼
mysql 下
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('密碼');
SET PASSWORD FOR 'root'@'127.0.0.1'=PASSWORD('密碼');<