更多內容請點擊:
Linux學習從入門到打死也不放棄,完全筆記整理(持續更新,求收藏,求點贊~~~~)
http://blog.51cto.com/13683480/2095439
第23章 HTTP服務和APACHE
本章內容:
socket套接字基礎
http協議介紹
httpd介紹
httpd2.2相關配置
httpd2.4特性
編譯安裝httpd
INTERNET介紹以及歷史:略
--------------------------------------------------------------------------------
Sockte:套接字:
跨internet的主機間通訊:
在建立通信連接的每一端,進程間的傳輸要有兩個標誌:
IP地址和端口號,合稱爲套接字地址 Socket address
客戶機套接字地址定義了一個唯一的客戶進程
服務器套接字地址定義了一個唯一的服務器進程
如:192.168.65.132 80
socket:套接字,進程間通信(IPC)的一種實現,允許不同主機(或同一主機)上
不同進程之間進行通信和數據交換,socketAPI出現於1983年,4.2BSD實現
socketAPI:
封裝了內核中所提供的socket通信相關的系統調用
socket domain:根據其所使用的地址
AF_INET: Address Family IPv4
AF_INET6: IPv6
AF_UNIX: 同一主機上不同進程之間通信時使用
Socket type:根據使用的傳輸層協議
SOCK_STREAM: 流,tcp套接字,可靠的傳遞,面向連接
SOCK_DGRAM: 數據報,udp套接字,不可靠的傳遞,無連接
SOCK_RAW: 裸套接字,無須tcp或udp,APP直接通過IP包通信
套接字相關的系統調用:
socket(): 創建一個套接字
bind(): 綁定IP和端口
listen(): 監聽
accept(): 接收請求
connect(): 請求連接建立
write(): 發送
read(): 接收
close(): 關閉
socket通信示例:
1 準備腳本:
服務器端tcpserver.py
vim tcpserver.py
#!/usr/bin/python
import socket
HOST='0.0.0.0'
PORT=9090
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind((HOST,PORT))
sock.listen(3)
print('tcpserver listen at: %s:%s\n\r' %(HOST,PORT))
while True:
client_sock,client_addr=sock.accept()
print('%s:%s connect' %client_addr)
while True:
recv=client_sock.recv(BUFFER)
if not recv:
client_sock.close()
break
print('[Client %s:%s said]:%s' %(client_addr[0],client_addr[1],recv))
client_sock.send('tcpServer has received your message')
sock.close()
客戶端tcpclient.py
vim tcpclinet.py
#!/usr/bin/python
import socket
HOST='192.168.65.132'
PORT=9090
BUFFER=4096
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
sock.send('hello,tcpServer!')
recv=sock.recv(BUFFER)
print('[tcpServer said]: %s' % recv)
sock.close()
2 通信過程:
服務器端(192.168.65.132) 開啓服務
python tcpserver.py
客戶端執行:python tcpclient.py
-----------------------------------------------------------------------------
HTTP協議:
相關術語:
http: Hyper text transfer protocol,80/tcp 超文本傳輸協議,
html: hyper text markup language 超文本標記語言,編程語言
示例:
<html>
<head>
<title> html語言</title>
</head>
<body>
<h1>標題1</h1>
<p><a href=http://www.magedu.com>馬哥教育</a>歡迎你</p>
<h2>標題2</h2>
</body>
</html>
CSS: Cascading style sheet 層疊樣式表
js: javascript
MIME: multipurpose internet mail extensions
多用途互聯網郵件擴展,/etc/mime.types
http協議介紹:
http/0.9:
1991年,原型版本,功能簡陋,只有一個命令GET /index.html,服務器只能迴應
HTML格式字符串,不能迴應別的格式
http/1.0:
1996年5月,支持cahce,MIME,method
1 每個tcp連接只能發送一個請求,發送數據完畢,連接就關閉,如果還要請求
其他資源,就必須再新建一個連接
2 引入了POST命令和HEAD命令
3 頭信息是ASCII碼,後面數據可以爲任意格式。服務器迴應時會告訴客戶端,數據
是什麼格式,即Content-Type字段的作用,這些數據類型總稱爲MIME,多用途互聯網
郵件擴展,每個值包括一級類型和二級類型,預定義的類型,也可以自定義類型
4 常見content-type值:text/xml,image/jpeg,audio/,mp3
http/1.1:
1997年1月
1 引入了持久連接(persistent connection),即tcp連接默認不關閉,可以被多個
請求複用,不用生命connection:keep-alive。對於同一個域名,大多瀏覽器允許
同時建立6個持久連接
2 引入了管道機制(pipelining),即在同一個tcp連接裏,客戶端可以同時發送多個
請求,進一步改進了http協議的效率
3 新增方法: PUT,PATCH,OPTIONS,DELETE
4 同一個tcp連接裏面,所有的數據通信時按次序進行的。服務器只能順序處理迴應,
前面的迴應慢,會有許多請求排隊,造成"對頭堵塞"(head-of-line blocking)
5 爲避免上述問題,有兩種方法:一是減少請求數,二是同時多開持久連接。
網頁優化技巧:比如合併腳本和樣式表,將圖片嵌入css代碼,域名分片(domain sharding)
6 http協議不帶有狀態,每次請求都必須附上所有信息。請求的很多字段都是重複的
浪費帶寬,影響速度。
sady:2009年,谷歌研發,解決HTTP/1.1效率不高問題
http/2.0: 2015年
1 頭信息和數據體都是二進制,稱爲頭信息幀和數據幀
2 複用tcp連接,在一個連接裏,客戶端和瀏覽器都可以同時發送多個請求或迴應,
且不用按順序--對應,避免了“對頭堵塞”,此雙向的實時通信稱爲多工(multiplexing)
3 引入頭信息壓縮機制(header compression),頭信息使用gzip或compress
壓縮後再發送;客戶端和服務器同時維護一個頭信息表,所有字段都會存入
這個表,生成一個索引號,不發送同樣字段,只發送索引號,提高速度
4 http/2.0允許服務器爲經請求,主動向客戶端發送資源,即服務器推送
(server push)
http工作機制:
工作機制:
http請求:http request
http響應:http response
一次http事務:請求 <--> 響應
web資源: web resource
一個網頁有多個資源構成,打開一個頁面,會有多個資源展示出來,但是每個
資源都要單獨請求。因此,一個web頁面,通常並不是單個資源,而是一組資源的
集合
靜態文件:無需服務端做出額外處理
文件後綴:.jpg .html .txt .js .css .mp3 .avi
動態文件:服務端執行程序,返回執行的結果
文件後綴:.asp .php .jsp
http連接方式和性能:
串行連接:建立連接(tcp握手)-http事務-斷開連接(tcp揮手)
低效率,多個請求會順序執行
並行連接:通過多條tcp連接發起併發的http請求
持久連接:keep-alive,長連接,重用tcp連接,以消除連接和關閉的時延
以事務個數和時間來決定是否關閉連接
一次tcp連接過程可以處理多次請求,省去斷開之後重新建立連接的過程
管道化連接:通過共享tcp連接發起併發的http請求
建立持久連接之後,並行處理髮起httpd事務
複用的連接:交替傳送請求和相應報文(實驗階段)
URL 介紹:
URI: Uniform Resource Identifier 統一資源標識,分爲URL和URN
URN: Uniform Resource Naming ,統一資源命名
示例:P2P下載使用的磁力鏈接是URN的一種實現
magnet:?xt=urn:btih:660557A6890EF888666
URL:Uniform Resoruce Locator
統一資源定位符,用於描述某服務器某特定資源位置
兩者區別:URN如同一個人的名稱,而URL代表一個人的住址。換言之,URN定義某事物的身份,
而URL提供查找該事物的方法,URN僅用於命名,而不指定地址
URL 組成:
<scheme>://<user>:<password>@<host>:<port>/path;<params>?<query>#<frag>
例如:
http://user5:[email protected]/download/
scheme: 方案,訪問服務器以獲取資源時要使用哪種協議
user: 用戶,某些方案訪問資源時需要的用戶名
password:密碼,用戶對應的密碼,中間用":"分隔
host: 主機,資源宿主服務器的主機名或IP地址
port: 端口,資源宿主服務器正在監聽的端口號,很多方案有默認端口號
path: 路徑,服務器資源的本地名,由一個"/"將其與前面
params: 參數,指定輸入的參數,參數爲名/值對,多個參數用";"分隔
query: 查詢,傳遞參數給程序,如數據庫,用"?"與前面分隔,多個查詢使用"&"分隔
frag: 片段,一小片或一部分資源的名字,此組件在客戶端使用,用#分隔
示例:
網站訪問量:
IP(獨立IP):即internet protocol,指獨立IP數。一天內來自相同客戶機IP地址只
計算一次,記錄遠程客戶機IP地址的計算機訪問網站的次數,是衡量網站
流量的重要指標
PV(訪問量):即Page View,頁面瀏覽器或點擊量,用戶每次刷新即被計算一次,PV反映
的是瀏覽某網站的頁面數,PV與來訪者的數量成正比,PV並不是頁面的來訪者
數量,而是網站被訪問的頁面數量
UV(獨立訪客):即Unique Visitor,訪問網站的一臺電腦爲一個訪客,一天內相同的客戶端
只被計算一次,可以理解成訪問某網站的電腦的數量,網站判斷來訪電腦的身份
是通過來訪電腦的cookies實現的。如果更換了IP後但不清除cookies,再訪問
相同網站,該網站的統計中UV數是不變的。
網站統計:http://www.alexa.cn/rank
QPS: request per second 每秒請求數
PV,QPS,併發連接數換算公式
QPS=PV*(頁面衍生連接次數/統計時間(86400))
併發連接數=QPS*http 平均響應時間
峯值時間:每天80%的訪問集中在20%的時間裏,這20%時間爲峯值時間
峯值時間每秒請求數(QPS)=( 總PV數 *頁⾯衍⽣連接次數)*80% ) / ( 每天秒數* 20% )
http:一次完整的請求處理過程
1 建立連接(TCP握手,ssl握手)
接收或拒絕連接請求
2 接收請求:
接收客戶端請求報文中對某資源的一次請求的過程
web訪問相應模型(web I/O)
單進程I/O模型:
啓動一個進程處理用戶請求,而且一次只處理一個,
多個請求被串行相應
多進程I/O模型:
並行啓動多個進程,每個進程相應一個連接請求
複用I/O結構:
啓動一個進程,同時響應N個連接請求
多線程模型:一個進程生成N個線程,每個線程相應一個連接請求
事件驅動:event,一個進程處理N個請求
複用的多進程I/0模型:
啓動M個進程,每個進程相應N個連接請求,同時接受M*N個請求
3 處理請求:
服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,
根據方法,資源,首部和可選的主體部分對請求進行處理
元數據:請求報文首部
<method> <URL> <VERSION>
HEADERS 格式 name:value
<request body>
示例:
Host:www.magedu.com 請求的主機名稱
Server:Apache/2.4.7
HTTP常用請求方式,method:
GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
4 訪問資源:
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,
負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
資源放置於本地文件系統特定的路徑:DocRoot
SERVER DOCROOT --> /var/www/html
/var/www/html/images/logo.jpg 訪問路徑即爲:
http://SERVER/images/logo.jpg
WEB服務器資源路徑的映射方式:
(1) docroot
(2) alias
(3) 虛擬主機docroot
(4) 用戶家目錄docroot
5 構建相應報文:
一旦web服務器識別出了資源,就執行請求方法中描述的動作,並放回相應
報文。
相應報文中,包含有響應狀態碼,響應首部,如果生成了響應主體的話,
還包括響應主體
響應主體:
如果事務處理產生了響應主體,就將內容放在響應報文中回送過去,響應
報文中通常包括:
(1)描述了響應主體MIME類型的Content-type首部
(2)描述了響應主體長度的content-length
(3)實際報文的主體內容
URL重定向:
web服務器構建的相應並非客戶端請求的資源,而是資源另外一個訪問路徑
永久重定向:301
臨時重定向:302
MIME類型:
web服務器要負責確定相應主體的MIME類型,多種配置服務器的方法
可以將MIME類型與資源管理起來
魔法分類:apache web服務器可以掃描每個資源的內容,並將其與一個已知
模式表(被稱爲魔法文件)進行匹配,以決定每個文件的MIME類型,
這樣做可能比較慢,但很方便,尤其是文件沒有標準擴展名時。
顯示分類:可以對web服務器進行配置,但其不考慮文件的擴展名或內容,強制
特定文件或目錄內容擁有某個MIME類型
類型協商:有些web服務器經過配置,可以以多種文檔格式來存儲資源。在這種
情況下,可以配置web服務器,使其可以通過與用戶的協商來
決定使用哪種格式(及相關的MIME類型)“最好”
6 發送相應報文
web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。
服務器可能有很多條到各個客戶端的連接
有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送相應數據。
服務器要記錄連接的狀態,還要特別注意對持久連接的處理。
對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。
對持久連接來說,連接可能扔保持打開狀態,在這種情況下,服務器要正確地
計算content-length首部,不然客戶端就無法知道響應什麼時候結束了
7 記錄日誌:
最後,當事務結束時,web服務器會在日誌文件中添加一個條目,來描述
已執行的事務
http服務器應用:
http服務器程序:
httpd apache
nginx
lighttpd
應用程序服務器:
IIS .asp
tomcat .jsp
jetty 開源的servlet容器,基於jave的web容器
Resin CAUCHO公司,支持sevlets和jsp的引擎
webshpere(IBM),weblogic(BEA,已被oracle收購),jboss,oc4j(oracle)
市場佔有率統計:
www.netcraft.com
------------------------------------------------------------------------------
httpd介紹:
20世紀90年代初,美國國家超級計算機應用中心NSCA開發
1995年開源社區發佈apache (a patchy server)
軟件基金會:ASF(apache software foundation)
特性:
高度模塊化:core + modules
DSO: Dynamic Shared Object 動態裝/卸載
MPM: multi-processing module 多路處理模塊
功能特性
虛擬主機:
基於IP,PORT,FQDN
CGI: Common Gateway Interface,通用網關接口
反向代理
負載均衡
路徑別名
豐富的用戶認證機制
basic
digest
支持第三方模塊
MPM工作模式:
prefork:
多進程I/O模型,每個進程相應一個請求,默認模型
一個主進程:生成和回收n個子進程,創建套接字,不相應請求
多個子進程:工作進程,每個子進程處理一個請求,系統開始時,預先生成
多個空閒進程,等待請求,最大不超過1024個
ulimit -a
worker:
複用的多進程I/O模型,多進程多線程,IIS使用此模型
一個主進程:生成m個子進程,每個子進程負責生成n個線程,每個線程相應一個
請求,併發相應請求m*n
event:
事件驅動模型(worker模型的變種)
一個主進程:生成m個子進程,每個進程直接相應n個請求,併發相應已請求m*n
有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求
傳遞給服務線程,執行完畢後,又允許釋放,這樣增強了高併發場景下的請求處理
能力
centos6默認使用httpd-2.2 event 爲測試版
centos7默認使用httpd-2.4 event 爲穩定版
httpd安裝:
安裝:
centos6 httpd-2.2
centos7 httpd-2.4
安裝方式:
rpm:centos發行版,穩定,建議使用
編譯:定製或特殊需求
centos6 httpd程序環境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
檢查配置文件語法:
httpd -t
service httpd configtest
服務腳本:/etc/rc.d/init.d/httpd
腳本配置文件:/etc/sysconfig/httpd 主要用來配置MPM
站點網頁文檔根目錄:
/var/www/html
模塊文件路徑:
/etc/httpd/modules
/usr/lib64/httpd/modules
前者是後者的軟鏈接
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
主進程文件:
/etc/httpd/run/httpd.pid
開啓服務此文件自動生成,記錄主進程id號,關閉服務自動銷燬
日誌目錄文件:
/var/log/httpd/
/etc/httpd/log/ 是前者的軟鏈接
access_log: 訪問日誌
error_log:錯誤日誌
幫助文檔包:
httpd-manual
--------------------------------------------------------------------------------
httpd 2.2 常見配置:
httpd 2.2 配置文件的組成
grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:directive value 指令+值
directive: 不區分字符大小寫
value:爲路徑時,是否區分大小寫,取決於文件系統
1 修改監聽的IP和port
Listen [IP:]PORT
省略IP表示爲本機所有IP
Listen 指令至少一個,可重複出現多次
listen 80
listen 9627
listen 192.168.65.132:8080
注意:修改端口之後,必須重啓服務才能生效
2 持久連接:
Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是
繼續等待其他請求完成,默認爲關閉。
斷開條件:
數量限制:100 表示最多接受100個請求之後斷開
時間限制:15 表示15秒之後斷開
副作用:對併發訪問量較大的服務器,持久連接功能會使有些請求得不到相應
折中方案:使用較短的持久連接時間
配置選項:
Keepalive ON|OFF 默認OFF,如果爲off 下面兩項失效
keepalivetimeout 15
maxkeepaliverequests 100
測試: telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
HOST:WEB_SERVER_IP
3 MPM(Multi-processing module) 多路處理模塊
prefork,worker,event(實驗階段)
httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供
三個二進制程序文件,分別用於實現對不同MPM機制的支持
確認方法:
ps aux |grep httpd
默認爲/usr/sbin/httpd,即prefork模式
查看靜態編譯的模塊列表:
httpd -t httpd.worker -t
查看靜態編譯及動態裝載的模塊
httpd -M
動態模塊加載:
不需要重啓服務
只需要reload 就生效
動態模塊路徑:
/etc/httpd/modules -> ../../usr/lib64/httpd/modules
更換MPM模塊,即更換一個httpd程序
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
重啓服務生效
prefork的默認配置:
<IfModule prefork.c>
StartServers 8 開機啓動多少進程
MinSpareServers 5 最少保持多少空閒進程
MaxSpareServers 20 最多保持多少空閒進程,超過就殺掉
ServerLimit 256 最多進程數,最大20000
MaxClients 256 最大併發
MaxRequestsPerChild 4000 子進程最多能處理的請求數量。在處
理MaxRequestsPerChild 個請求之後,子進程將會被父進程終止,這
時候子進程佔用的內存就會釋放(爲0時永遠不釋放)
</IfModule>
worker的默認配置:
<IfModule worker.c>
StartServers 4 開機啓動的進程數
MaxClients 300 最大用戶連接數
MinSpareThreads 25 最小保持線程數
MaxSpareThreads 75 最大保持線程
ThreadsPerChild 25 每個進程開啓線程數
MaxRequestsPerChild 0 無限制
</IfModule>
4 DSO:Dynamic Shared Object
加載動態模塊配置:
/etc/httpd/conf/httpd.conf
配置指定實現模塊加載格式:
LoadModule <mod_name> <mod_path>
模塊文件路徑可使用相對路徑:
相對於Serverroot (默認爲/etc/httpd)
示例:
LoadModule auth_basic_module modules/mod_auth_basic.so
5 定義'main' server的文檔頁面路徑
DocumentRoot "/path"
文檔路徑映射:
documentroot 指向的路徑爲URL路徑的起始位置"/"
注意:selinux 和iptables的狀態
6 定義站點主頁面
DirectoryIndex index.html index.html.var
7 站點訪問控制:
可基於兩種類型的路徑對哪些些資源進行何種訪問控制
文件系統路徑
基於目錄
<directory "/path">
...
</directory>
基於文件
<file "/path/file">
...
</file>
使用正則表達式
<filematch "PATTERN">
...
</filematch>
URL路徑
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
8 訪問控制機制:
基於來源地址
基於賬號
<directory>中“基於源地址” 實現訪問控制
(1)options:後跟1個或多個以空白字符分隔的選項列表
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
在選項前+,-表示增加或者刪除指定選項
常見選項:
index:指明的url路徑下不存在與定義的主頁面資源相符的資源文件時
返回索引列表給用戶
followsymlinks:允許訪問符號鏈接文件所指向的源文件
ALL: 全部允許
none: 全部禁用
(2)AllowOverride
與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由accessfilename指定)
文件中,覆蓋之前的配置指令。
只對<directory>語句有效
allowoverride all 所有指令都有效
allowoverride now .htaccess 文件無效 大多情情況選這個即可
allowoverride authconfig indexes 除了authconfig和indexes 的其他指令都無法生效
(3)order 和allow,deny
放在directory,.htaccess中
order:定義生效次序,寫在後面的表示默認法則
order allow,deny
allow from ..
默認deny,在allow from 後面添加白名單
order deny,allow
deny from ..
默認allow,在deny from 後面添加黑名單
也可以:
order allow,deny
allow from 192.168.65
deny from 192.168.65.128
用來控制範圍
客戶端地址:
IP
網絡: 172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
9 日誌設定
(1) 錯誤日誌:
ErrorLog logs/error_log
錯日誌記錄級別:
loglevel warn (默認值)
可選loglevel:
debug,info,notice,warn,error,crit,alert,emerg
級別越低(左)記錄越詳細
(2)訪問日誌
定義日誌格式:
LogFormat format strings
默認:LogFormat "%l %h %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combined
使用日誌格式:
Customlog logs/access_log combined
參考幫助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
常用格式參數:
%h 客戶端IP地址
%l 遠程用戶,啓用mod_ident纔有效,通常爲空"-"
%u 驗證(basic,digest)遠程用戶,非登錄訪問時,爲"-"
%t 服務器收到請求時的時間
%r First line of request,即表示請求報文的首行,記錄了此次請求
的方法 URL 協議版本
%>s 相應狀態碼
%b 相應報文的大小,單位是字節;不包括響應報文http首部
%{Referer}i 請求報文中首部referer的值;即從哪個頁面中的超鏈接跳轉
至當前頁面的
%{User-Agent}i 請求報文中首部"User-Agent"的值;即發出請求的應用程序
修改日誌的時間格式:
%{%F %T}t
10 顯示服務器版本信息:
對方瀏覽器打開頁面之後使用F12 可以看見服務器版本號
ServerTokens:Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2
MyMod/1.2
This setting applies to the entire server and cannot be enabled or disabled on a
virtualhost-by-virtualhost basis.
After version 2.0.44, this directive also controls the information presented by the
ServerSignature directive.
建議使用:ServerTokens Prod
11 顯示默認字符集:
AddDefaultCharset UTF-8
12 定義路徑別名:
格式: Alias /URL/ "/PATH/"
注意前後"/"必須一致,前面有,後面就必須有
Documentroot "/data/www"
http://www.wow.com/download/f1
==> /data/www/download/f1
Alias /download/ "/app/dir1"
http://www.wow.com/download/f1
==> /app/dir1/f1
13 基於用戶的訪問控制
認證質詢:WWW-Authenticate,響應碼爲401,拒絕客戶端請求,並說明要求客戶端
提供賬號和密碼
認證: Authorization,客戶端用戶填入賬號和密碼後再次發送請求報文,認證通過
時,則服務器發送響應的資源
認證方式兩種:
basic:明文
digest:消息摘要認證,兼容性差
安全域:需要用戶認證後方能訪問的路徑,應該通過名稱對其進行標識,以便於告知用戶
認證的原因
虛擬賬號:僅用於訪問某服務時用到的認證標識,區分於linux用戶賬號
賬號密碼存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等
basic認證配置示例:
(1)定義安全域:
<Directory "/path">
options none
AllowOverride none
AuthType basic
AuthName "string"
AuthUserFile "path/file"
Require user username1 usename2...
<directory>
允許賬號文件中的所有用戶登錄訪問:
Require valid-user
(2)提供賬號和密碼存儲,(文本文件方式)
使用專用的命令完成此類文件的創建和用戶管理
htpasswd [options] /PATH/FILE username
選項:
-c 自動創建文件,僅應該在文件不存在時使用,like >
-p 明文密碼
-d crypt格式加密,默認
-m md5格式加密
-s sha格式加密
-D 刪除指定用戶
基於組賬號進行認證:
(1)定義安全域
<Directory "/path">
options none
allowoverload none
authtype basic
authname "string"
authuserfile "/path/file"
authgroupfile "/path/groupfile"
require group groupname1 groupname2 ...
</Directory>
(2)創建用戶賬號和組賬號文件
組文件:每一行定義一個組
groupname: username1 username2 ...
注意:centos7定義require group 之後可以單獨定義 require user
centos6定義require group 之後再定義require user 會使group失效
遠程客戶端和用戶驗證的控制
satisfy All | Any
All 客戶機IP和用戶驗證都需要通過纔可以
Any 客戶機IP和用戶驗證,有一個滿足即可
示例:
require valid-user
order allow,deny
allow from 192.168.1
satisfy any
注意:如果不加satisfy any 這一行,默認效果爲satisfy all
即:全都需要滿足纔可以
14 實現用戶家目錄的http共享
基於模塊mod_userdir.so實現
SElinux:http_enable_homedirs
相關設置:
vim /etc/httpd/conf/httpd.conf
<ifmodule mod_userdir.c>
#userdir disabled
userdir public_html 指定共享目錄的名稱
</ifmodule>
準備目錄:
su - hello;mkdir ~/public_html
setfacl -m u:apache:x ~hello
訪問:
不懂,待續。。。。
15 ServerSignature ON | OFF | Email
當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省情況下由於打開了
ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、apache的版本
等信息
例如:
Not Found
The requested URL /dd was not found on this server.
Apache/2.2.15 (CentOS) Server at 192.168.65.150 Port 80
如果不對外顯示這些信息,就可以將這個參數設置爲OFF
Centos 6有效,7無此參數,且不顯示此信息
16 status頁面
需開啓模塊:
LoadModule status_module modules/mod_status.so
<location /server-status>
SetHandler server-status
Order allow,deny
allow from 192.168.65
</location>
Extendedstatus ON
查看頁面:
192.168.65.150/server-status
認證方式:
可以同時使用基於賬號密碼認證
17 虛擬主機
站點標識: socket (IP:PORT)
三種實現方式:
基於ip:爲每個虛擬主機準備至少一個IP地址,基於ip報文頭部識別
基於port:爲每個虛擬主機使用至少一個獨立的port,基於tcp報文頭部識別
基於FQDN:爲每個虛擬主機使用至少一個FQDN,基於http數據頭部來識別
注意:一般虛擬機不要與main主機混用;因此,要使用虛擬主機,一般禁用main主機
禁用方法:註釋中心主機的 Documentroot 指令
虛擬主機的配置方法:
<VirtualHost IP:PORT>
servername FQDN
Documentroot "/path"
</VirtualHost>
建議:將上述配置存放在獨立的配置文件中
其他可用指令:
ServerAlias:虛擬主機的別名,可多次使用
errorlog
customlog
<directory "/path">
...
</directory>
alias
配置示例:
基於ip和port實現虛擬主機
<VirtualHost 192.168.65.150:80>
DocumentRoot "/app/web1/"
servername web1.wow.com
errorlog "/var/log/httpd/web1.error_log"
customlog "/var/log/httpd/web1.access_log" combined
</VirtualHost>
<VirtualHost 192.168.65.151:80>
DocumentRoot "/app/web2/"
servername web2.wow.com
errorlog "/var/log/httpd/web2.error_log"
customlog "/var/log/httpd/web2.access_log" combined
</VirtualHost>
<VirtualHost 192.168.65.151:8080>
servername web3.wow.com
DocumentRoot "/app/web3/"
errorlog "/var/log/httpd/web3.error_log"
customlog "/var/log/httpd/web3.access_log" combined
</VirtualHost>
基於FQDN實現虛擬主機:
NameVirtualHost 192.168.65.150:80
<VirtualHost 192.168.65.150:80>
servername web1.wow.com
DocumentRoot "/app/web1/"
errorlog "/var/log/httpd/web1.error_log"
customlog "/var/log/httpd/web1.access_log" combined
</VirtualHost>
<VirtualHost 192.168.65.150:80>
servername web2.wow.com
DocumentRoot "/app/web2/"
errorlog "/var/log/httpd/web2.error_log"
customlog "/var/log/httpd/web2.access_log" combined
</VirtualHost>
<VirtualHost 192.168.65.150:80>
servername web3.wow.com
DocumentRoot "/app/web3/"
errorlog "/var/log/httpd/web3.error_log"
customlog "/var/log/httpd/web3.access_log" combined
</VirtualHost>
注意: centos6基於FQDN必須加
NameVirtualHost *:80
centos7添加虛擬主機需要對每個目錄添加授權
<directory "/app/">
require all granted
</directory>
mod_deflate模塊:
使用mod_deflate模塊壓縮頁面又換傳輸速度
使用場景:
(1)節約帶寬,額外消耗cpu;同時,可能有些較老瀏覽器不支持
(2)壓縮適於壓縮的資源,例如文本文件
實現步驟:
1 確認mod_deflate處於開啓狀態
LoadModule deflate_module modules/mod_deflate.so SetOutputFilter DEFLATE
2 添加如下信息到配置文件的任意位置
Setoutputfilter DEFLATE
# mod_deflate configuration
# 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)
DeflateCompressionLevel 9
# Netscape 4.x 只壓縮text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
#Netscape 4.06-08三個版本 不壓縮
BrowserMatch ^Mozilla/4\.0[678] no-gzip
#Internet Explorer標識本身爲“Mozilla / 4”,但實際上是能夠處理請求的壓縮。
#如果用戶代理首部匹配字符串“MSIE”(“B”爲單詞邊界”),就關閉之前定
#義的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
3 重新裝載配置文件
systemctl reload httpd
測試:
curl -I wb1.wow.com
curl -I wb1.wow.com --compressed
https 通信過程:
https:http over ssl
https通信過程
1 建立tcp連接
客戶端發起請求,建立到服務器端口443的tcp連接,三次握手
2 建立ssl會話
(1)客戶端發送可供選擇的加密方式,並向服務器請求證書
(2)服務器端發送證書以及選定的加密方式給客戶端
(3)客戶端取得證書並進行證書驗證
如果信任給其發證書的CA
(a) 驗證證書來源的合法性,用CA的公鑰解密證書上數字簽名
(b) 驗證證書的內容的合法性:完整性檢驗
即使用證書中給定的單向加密算法加密證書內容生成指紋,並與解密
數字簽名之後得到的指紋對比是否一致
(c) 檢查證書的有效期限
(d) 檢查證書是否被吊銷
(e) 證書中擁有者的名字,與訪問的目標主機是否一致
(4)客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送
給服務器,完成祕鑰交換
(5)服務器用此密鑰加密用戶請求的資源,響應給客戶端
3 事務處理完畢之後,先斷開ssl連接,在斷開tcp連接
注意事項:
SSL是基於IP地址實現,單IP的主機僅可以使用一個https虛擬主機
https 實現:
1 爲服務器申請數字證書
建立私有CA
在服務器創建證書籤署請求
CA簽證
2 配置httpd支持使用ssl,及使用的證書
安裝模塊:
yum install mod_ssl -y
修改配置文件:
vim /etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile 服務器證書文件路徑
SSLCertificateKeyFile 服務器私鑰文件
3 測試基於https訪問相應的主機
openssl s_client [-connect host:port] [-cert filename]
[-CApath directory] [-CAfilefilename]
使用curl命令測試:
對比:
curl https://wb1.wow.com
curl --cacert cacert.pem https://wb1.wow.com
4 http重定向https
將http請求轉發至https的URL
重定向:
Redirect [status] URL -path URL
status:
1 permanent:returns a permanent redirect status(301) indicating that
the resource has moved permanently
2 temp:returns a temporary redirect status(302).this is the default
示例:
Redirect temp / https://www.testwow.com
注意:
如果定義了虛擬機提供https服務,再定義重定向"/"到 https
會出現循環重定向,無法正常打開頁面
如下:
<virtualhost *:80>
servername web1.wow.com
documentroot "/data/www/wb1"
errorlog "/var/log/httpd/wb1_error_lor"
customlog "/var/log/httpd/wb1_log" combined
</virtualhost>
<virtualhost *:80>
servername wb2.wow.com
documentroot "/data/www/wb2"
errorlog "/var/log/httpd/wb2_error_log"
customlog "/var/log/httpd/wb2_log" combined
</virtualhost>
redirect temp / https://wb1.wow.com/
此段代碼,wb1實現了https,如果註釋掉redirect行
#redirect temp / https://wb1.wow.com/
那麼測試wb1.wow.com wb2.wow.com https://wb1.wow.com 均正常
但是去掉redirect行的註釋之後,所有頁面均無法正常訪問
HSTS:
HSTS: http strict transport security
服務器端配置支持HSTS後,會在給瀏覽器返回的HTTP首部中攜帶HSTS字段,瀏覽器獲取到該信息
後,會將所有的HTTP訪問請求在內部做307跳轉到HTTPS。而無需任何網絡過程
HSTS preload list
是chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用chrome瀏覽器訪問
時,會自動轉換成https。
firefox,safari,edge瀏覽器也會採用這個列表
實現HSTS:
vim /etc/httpd/conf/httpd.conf
添加如下行即可
Header always set Strict-Transport-Security "max-age=31536000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]
httpd自帶的工具程序:
htpasswd:basic認證基於文件實現時,用到的賬號密碼文件生成工具
apachectl: httpd自帶的服務控制腳本,支持start和stop
rotalelogs:日誌滾動工具
httpd的壓力測試工具:
ab,webbench,http_load,seige
jmeter 開源
loadrunner 商業,有認證
tcpcopy 網頁,複製生產環境中的真實請求,並將之保存
ab命令的用法:
來自 httpd-tools 包
ab [options] URL
-n 請求總數
-c 模擬的並行數
-k 以持久連接模式測試
示例
ab -c 100 -n 10000 http://www.testwow.com/
注意:
URL 後面需加上 "/"
ulimit -n # 調整能打開的文件數
httpd 2.4 :----------------------------------------------------------------------
httpd2.4 新特性:
MPM支持運行爲DSO機制;以模塊形式按需加載
event MPM 生產環境可用
異步讀寫機制
支持每模塊及每目錄的單獨日誌級別定義
每請求相關的專用配置
增強版的表達式分析器
毫秒級持久連接時長定義
基於FQDN的虛擬主機不需要NameVirtualHost 指令
新指令,allowoverridelist
支持用戶自定義變量
更低的內存消耗
修改了一些配置機制:
不再支持使用order deny,allow 來做基於IP的訪問機制
新模塊:
1 mod_proxy_fcgi
FastCGI Protocol backend for mod_proxy
2 mod_remoteip
Replaces the apparent client remote IP address and hostname for the request
with the IP address list presented by a proxies or a load balancer via the request
headers.
3 mod_ratelimit
Provides Bandwidth Rate Limiting for Clients
安裝:
centos7:yum安裝,源碼編譯安裝
centos6:源碼編譯
Rpm安裝程序環境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模塊相關的配置文件:
etc/httpd/conf.modules.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd
httpd-2.4支持MPM的動態切換
日誌文件:
/var/log/httpd
access_log:訪問日誌
error_log:錯誤日誌
站點文檔:
/var/www/html
模塊文件路徑:
/usr/lib64/httpd/modules
服務控制:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service
httpd-2.4配置:
1 切換使用的MPM
centos7 rpm安裝
vim /etc/httpd/conf.modules.d/00-mpm.conf
啓用要啓用的MPM相關的LoadModule指令即可
centos6編譯安裝:
vim /etc/httpd24/httpd.conf
include /etc/httpd24/extra/httpd-mpm.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
2 主目錄
Documentroot /path
3 基於IP的訪問控制
無明確授權的目錄,拒絕訪問
允許所有主機訪問: require all granted
拒絕所有主機訪問: require all denied
控制特定的IP訪問:
Require ip IPADDR: 授權指定來源的IP訪問
Require not ip IPADDR:拒絕特定的IP訪問
控制特定的主機訪問:
Require host HOSTNAME 授權特定主機訪問
Require not host HOSTNAME 拒絕
HOSTNAME:
FQDN: 特定主機
domain.tld 指定域名下的所有主機
不能有失敗,至少有一個成功匹配才成功,即失敗優先:
匹配全部條件方可訪問
<RequireAll>
require all granted
require not ip 172.16.1.1 拒絕特定主機
</RequireAll>
多個語句有一個成功,則成功,即成功優先:
匹配任意條件即可訪問:
<RequireAny>
require all denied
require ip 172.16.1.1 允許特定IP
</RequireAny>
4 虛擬主機:
基於FQDN的虛擬主機不再需要NameVirutalHost指令
任意目錄下的頁面只有顯式授權才能被訪問
5 ssl:
安裝ssl_mod,和httpd2.2相同
6 持久連接功能默認啓用,5 100
KeepAlive on
KeepAliveTimeout #ms
MaxKeepAliveRequests 100
毫秒級持久連接時長定義
http協議進階:-------------------------------------------------------------------
http報文語法格式:
reuqest報文:
<method> <request-URL> <version>
<headers>
<entity-body>
reponse報文:
<version> <status> <reason-phrase>
<headers>
<entity-body>
method:請求方法,標明客戶端希望服務器對資源執行的動作
GET,HEAD,POST等
version:
HTTP/<major>.<minor>
status: 狀態碼,如200,301,302,404,502;
標記請求處理過程中發生的情況
reason-phrase:
狀態碼所標記的狀態的簡要描述
headers:
每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟
一個冒號,而後跟一個可選空格,接着是一個值
首部字段名: 值
entity-body:
請求時附件的數據或響應時附加的數據
method:方法
GET: 從服務器獲取一個資源
HEAD: 只從服務器獲取文檔的響應首部
POST: 向服務器輸入數據,通常會再由網關程序繼續處理
PUT: 將請求的主體部分存儲在服務器中,如上傳文件
DELETE:請求刪除服務器上指定的文檔
TRACE: 追蹤請求到達服務器中間經過的代理服務器
OPTIONS:請求服務器返回指定資源吃食使用的請求方法
協議查看或分析的工具:
tcpdump,wireshark,tshark
http協議狀態碼分類:
1xx 100-101 信息提示
2xx 200-206 成功
3xx 300-305 重定向
4xx 400-415 錯誤類信息,客戶端錯誤
5xx 500-505 錯誤類信息,服務器端錯誤
http協議常用的狀態碼:
200: 成功,請求數據通過相應報文的entity-body部分發送;OK
301: 請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明瞭
資源現在所處的新位置,Moved permanenty
302: 響應報文location指明資源臨時新位置 moved temporarily
304: 客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過此響應
轉態碼通知客戶端,not modified
401: 需要輸入賬號和密碼認證方能訪問資源;unauthorized
403: 請求被禁止;forbidden
404: 服務器無法找到客戶端請求的資源,not found
500: 服務器內部錯誤,internal server error
502: 代理服務器從後端服務器收到了一條僞響應,如無法連接到網關,bad gateway
503: 服務不可用,臨時服務器維護或過載,服務器無法處理請求
504 網關超時
headers:
request 報文頭部示例:
Accept
text/css,*/*;q=0.1
Accept-Encoding
gzip, deflate, br
Accept-Language
zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Cache-Control
max-age=0
Connection
keep-alive
Cookie
MySQL_S=nr39nu9jdjkr0u2i1qmi0l…174105336; s_sq=%5B%5BB%5D%5D
Host
labs.mysql.com
If-Modified-Since
Tue, 05 Jun 2018 17:50:40 GMT
Referer
https://dev.mysql.com/doc/refm…rce-configuration-options.html
User-Agent
Mozilla/5.0 (Windows NT 6.3; W…) Gecko/20100101 Firefox/61.0
response報文頭部示例:
Cache-Control
no-store, no-cache, must-revalidate
Cache-Control
no-cache, private
Connection
Keep-Alive
Content-Encoding
gzip
Content-Length
32057
Content-Type
text/html; charset=UTF-8
Date
Thu, 28 Jun 2018 09:30:09 GMT
Expires
Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive
timeout=5, max=10
Pragma
no-cache
Server
Apache
Strict-Transport-Security
max-age=15768000
Vary
Accept-Encoding
X-Content-Type-Options
nosniff
X-Frame-Options
SAMEORIGIN
X-XSS-Protection
1; mode=block
http首部字段:
HTTP首部字段包含的信息最爲豐富,首部字段同時存在於請求和響應報文內,
並涵蓋http報文相關的內容信息。使用首部字段是爲了給客戶端和服務器端
提供報文主體大小,所使用的語言,認證信息等內容
首部字段結構: HTTP首部字段是由首部字段名和字段值構成的,中間用
":"分隔
字段值對應單個HTTP首都字段可以有多個值
報文首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規範內
尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果
可能並不一致
首部的分類:
通用首部:請求報文和響應報文兩方都會使用的首部
date: 報文的創建時間
connection:連接狀態,如keep-alive,close
via: 顯示報文經過的中間節點(代理,網關)
chche-control: 控制緩存,如緩存時長
MIME-Version: 發送端使用的MIME版本
Warning: 錯誤通知
請求首部:從客戶端向服務器端發送報文時使用的首部。補充了請求的附加內容、
客戶端信息,請求內容相關優先級等信息
Accept:通知服務器自己可接受的媒體類型
accept-charset:客戶端可接受字符集
accept-Encoding:客戶端可接受的編碼格式,如gzip
accept-Language:客戶端可接受的語言
Client-IP: 請求的客戶端IP
Host: 請求的服務器名稱和端口號
Referer: 跳轉至當前URI的前一個URL
User-Agent:客戶端代理,瀏覽器版本
響應首部:從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加
內容,也會要求客戶端附加額外的內容信息
1 信息性:
Age:從最初創建開始,響應持續時長
server:服務器程序軟件名稱和版本
2 協商首部:
accept-ranges:服務器可接受的請求範文類型
vary: 服務器查看的其他首部列表
3 安全響應首部:
set-cookie:向客戶端設置cookie
set-cookie2:與上面相似
www-authenticate:來自服務器對客戶端的質詢列表
實體首部:針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新
時間等與實體相關的信息
Allow: 列出對此資源實體可使用的請求方法
Location:告訴客戶端真正的實體位於何處
Content -Encoding:對主體執行的編碼
Content -Language:理解主體時最適合的語言
Content -Length: 主體的長度
Content -Location: 實體真正所處位置
Content -Type:主體的對象類型,如text
緩存相關:
ETag:實體的擴展標籤
Expires:實體的過期時間
Last -Modified:最後一次修改的時間
擴展首部:
條件式請求首部:
Expect:允許客戶端列出某請求所要求的服務器行爲
if-modified-since:自從指定的時間之後,請求的資源是否發生過修改
if-unmodified-since:與上面相反
if-none-match:本地花村中存儲的文檔etag標籤是否與服務器文檔的etag
不匹配
if-match:與上面相反
安全請求首部:
authorization: 向服務器發送認證信息,如賬號和密碼
cookie:客戶端向服務器發送cookie
cookie2:用於說明請求支持的cookie 版本
代理請求首部:
proxy-authorization:向代理服務器認證
cookie:
HTTP 是一種無狀態協議。
協議自身不對請求和響應之間的通信狀態進行保存。
也就是說在 HTTP 這個級別,協議對於發送過的請求或響應都不做持久化處理。
這是爲了更快地處理大量事務,確保協議的可伸縮性,而特意把 HTTP 協議設
計成如此簡單的。
可是隨着 Web 的不斷髮展,很多業務都需要對通信狀態進行保存。
於是引入了 Cookie 技術。
使用 Cookie 的狀態管理Cookie 技術通過在請求和響應報文中寫入 Cookie
信息來控制客戶端的狀態。
Cookie 會根據從服務器端發送的響應報文內的一個叫做 Set -Cookie 的首部字段
信息,通知客戶端保存Cookie。
當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie
值後發送出去。
服務器端發現客戶端發送過來的 Cookie 後,
會去檢查究竟是從哪一個客戶端發來的連接請求,然後對比服務器上的記錄,
最後得到之前的狀態信息
Set -Cookie首部字段:
Set -cookie首部字段示例:
Set -Cookie: status=enable; expires=Fri, 24 Nov 2017 20:30:02 GMT; path=/;
NAME=VALUE
賦予 Cookie 的名稱和其值,此爲必需項
expires=DATE
Cookie 的有效期,若不明確指定則默認爲瀏覽器關閉前爲止
path=PATH
將服務器上的文件目錄作爲Cookie的適用對象,若不指定則默認爲文檔所在的文件目錄
domain=域名
作爲 Cookie 適用對象的域名,若不指定則默認爲創建Cookie的服務器的域名
Secure
僅在 HTTPS 安全通信時纔會發送 Cookie
HttpOnly
加以限制使 Cookie 不能被 JavaScript 腳本訪問
curl工具:----------------------------------------------------------------------
curl是基於URL語法在命令行方式下工作的文件傳輸工具
它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE,LDAP等協議。
支持HTTPS認證,並且支持HTTP的POST,PUT等方法。FTP上傳,kerberos認證,HTTP上傳,
代理服務器,cookies,用戶名/密碼認證,下載文件斷點續傳,上載文件斷點續傳,
HTTP代理服務器管道(proxy tunnneling),還支持IPv6,socks5代理服務器
通過http代理服務器上傳文件到FTP服務器等,功能十分強大
使用格式:
curl [options] [URL...]
選項:
-A,--user-agent<sting> 設置用戶代理髮送給服務器
-e,--referer <URL> 來源網址
--cacert <file> CA證書(ssl)
-k,--insecure 允許忽略證書進行SSL連接
--compressed 要求返回是壓縮的格式
-H,--header <line> 自定義首部信息傳遞給服務器
-i 顯示頁面內容,包括報文首部信息
-I,--head 只顯示響應報文首部信息
-D,--dump-header <file> 將URL的header信息存放在指定文件中
--basic 使用HTTP基本認證
-u,--user <user:[password]> 輸入服務器的用戶和密碼
-L 如果有3xx響應碼,重新發送請求到新位置
-O 使用URL中默認的文件名保存文件到本地
-o <file> 將網絡文件保存爲指定的文件中
--limit-rate <rate> 設置傳輸速度
-0,--http1.0 數值0,使用HTTP1.0
-v,--verbose 更詳細
-C 選項可對文件使用斷點續傳功能
-c,--cookie-jar <file-name> 將url中cookie存放在指定文件中
-x,--proxy <proxyhost[:port]> 指定代理服務器地址
-X,--request <command> 向服務器發送指定請求方法
-U,--proxy-user <user:password> 代理服務器用戶和密碼
-T 選項將指定的本地文件上傳到FTP服務器上
--data,-d 指定使用POST方式傳遞數據
-b name=data 從服務器響應set-cookie得到值,返回給服務器
示例:
使用basic認證:
curl --basic --user user5:centos 192.168.65.132/download/
僞造agent和referer
curl -A "sogoliulanqi" -e "www.baidu.com" 192.168.65.132
access_log記錄:
192.168.65.155 - - [01/Jul/2018:11:45:39 +0800] "GET / HTTP/1.1"
200 175 "www.baidu.com" "sogoliulanqi"
下載並限速:
curl 192.168.65.132/mariadb -o mariadb-server --limit-rate 1024000
elikes工具:
elinks [options] [url]...
-dump 非交互式模式,將url的內容輸出至標準輸出
-source 打印源碼
Sentfile機制:
不用 sendfile 的傳統網絡傳輸過程:
read(file, tmp_buf , len)
write(socket, tmp_buf , len)
硬盤 >> kernel buffer >> user buffer >> kernel socket buffer >> 協議棧
一般網絡應用通過讀硬盤數據,寫數據到 socket 來完成網絡傳輸,底層執行過程:
1 系統調用 read() 產生一個上下文切換:從 user mode 切換到 kernel mode,然後 DMA 執行拷貝,
把文件數據從硬盤讀到一個 kernel buffer 裏。
2 數據從 kernel buffer 拷貝到 user buffer,然後系統調用 read() 返回,這時又產生一個上下文切換:
從kernel mode 切換到 user mode
3 系統調用 write() 產生一個上下文切換:從 user mode 切換到 kernel mode,然後把步驟2讀到
user buffer 的數據拷貝到 kernel buffer(數據第2次拷貝到 kernel buffer),不過這次是個不同的
kernel buffer,這個 buffer和 socket 相關聯。
4 系統調用 write() 返回,產生一個上下文切換:從 kernel mode 切換到 user mode(第4次切換),然後
DMA從 kernel buffer 拷貝數據到協議棧(第4次拷貝)
上面4個步驟有4次上下文切換,有4次拷貝,如果能減少切換次數和拷貝次數將會有效提升性能
在kernel 2.0+ 版本中,系統調用 sendfile() 就是用來簡化上面步驟提升性能的。
sendfile() 不但能減少切換次數而且還能減少拷貝次數
用 sendfile() 來進行網絡傳輸的過程:
sendfile(socket, file, len);
硬盤 >> kernel buffer (快速拷貝到kernel socket buffer) >> 協議棧
1 系統調用 sendfile() 通過 DMA 把硬盤數據拷貝到 kernel buffer,然後數據被
kernel 直接拷貝到另外一個與 socket 相關的 kernel buffer。這裏沒有 user mode 和
kernel mode 之間的切換,在 kernel 中直接完成了從一個 buffer 到另一個 buffer 的
拷貝。
2 DMA 把數據從 kernel buffer 直接拷貝給協議棧,沒有切換,也不需要數據從 user
mode 拷貝到 kernel mode,因爲數據就在 kernel 裏
配置選項:
EnableSendfile on
httpd2.4默認啓用
反向代理功能:
啓用反向代理:
ProxyPass "/" "http://www.example.com/"
ProxyPa***everse "/" "http://www.example.com/"
特定url反向代理:
proxypass "/images" "http://www.example.com/"
proxypa***everse "/images" "http://www.example.com/"
示例:
proxypass "/homepage" "http://www.testwow.com"
proxypa***everse "/homepage" "http://www.testwow.com"
測試結果:
curl wb1.wow.com
curl wb1.wow.com/homepage
注意:
後端服務器訪問日誌中客戶端爲代理服務器
且代理服務器也會記錄日誌,客戶端爲發起請求的用戶
--------------------------------------------------------------------------------
編譯安裝httpd-2.4
ARP項目:
APR(Apache portable Run-time libraries,Apache可移植運行庫) 主要爲上
層的應用程序提供一個可以跨越多操作系統平臺使用的底層支持接口庫。在早
期的Apache版本中,應用程序本身必須能夠處理各種具體操作系統平臺的細節,
並針對不同的平臺調用不同的處理函數
隨着Apache的進一步開發,Apache組織決定將這些通用的函數獨立出來併發
展成爲一個新的項目。這樣,APR的開發就從Apache中獨立出來,Apache僅
僅是使用 APR而已。目前APR主要還是由Apache使用,由於APR的較好的移植
性,因此一些需要進行移植的C程序也開始使用APR,開源項目比如用於服務器
壓力測試的Flood loader tester,該項目不僅僅適用於Apache,
http://httpd.apache.org/test/flood
在centos6上編譯安裝httpd-2.4
安裝前準備:
1 安裝http-2.4
依賴於apr-1.4+,apr-util-1.4+,[apr-iconv]
apr: apache portable runtime, 解決跨平臺實現
centos6.9:默認安裝爲apr1.3.9,apr-util-1.3.9
2 安裝前準備開發包
yum groupinstall "Development Tools" "Server Platform Development"
相關包:
yum install pcre-devel openssl-devel expat-devel
3 下載源代碼並解壓縮
httpd-2.4.33.tar.bz2
apr-1.6.3.tar.gz
apr-util-1.6.1.tar.gz
編譯安裝方法一:
1 安裝apr-1.4+
cd apr-1.6.3
./configure --prefix=/app/apr
make && make install
2 安裝apr-util-1.4+
cd ../apr-util-1.6.1
./configure --prefix=/app/apr-util --with-apr=/app/apr
make -j 2 && make install
3 安裝httpd2.4
cd ../httpd-2.4.33
./configure --prefix=/app/httpd24 --enable-so \
--enable-ssl --enable-cgi --enable-rewrite \
--with-zlib --with-pcre --with-apr=/app/apr/ \
--with-apr-util=/app/apr-util/ \
--enablemodules=most --enable-mpms-shared=all \
--with-mpm=prefork
make -j 4 && make install
編譯安裝方法二:
1 cp -av apr-util-1.6.0 httpd-2.4.27/srclib/apr -util
cp -av apr-1.6.2 httpd-2.4.27/srclib/apr
2 cd httpd-2.4.33
./configure --prefix=/appl/httpd24 \
--enable-so --enable-ssl --enable-cgi \
--enable-rewrite --with-zlib --with-pcre \
--with-includedapr --enable-modules=most \
--enable-mpms-shared=all --withmpm=prefork
3 make && make install
編譯安裝http-2.4程序環境:
自帶的服務控制腳本:
/app/httpd24/bin/apachectl start|stop|restart|status
應用程序目錄:/app/httpd24/bin/
網頁文件目錄:/app/httpd24/htdocs
自定義啓動腳本:(參考httpd-2.2的服務腳本)
cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24
vim /etc/rc.d/init.d/httpd24
apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
service httpd24 start|stop
chkconfig --add httpd24
配置文件:
默認沒有httpd24.d/ 可以自己建立並在主配置文件中使用include 即可
2018年7月3日14:53:32