您好,登錄后才能下訂單哦!
Linux的愛之初體驗web服務~~!!!(之所以這么說我覺得這是進入Linux世界的第一個也是重要的一個服務)
文章叫長,懂的隨便看看可能有不對的地方請校正。小白看看也可以理解理解大白話寫的!
http 超文本傳輸協議筆記
傳輸層:tcp/udp提供進程地址
Port number:
tcp:傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束后拆除鏈路;數據流通信協議
0-65535 Linux中端口數
udp:User Datagram Protocol,無連接的協議;無連接的數據報文通信協議
0-65535
IANA:
0-1023:眾所周知,永久的分配給固定的應用使用,特權端口,22/tcp(ssh), 80/tcp(http), 443/tcp(https) 只有管理員擁有權限注冊使用
1024-41951:亦為注冊端口,但要求并不是特別嚴格,分配給程序注冊為某應用使用,11211/tcp, 11211/udp (memcached), 3306/tcp(mysql)
41952+:客戶端程序隨機使用的端口;動態端口,或私有端口;其范圍的定義:/proc/sys/net/ipv4/ip_local_port_range
客戶端訪問服務器端隨機生成端口,訪問服務器端的某固定端口。
套接字Socket: IPC的一種實現,允許位于不同主機(甚至同一主機)上不同進程之間進行通信;從而完成數據交換;也稱為Socket API庫調用接口, 第一次出現在1983年,4.2 BSD系統上(伯克利系統分發版)。
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW: 裸套接字(不借助UDP/TCP的接口進行通信)
IPv4:
分類:
A:1-127
B:128-191
C:192-223
D:組播,224-239
E:240-254
私有地址:
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
TCP協議的特性:
建立連接:三次握手
將數據打包成段:校驗和(CRC-32)循環冗余檢驗
確認、重傳以及超時:
報文排序:邏輯序號
流量控制:滑動窗口算法(有接收緩存控制,快滿時暫停接收)發送方流量小的情況下
擁塞控制:慢啟動和擁塞避免算法
Socket Domain(根據其所使用的地址):socket又分為三類
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主機上不同進程之間通信時使用;
每類套接字都至少提供了兩種socket:流,數據報
流:可靠地傳遞、面向連接、無邊界;
數據報:不可靠地傳遞、有邊界、無連接;(比如寄信,有信封,封裝多封就需要多個)
套接字相關的系統調用:
socket(): 創建一個套接字;
bind():綁定
listen():監聽
accept():接收請求
connect():請求連接建立
write():發送
read():接收
send(), recv(), 發接
sendto(), recvfrom() 發接
HTTP協議
http: hyper text transfer protocol, 80/tcp
html: 編程語言,超文本標記語言;
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h2></h2>
<p> blabla... <a > blabal </a> </p>
<h3></h3>
</body>
</html>
CSS: Cascading Style Sheet 級聯樣式表
js: javascript
MIME: Multipurpose Internet Mail Extesion多用途Internet郵件擴展
工作機制:
http請求
http響應
被請求的內容稱為:Web資源:web resource
靜態文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi
動態文件:.php, .jsp, (客戶端請求時不是直接反饋給客戶端而是先在服務器端執行一次)
(比如:Windows瀏覽器需要借助外部插件來工作,瀏覽器本身不具備打開圖片或視頻等而且根據文件的后綴名來決定借助由客戶端的某個插件來打開)
媒體:決定了客戶端的瀏覽器如何打開借助那個插件
媒體類型(MIME類型):major/minor(主類型/次類型)
text/html 超文本文檔
text/plain 純文本文檔
p_w_picpath/jpeg
p_w_picpath/gif
URI: Uniform Resource Identifier統一資源標識符
URL: Uniform Resorce Locator,用于描述某服務器某特定資源的位置;
Scheme://Server:Port/path/to/resource
http://www.magedu.com/p_w_picpaths/logo.jpg
URN: Uniform Resource Naming統一資源命名
http協議版本:
HTTP/0.9:原型版本,功能簡陋
HTTP/1.0:第一個廣泛使用的版本,支持MIME
HTTP/1.1: 增強了緩存功能
Spdy
HTTP/2.0:
rfc文檔讀一讀有助于了解 1.1 2.0
一次完整的http請求處理過程:
(1) 建立或處理連接:接收請求或拒絕請求
(2) 接收請求:
接收來自于網絡的請求報文中對某資源的一次請求的過程;
并發訪問響應模型(Web I/O):
單進程I/O結構:啟動一個進程處理用戶請求,而且一次只處理一個;多個請求被串行響應;(多個請求到來排隊,依次處理)
多進程I/O結構:并行啟動多個進程,每個進程響應一個請求;
復用I/O結構:一個進程響應n個請求;(借用一個復用I/O 處理器基于事件驅動機制)
多線程模型:一個進程生成N個線程,每個線程響應一個用戶請求;
事件驅動:event-driven(一個進程內部維持一個類似事件監控器,能夠監控著多個I/O使得一個服務器進程能夠同時連接多個請求)針對怎么知道每一個請求的連接與結束,在服務器編程時在內部基于事件回調的機制來完成連接狀態(i/o)的追蹤,并基于回調的狀態來完成連接與結束的響應。
復用的多進程/線程--I/O結構:啟動多個(m)進程,每個進程響應n個請求;
(3) 處理請求:對請求報文進行解析,并獲取請求的資源及請求方法等相關信息
元數據:請求報文首部
<method>//請求的方法 <URL>//資源 <VERSION>//版本
Host: www.magedu.com 請求的主機名稱
Connection://指明此次連接使用的方式
(4) 訪問資源:獲取請求報文中請求的資源
web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行后生成的資源;這些資源放置于本地文件系統某路徑下,此路徑通常稱為DocRoot
/var/www/html/
p_w_picpaths/1.jpg
http://www.magedu.com/p_w_picpaths/1.jpg
web服務器資源路徑映射方式:
(a) docroot
(b) alias
(c) 虛擬主機docroot
(d) 用戶家目錄docroot
(5) 構建響應報文
資源的MIME類型:標記的方法
顯式分類
魔法分類
協商分類
URL重定向:
web服務構建的響應并非客戶端請求的資源,而是資源另外一個訪問路徑;
(6) 發送響應報文
(7) 記錄日志
http服務器程序:
httpd (apache)
nginx
Lighttpd //德國人研發輕量級類似Nginx
應用程序服務器(容器類):動靜都能解析
IIS
tomcat, jetty, jboss, resin
webshpere, weblogic, oc4j
www.netcraft.com //查看一些web服務器占用市場的份額
httpd的安裝配置和使用:
httpd: apache
a patchy server = apache
ASF: apache software foundation //軟件基金會
httpd的特性:
高度模塊化:core + modules
DSO: Dynamic Shared Object 動態模塊機制
MPM:Multipath Processing Modules 實現多種不同I/O模型機制
prefork:多進程模型,每個進程響應一個請求;每個主進程只負責監聽套接字,接收請求交給子進程處理請求。
一個主進程:負責生成n個子進程,子進程也稱為工作進程,每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閑進程,隨時等待請求到達;最大不會超過1024個;
worker:多線程模型,每個線程響應一個請求;
一個主進程:生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;
event:事件驅動模型,每個線程響應n個請求;
一個主進程:生成m個子進程,每個進程直接n個請求;
m進程,n線程:m*n
httpd-2.2: event為測試使用
httpd-.24:event可生產使用
CentOS 6:
程序環境
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf //補充性配置文件
服務腳本:
/etc/rc.d/init.d/httpd
服務腳本自己的配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd //prefork 默認使用的
/usr/sbin/httpd.event //event
/usr/sbin/httpd.worker //worker
日志文件目錄:
/var/log/httpd
access_log: 訪問日志
error_log:錯誤日志 //啟動停止訪問錯誤等信息
站點文檔目錄:
/var/www/html
模塊文件路徑:
/usr/lib64/httpd/modules
配置文件的組成:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment //全局環境配置
### Section 2: 'Main' server configuration //主服務器配置
### Section 3: Virtual Hosts ///虛擬主機配置
配置格式:directive value 指令對應的值來完成 比如listen 80
directive: 不區分字符大小寫;
value: 為路徑時,取決于文件系統;
常用配置:修改完配置文件 httpd -t 或者 service httpd configtest 測試語法
1、修改監聽的IP和Port //修改監聽端口需要restart
Listen [IP:]PORT
省略ip表示監聽本機所有IP; Listen可重復出現多次;
2、持久連接
Persistent Connection(長連接):連接建立,每個資源獲取完成后不會斷開連接,而是繼續等待其它的請求完成;
如何斷開?
數量限制:100 資源請求默認100
時間限制:可配置
副作用:對并發訪問量較大的服務器,持久連接功能會使用有些請求得不到響應;
折衷:使用較短的持久連接時間;5秒
httpd-2.4 支持毫秒級持久時間;
非持久連接
KeepAlive On|Off //是否開啟
MaxKeepAliveRequests # //最大連接請求數量
KeepAliveTimeout # //連接超時
測試:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3、MPM
Multipath Process Module:多道處理模塊
prefork, worker, event
httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用于實現對不同MPM機制的支持;確認方法:
# ps aux | grep httpd
默認為/usr/sbin/httpd, 其使用prefork
查看模塊列表:
查看靜態編譯的模塊
# httpd -l ///httpd.worker -l///httpd.event -l
Compiled in modules:
Core.c //核心模塊
Prefork.c /已經使用的
http_core.c //功能核心模塊
mod_so.c //支持模塊動態裝卸載的功能
查看所有靜態編譯及動態裝載的模塊
# httpd -M
更換使用的httpd程序:
/etc/sysconfig/httpd
HTTPD=
重啟服務生效;
prefork的配置:
<IfModule prefork.c>
StartServers 8 //服務啟動時啟動多少服務子進程
MinSpareServers 5 //最小空閑進程數
MaxSpareServers 20 //最大空閑進程數
ServerLimit 256 ///在服務器聲明周期內為MaxClients生成數量
MaxClients 256 ///最大并發數
MaxRequestsPerChild 4000 //一個進程最多能夠響應多少次請求然后死掉
</IfModule>
worker的配置:
<IfModule worker.c>
StartServers 4 //服務啟動時啟動多少服務子進程
MaxClients 300 ///最大并發數,最大啟動的線程數
MinSpareThreads 25 //最少空閑線程
MaxSpareThreads 75 //最大空閑線程
ThreadsPerChild 25 //每個進程能夠啟動的線程數
MaxRequestsPerChild 0 //每個線程最大響應的請求數
</IfModule>
PV, UV
PV: Page View 頁面訪問量
UV: User View 用戶數量
獨立IP有效訪問量;
4、DSO
配置指令實現模塊加載
LoadModule <mod_name> <mod_path>
模塊路徑可使用相對地址
相對于ServerRoot(/etc/httpd)指向的路徑而言;
/etc/httpd/modules/
5、定義'Main' server的文檔頁面路徑
DocumentRoot
文檔路徑映射:
DocumentRoot指向的路徑為URL路徑的起始位置;
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html
6、站點訪問控制
可基于兩種類型的路徑指明對哪些資源進行訪問控制
文件系統路徑:
<Directory ""> </Direcotry>
<File "">
</File>
訪問控制機制:
基于來源地址;
基于賬號;
7、Directory中“基于來源地址”實現訪問控制
(1) Options 建議關閉(如果是下載網站打開不指定默認網頁可以打開網站上資源,非下載網站是不安全的在沒有定義默認頁的情況下同事http的也沒有做測試頁客戶端打開網站會獲取服務器端的所有網站資源)
比如默認根目錄下存放的沒有默認定義的主頁面(index.html)就會索引到根目錄下其他的文檔。
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None, All
Indexes: 索引;//當訪問網站目錄下默認主頁面
FollowSymlinks:允許跟蹤符號鏈接文件;允許訪問網站中根目錄下作鏈接的文件
SymLinksifOwnerMatch: 允許追蹤鏈接文件和源文件為同一屬主就允許(使用少)
MultiViews: 是否允許多視圖(不開啟)(使用少)
(2) 基于來源地址的訪問控制機制
Order:檢查次序
Order allow,deny
Order deny,allow
Allow from
Deny from
來源地址:
IP
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8、定義默認主頁面 訪問沒有指明自左向右訪問
DirecotryIndex index.html index.html.var index.php
9、日志設定
錯誤日志:
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
調試信息、通知、警告、 錯誤、暴擊、警報、緊急
定義warn那么比warn高的級別都將記錄。
訪問日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客戶端IP地址;
%l: Remote logname (from identd, if supplied). -表示為空;遠程登錄名大多數為空
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);用戶認證時的用戶名 大多數無需認證-表示為空
%t:Time the request was received (standard english format),服務器收到請求的時間;默認為英文格式
%r:First line of request,請求報文的首行信息(請求的URL以及協議版本等)(method url version);
%>s: 響應狀態碼;
%b: 響應報文的大小,單位是字節,不包括響應報文首部;
%{Referer}i:請求報文當中"referer"首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來;
%{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的應用程序;
詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路徑別名
DocumentRoot "/www/htocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /3/ "/1/2"
http://www.magedu.com/3/index.html
--> /1/2/3/
Alias /bbs/ "/forum/htdocs"
http://www.magedu.com/bbs/index.html
--> /forum/htdocs/bbs/
11、設定默認字符集
AddDefaultCharset UTF-8
GBK, GB2312, GB18030 中文字符
12、基于用戶的訪問控制
認證質詢:
WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶提供賬號和密碼;
認證:
Authorization:客戶端用戶填入賬號和密碼后再次發送請求報文;認證通過,則服務器發送響應的資源;
認證類型:
basic:明文
digest:消息摘要
安全域:需要用戶認證后方能訪問的路徑;
應該通過名稱對其進行標識,并用于告知用戶認證的原因;
用戶的賬號和密碼存儲于何處?
虛擬賬號:僅用于訪問某服務時用到的認證標識;
存儲:
文本文件
SQL數據庫
ldap
nis
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
(2) 提供賬號和密碼存儲(文本文件)
使用htpasswd命令進行管理
htpasswd [options] passwordfile username
-c: 自動創建passwordfile,因此,僅應該在添加第一個用戶時使用;
-m: md5加密用戶密碼;
-s: sha1加密用戶密碼;
-D: 刪除指定用戶
(3) 實現基于組進行認證
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
</Directory>
要提供:用戶賬號文件和組文件;
組文件:每一行定義一個組
GRP_NAME:user1 user2 user3 ... 組名 冒號 用戶名用空格分隔
示例:
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
</Directory>
13、虛擬主機
有三種實現方案:
基于ip:
為每個虛擬主機準備至少一個ip地址;
基于port:
為每個虛擬主機準備至少一個專用port;實踐中很少使用;
基于hostname:
為每個虛擬主機準備至少一個專用hostname;
可混合使用上述三種方式中任意方式;
注意:一般虛擬主機莫與中心主機混用,所以,要使用虛擬主機,先禁用中心主機;
禁用中心主機:注釋DocumentRoot
每個虛擬主機都有專用配置:
<VirtualHost "IP:PORT">
SeverName
DocumentRoot ""
</VirtualHost>
ServerAlias: 虛擬主機的別名;以下這些都可以定義在虛擬主機中
ErrorLog
CustomLog
<Directory "">
</Directory>
ip addr add [ip/mask] dev eth0 /添加新的IP
Ip addr list //查看
示例1:基于ip
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port
<VirtualHost 172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
14、內置的status頁面 //內置狀態頁面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
</Location>
實現:基于賬號實現訪問控制
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。