要經過Internet進行通訊,至少須要一對套接字;其中一個運行在客戶端,定義了一個惟一的客戶進程,稱之爲ClientSocket
,另外一個運行於服務器端面,定義了一個惟一的服務器進程,稱爲ServerSocket
。根據鏈接啓動的方式以及本地要鏈接的目標,套接字之間的鏈接過程能夠分爲三個步驟:服務器監聽、客戶端請求、鏈接確認javascript
Socket套接字php
套接(Socket)字做用
進程間通訊(IPC)的一種實現,容許位於不一樣主機(或同一主機)上不一樣進程之間進行通訊和數據交換css
進程間通訊(IPC,Inter-Process Communication)指至少兩個進程或線程間傳送數據或信號的一些技術或方法html
Socket組成
IP地址和端口號,合稱爲套接字地址(socket address)java
開發程序時如何實現Socket通信
調用Socket API(封裝了內核中所提供的socket通訊相關的系統調用),須要指定兩項內容linux
AF_INET
:Address Family,IPv4 <==經常使用AF_INET6
:IPv6AF_UNIX
:UNIX文件,同一主機上不一樣進程之間通訊時使用,不須要封裝解封裝,經過此文件通信SOCK_STREAM
:流,tcp套接字,可靠地傳遞、面向鏈接 <==經常使用SOCK_DGRAM
:數據報,udp套接字,不可靠地傳遞、無鏈接SOCK_RAW
:裸套接字,無須tcp或udp,APP直接經過IP包通訊
#API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基於某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工做機制的細節nginx
應用程序通信過程
開發一個能夠和網絡通信的應用程序,客戶端和服務端相互通信,須要調用Socket相關的一些函數
web
通信過程正則表達式
套接字相關的系統調用:shell
函數 | 描述 |
---|---|
socket() | 建立一個套接字 |
bind() | 綁定IP和端口 |
listen() | 監聽 |
accept() | 接收請求 |
connect() | 請求鏈接創建 |
write() | 發送 |
read() | 接收 |
close() | 關閉鏈接 |
HTTP相關術語
http
(Hyper Text Transfer Protocol, 80/tcp)超文本是由信息結點和表示信息結點間相關性的鏈構成的一個具備必定邏輯結構和語義的網絡,可使單一的信息之間相互交叉「引用」
html
(Hyper Text Markup Language )超文本(index.html)顯示效果
普通文本顯示效果
CSS
(Cascading Style Sheet )js
javascript(與java沒有關係)MIME
(Multipurpose Internet Mail Extensions)/etc/mime.types
HTTP協議歷史
HTTP 協議不帶有狀態(記不住訪問者是誰),每次請求都必須附上全部信息。請求的不少字段都是重複的,浪費帶寬,影響速度
http/0.9:1991,原型版本
功能簡陋,只有一個命令GET。GET /index.html ,服務器只能迴應HTML格式字符串,不能迴應別的格式
http/1.0:1996年5月
支持緩存(cache)
開始執行MIME,
引入更多method
頭信息是 ASCII 碼,後面數據可爲任何格式,服務器迴應時會告訴客戶端,數據是什麼格式,即Content-Type字段的做用。
缺點
每一個TCP鏈接只能發送一個請求,發送數據完畢,鏈接就關閉,若是還要請求其餘資源,就必須再新建一個鏈接
http/1.1:1997年1月
Spdy:2009年
谷歌研發,解決 HTTP/1.1 效率不高問題
http/2.0:2015年
工做機制
一次HTTP操做稱爲一個事務,其工做過程可分爲四步
Web資源:web resource
一個網頁由多個資源構成,打開一個頁面,會有多個資源展現出來,可是每一個資源都要單獨請求。所以,一個「Web 頁面」一般並非單個資源,而是一組資源的集合
HTTP鏈接方式
URI(Uniform Resource Identifier)
統一資源標識,分爲URL和URN,URN使用的較少,因此不少時候說URI就是在說URL
schame
user
password
Host
port
path
params
query
frag
網站訪問量
QPS= PV* 頁面衍生鏈接次數/ 統計時間(86400)
併發鏈接數 =QPS * http平均響應時間
處理步驟
創建鏈接
客服向服務器發起請求,此請求包括一些數據報文的頭部,包括(method:GET、POST/PUT/HEAD/DELECT等)
接收請求(可能會拒絕)
接收客戶端請求報文中對某資源的一次請求的過程
處理請求
服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
訪問資源
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
構建響應報文
一旦Web服務器識別出了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體
發送響應報文
Web服務器經過鏈接發送數據時也會面臨與接收數據同樣的問題。服務器可能有不少條到各個客戶端的鏈接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄鏈接的狀態,還要特別注意對持久鏈接的處理。對非持久鏈接而言,服務器應該在發送了整條報文以後,關閉本身這一端的鏈接。對持久鏈接來講,鏈接可能仍保持打開狀態,在這種狀況下,服務器要正確地計算Content-Length首部,否則客戶端就沒法知道響應何時結束了
記錄日誌
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務
元數據:請求報文首部
Web訪問響應模型(Web I/O)
http請求報文
http迴應報文
http服務器程序
應用程序服務器
提供http服務的應用,能夠提供動態程序
市場統計
www.netcraft.com
特性
高度模塊化:core(核心模塊) + modules(輔助模塊)
模塊管理方式:
MPM工做模式
m*n
,佔用資源少m*n
個,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力httpd功能特性
正向代理
一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端;使用緩存特性,能夠減小局域網客戶端帶寬使用率;幫助客戶端訪問遠程服務器
版本:
CentOS 6: 2.2
CentOS 7: 2.4
安裝方式:
rpm:centos發行版,穩定,建議使用
編譯:定製或特殊需求
相關文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
/usr/lib/systemd/system/httpd.service
/usr/lib64/httpd
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
默認http網頁數據存放路徑
/var/www/html
日誌存放路徑
軟鏈接:/etc/httpd/logs
真實路徑:/var/log/httpd
文件屬主爲root,Apache運行時會開啓子進程,是能夠寫入的
主進程編號文件存放目錄
/etc/httpd/run/httpd.pid
幫助文檔包
httpd-manual
檢查配置語法:
httpd –t
service httpd configtest
httpd配置文件的組成
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式
directive value
子配置文件之因此優先權高,是由於子配置文件是在主配置文件最後加載的,至關於變量賦值,後面進行的賦值會覆蓋前面的
顯示服務器版本信息
配置指令
各類級別顯示效果,建議使用ServerTokens Prod
查看顯示效果,能夠經過網站F12查看請求報文,或者在命令行使用curl -I
修改監聽的IP和Port
Listen [IP:]PORT
持久鏈接(Persistent Connection)
鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其它的請求完成,默認關閉持久鏈接
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
MPM( Multi-Processing Module)多路處理模塊
對linux而言,原本就是使用LWP(ligth weight process)機制
/etc/sysconfig/httpd
找到以下行,至關於變量,將值修改成對應模式,重啓生效HTTPD=/usr/sbin/httpd.worker
httpd -M
httpd -l
(小L)ab
全面爲ApacheBench,-c
表示併發訪問個數,-n
最多訪問次數DSO(Dynamic Shared Object)動態共享對象
定義’Main’ server的文檔頁面路徑
DocumentRoot指向的路徑爲URL路徑的起始位置
注意:SELinux和iptables的狀態
DocumentRoot 「/path」
定義站點主頁面
主頁面顯示的內容默認值文件index.html,沒有此文件會顯示testing 123
站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制:源地址,用戶帳號
訪問控制路徑格式
Options定義行爲
Options
後跟1個或多個以空白字符分隔的選項列表,定義了用戶在某個目錄下的特定行爲,在選項前的+,- 表示增長或刪除指定選項/etc/httpd/conf.d/welcom.conf
定義的,改變此配置文件後綴,讓其失效-Indexes
<Directory>
中「基於源地址」實現訪問控制
與訪問控制相關的指令能夠放在指定目錄下的.htaccess
(.htaccess爲默認值,能夠由AccessFileName在配置文件中自定義)文件中,覆蓋以前的配置指令只對<directory>
語句有效
Allow Override
AllowOverride All
:AllowOverride None
:AllowOverride AuthConfig Indexes
:.htaccess
文件,實現目錄訪問控制,重啓生效httpd2.2用於容許或拒絕的語句
directory
, .htaccess
中http2.4基於IP的訪問控制
無明確受權的目錄,默認拒絕
Require all granted
Require all denied
日誌設定
在hpptd中日誌分爲訪問日誌和錯誤日誌兩類
錯誤日誌:ErrorLog
級別 | 描述 | 示例 |
---|---|---|
emerg | 緊急狀況系統沒法使用 | 「Child cannot open lock file. Exiting」 |
alert | 必須當即處理 | 「getpwuid: couldn’t determine user name from uid」 |
crit | 關鍵條件,危險狀況 | 「socket: Failed to get a socket, exiting child」 |
error | 錯誤條件 | 「Premature end of script headers」 |
warn | 警告信息 | 「child process 1234 did not exit, sending another SIGHUP」 |
notice | 正常但比較重要的信息 | 「httpd: caught SIGBUS, attempting to dump core in …」 |
info | 通常信息 | "Server seems busy, (you may need to increase StartServers, or |
debug | 調試級消息 | 「Opening config file …」 |
訪問日誌
參考幫助
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
定義日誌格式:LogFormat format strings
符號 | 描述 |
---|---|
%h | 客戶端IP地址 |
%l | 遠程用戶,啓用mod_ident纔有效,一般爲減號「-」 |
%u | 驗證(basic,digest)遠程用戶,非登陸訪問時,爲一個減號「-」 |
%t | 服務器收到請求時的時間,格式爲[18/Sep/2011:19:18:28 -0400] |
%r | First line of request,即表示請求報文的首行;記錄了這次請求的「方法」,「URL」以及協議版本 |
%>s | 響應狀態碼 |
%b | 響應報文的大小,單位是字節;不包括響應報文http首部 |
%{Referer}i | 請求報文中首部「referer」的值;即從哪一個頁面中的超連接跳轉至當前頁面的,用於分析是否鏈接被盜用,是否由合做網站跳轉過來 |
%{User-Agent}i | 請求報文中首部「User-Agent」的值;即發出請求的應用程序,用戶使用的爲那種瀏覽器 |
在配置文件中定義使用那種日誌格式
CustomLog logs/access_log combined
修改日誌時間格式
格式爲%{format}t,設置幫助爲man 3 strftime
例如:%{%Y-%m-%d %H:%M:%S}t 輸出格式爲[2018-09-30 09:18:32]
配置文件修改內容
設定默認字符集
中文字符集:GBK, GB2312(簡體字), GB18030
定義路徑別名
將DocumentRoo以外的目錄,顯示到網站上
Alias /URL/ "/PATH/"
基於用戶的訪問控制
認證質詢
WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供帳號和密碼
認證:Authorization
客戶端用戶填入帳號和密碼後再次發送請求報文;認證經過時,則服務器發送響應的資源
認證方式兩種:
basic:明文
digest:消息摘要認證,兼容性差
安全域
須要用戶認證後方能訪問的路徑;應該經過名稱對其進行標識,以便於告知用戶認證的緣由
用戶的帳號和密碼
虛擬帳號:僅用於訪問某服務時用到的認證標識
帳號存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等
basic認證配置示例:
提供帳號和密碼存儲(文本文件)
使用專用命令完成此類文件的建立及用戶管理
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
選項 | 描述 |
---|---|
-c | 自動建立文件,僅首次時使用,再次使用會覆蓋 |
-p | 明文密碼 |
-d | CRYPT格式加密,默認 |
-m | md5格式加密 |
-s | sha格式加密 |
D | 刪除指定用戶 |
基於用戶的訪問控制示例
方法一:在配置文件中定義認證範圍
方法2
在須要認證的目錄下建.htaccess文件,將認證語法寫入此文件,而後在配置文件中受權.htaccess
基於組帳號進行認證
遠程客戶端和用戶驗證的控制
實現用戶家目錄的http共享,只是共享其中的某個目錄
基於模塊’mod_userdir.so’實現
若是SELinux啓用須要添加: http_enable_homedirs
ServerSignature On | Off | EMail
當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省狀況下因爲打開了 ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本等信息
ServerType inetd | standalone
設置獨立或非獨立服務,只適用於Unix平臺
status頁面
httpd經過內部的處理器Handler在其內部經過模塊status_module
來額外提供服務器狀態的頁面
虛擬主機
基於一個主機,運行多個網站
實現方案:
注意事項
通常虛擬機不要與main主機混用;所以,要使用虛擬主機,通常先禁用main主機
禁用方法:註釋中心主機的DocumentRoot指令便可
虛擬主機的配置方法:
其它可用指令:
ServerAlias:虛擬主機的別名;可屢次使用
ErrorLog: 錯誤日誌
CustomLog:訪問日誌
<Directory 「/path"> </Directory>
:受權
示例
準備工做,設計運行三個網站web1 、web2 、web3
分別爲其創建html目錄,並建立頁面文件
</div> <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet"> </div>