Web Service

標(biāo)簽(空格分隔): Linux 運(yùn)維 HTTP Web
實(shí)驗(yàn)主機(jī):
? CentOS7.2 10.0.0.11
? CentOS6.8 10.0.0.61


HTTP協(xié)議: Hyper Text Mark Language,超文本傳輸協(xié)議.客戶端/服務(wù)器端架構(gòu),服務(wù)器端監(jiān)聽在一個(gè)Socket(套接字)上,客戶端也是通過一個(gè)Scoket向服務(wù)端發(fā)送請求信息.

HTTP版本

? HTTP/0.9: 原型版本
? HTTP/1.0: 增加了cache,MIME等功能
? HTTP/1.1: 擴(kuò)展了cache,加入更多的首部 條件式請求

端口范圍

IANA(The Internet Assigned Numbers Authority炫加,互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))是負(fù)責(zé)協(xié)調(diào)一些使Internet正常運(yùn)作的機(jī)構(gòu)。
常用端口分類:
? 0 ~ 1023: 眾所周知,永久地分配給固定的應(yīng)用程序使用,特權(quán)端口(僅root有權(quán)限使用)
? 1024 ~ 41951: 注冊端口,但要示略寬松,分配給某程序注冊使用.
? 40952+:客戶端程序使用的隨機(jī)端口,動(dòng)態(tài)端口,或稱為私有端口.

Linux系統(tǒng)中的本地端口范圍查看可執(zhí)行cat /proc/sys/net/ipv4/ip_local_port_range命令查看,默認(rèn)是32768 ~ 61000,以下為這個(gè)文件的說明:
The /proc/sys/net/ipv4/ip_local_port_range defines the local port range that is used by TCP and UDP traffic to choose the local port. You will see in the parameters of this file two numbers: The first number is the first local port allowed for TCP and UDP traffic on the server, the second is the last local port number. For high-usage systems you may change its default parameters to 32768-61000 -first-last.

HTTP的事務(wù)與格式

HTTP的事務(wù)可分為request與response,即請求與響應(yīng).其格式分別如下
request:

<method> <URL><http version>
HEADERS:
<body>

response:

<http version> status code
<body>

URL: 定位互聯(lián)網(wǎng)中的某一個(gè)資源

<scheme>://<user>:<passowrd>@<host>[:<port>]/<path>;<params>?<query>#<frag>

method:
GET HEAD POST PUT DELETE OPTIONS RACE ...
status code

1xx:信息類
2xx:成功類
3xx:重定向類
4xx:客戶端錯(cuò)誤類
5xx:服務(wù)端錯(cuò)誤類

一次完整的Http請求響應(yīng)過程:
(1) 建立或處理連接播瞳;接收或拒絕請求;
(2) 接收請求
(3) 處理請求:解析請求;
(4) 訪問資源:
資源映射:DocumentRoot /var/www/html/
http://www.magedu.com/index.html --> /var/www/html/index.html
(5) 構(gòu)建響應(yīng)報(bào)文
(6) 發(fā)送響應(yīng)報(bào)文
(7) 記錄日志

HTTP協(xié)議的實(shí)現(xiàn)

  • httpd
  • nginx
  • ...

HTTP常用首部

? 通用首部

  • Connection: {close,keep-alive} 長連接
  • Date: 報(bào)文創(chuàng)建的日期時(shí)間
  • Via: 經(jīng)由,報(bào)文傳輸經(jīng)過的中間代理服務(wù)器
  • Cache-Control: 定義緩存控制機(jī)制,http1.1才有

? 請求首部(客戶端)

  • Accept: 可接受的MIME類型
  • Accept-language: 可接受的語言
  • Accept-encoding: 可接受的內(nèi)容編碼格式,如deflate,gzip
  • Accept-Charset: 可接受的字符集
  • Host: 請求的服務(wù)器的名稱和端口
  • Referer: 跳轉(zhuǎn)至當(dāng)前頁面的上級頁面
  • User-Agent: (多數(shù)情況下是)客戶端的瀏覽器類型
  • Expect:
  • If-Modified-Since
  • If-Unmodified-Since
  • If-None-Match
  • If-Match
  • Authorization:
  • Cookie

? 響應(yīng)首部

  • Age:
  • Server
  • Accept-Range: 服務(wù)端可接受的請求類型的范圍
  • Vary: 其它首部列表
  • Set-Cookie:

? 實(shí)體首部

  • Content-Encoding
  • Content-language
  • Content-Lenth
  • Content-location
  • Content-Type
  • Allow: 允許客戶端的請求方法
  • Location: 資源的真正地址
  • Etag
  • Expires
    • last-Modifiled

? 擴(kuò)展首部

  • X-Forwarded-For

httpd的安裝與詳細(xì)說明

yum -y install httpd # 安裝httpd-2.4.6-45.el7.centos.x86_64
下面2個(gè)工具是作為依賴會(huì)被安裝
httpd-tools
mailcap.noarch
httpd的程序環(huán)境

`/etc/httpd/conf/httpd.conf`   # 主配置文件
`/etc/httpd/conf.d`            # 輔助配置文件目錄
`/etc/httpd/conf.modules.d`    # 加載模塊的配置文件

httpd的Unit File說明

[Unit]
Description=The Apache HTTP Server              # 描述
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd            # 給httpd設(shè)置額外的環(huán)境變量或傳遞額外的參數(shù),如下面的$OPTIONS就在這里設(shè)置
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND # 啟動(dòng)httpd需要執(zhí)行的放在前臺(tái)交給systemd處理
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful # 重載時(shí)執(zhí)行的命令
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

httpd相關(guān)的命令與用法

/usr/sbin/httpd:
    httpd: 不接任何參數(shù)直接啟動(dòng)httpd
    -M: 列出httpd所有加載的靜態(tài)的與共享的模塊
    -t: 測試配置文件語法
    
/usr/sbin/apachectl: 管理httpd的一個(gè)shell腳本程序
    -k start:        開啟httpd
    -k stop:         關(guān)閉httpd
    -k restart:      重啟httpd
    -k  graceful:    優(yōu)雅地重啟httpd
    -k graceful-stop:優(yōu)雅地關(guān)閉httpd
  

httpd配置指令說明

ServerRoot "/etc/httpd"  # httpd服務(wù)器配置的目錄樹的頂級目錄,所有配置文件里的相對路徑都是相對這個(gè)
Listen 80                # 默認(rèn)httpd監(jiān)聽的IP與端口,可添加多個(gè)
KeepAlive On|Off         # 持久連接
KeepAliveTimeout NUM(ms) # 持久連接的超時(shí)時(shí)長
MaxKeepAliveRequests NUM # 一次持久連接允許的連接數(shù)目
LoadModule foo_module modules/mod_foo.so  # 加載指定模塊文件
Include conf.modules.d/*.conf             # 包含其它的配置子文件,相對于ServerRoot目錄
<IfModule [!]MODULE_NAME>:                # 指令塊,里面放置一些指令,但是只能是在指定的模塊存在時(shí)才有效
    "
    <IfModule dir_module>
        DirectoryIndex index.html   #定義站點(diǎn)主頁面,可跟多個(gè)
    </IfModule>
    "
ErrorLog "logs/error_log":          # 指定錯(cuò)誤日志文件存放的位置
LogLevel warn            :          # 日志級別
LogFormat:                          # 日志格式,可查看[日志格式][1]
    
CustomLog "logs/access_log" common: # 自定義日志文件
DocumentRoot "/var/www/html":       # 網(wǎng)站文檔根目錄
ServerName www.example.com:80:      # 服務(wù)器名
<Directory "/usr/local/httpd/htdocs"> # 設(shè)置指令的生效(作用)范圍(本地文件系統(tǒng))其中常用的包含指令有
    Options Indexes FollowSymLinks None All ...
    AllowOverride None  # Types of directives that are allowed in .htaccess files
    # Allow open access:
    Require all granted|denied
    #Require [not] ip IP|NETWORK
    #Require [not] host HOSTNAME
<Location /private2/>                # 同上但基于URL路徑進(jìn)行控制
Alias  /URL/  "/PATH/TO/SOME_DIR/"   # 路徑別名,URL-文件系統(tǒng)
<VirtualHost IP:PORT>                # 定義虛擬主機(jī) 本機(jī)的IP與監(jiān)聽的端口
    ServerName
    DocumentRoot
</VirtualHost>
<Location /status>                   # 定義狀態(tài)頁面,通常放在status.conf
    SetHandler server-status
    Require all granted
</Location>
    
ExtendedStatus {On|Off}              # 是否輸出擴(kuò)展的狀態(tài)信息
------------------------------------------------------------------------------
httpd-2.2:static                    # MPM機(jī)制說明
httpd-2.4:shared
    prefork:兩級架構(gòu),由進(jìn)程響應(yīng)每個(gè)請求
        master process:1個(gè)撩匕, 
        child process:n個(gè),
    worker:每線程響應(yīng)一個(gè)請求墨叛;三級架構(gòu)
        master process:1個(gè)
        child process:n個(gè)
            thread:m個(gè)
    event:每進(jìn)程響應(yīng)多個(gè)請求滑沧;
    
    prefork
        ServerLimit             
        StartServers
        MinspareServers
        MaxSpareServers
        MaxConnectionsPerchild
        MaxRequestWorkers 
        
    woker:
        ServerLimit
        StartServers
        MinSpareThreads
        MaxSpareThreads
        MaxRequestWorkers
        ThreadsPerChild 
        
    event:
        ThreadsPerChild
        MaxRequestWorkers
        AsyncRequestWorkerFactor
------------------------------------------------------------------------------      
AuthType basic                           # 用戶認(rèn)證
AuthName "Admin Area, Enter your name/password"
AuthUserFile "/etc/httpd/conf/.htpasswd" # htpasswd -c -m USERNAME [PWD]
Require valid-user
#AuthGroupFIle "/etc/httpd/conf/.htgroup"# 文件格式group_name: user1 user2 ..
#Require group 
------------------------------------------------------------------------------
使用mod_deflate模塊壓縮頁面優(yōu)化傳輸速度(需要裝載deflate_module模塊)
    適用場景:
        (1) 節(jié)約帶寬,但會(huì)額外消耗CPU巍实;同時(shí)滓技,可能有些較老瀏覽器不支持;
        (2) 壓縮適于壓縮的資源棚潦,例如文件文件/etc/httpd/conf.d/deflate.conf令漂;
    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 has some problems.  瀏覽器匹配機(jī)制
    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

httpd調(diào)用ssl實(shí)現(xiàn)HTTPS安全傳輸

SSL會(huì)話的簡化過程
    ㈠ 客戶端發(fā)送可供選擇的加密方式,并向服務(wù)器請求證書.
    ㈡ 服務(wù)器端發(fā)送證書以及選定的加密方式給客戶端
    ㈢ 客戶端取得證書并進(jìn)行證書驗(yàn)證
        ① 驗(yàn)證證書的來源的合法性,用CA的公鑰解密證書上數(shù)字簽
        ② 驗(yàn)證證書的內(nèi)容的合法性,完整性驗(yàn)證
        ③ 檢查證書的有效期限
        ④ 檢查證書是否被吊銷 
        ⑤ 證書中擁有者的名字,與訪問的目標(biāo)主機(jī)要一對致
    ㈣ 客戶端端生成臨時(shí)會(huì)話密鑰(對稱密鑰),并使用服務(wù)器端的公鑰加密此數(shù)據(jù)發(fā)送給服務(wù)器,完成密鑰交換
    ㈤ 服務(wù)用此密鑰加密用戶請求的資源,響應(yīng)給客戶端
注意:SSL會(huì)話是基于IP地址創(chuàng)建,所以單IP主機(jī)止,僅可以使用一個(gè)https虛擬主機(jī).

配置實(shí)例

1. 確保httpd裝載了ssl_module模塊,默認(rèn)不存在需要安裝.
`yum -y install mod_ssl`
/etc/httpd/conf.d/ssl.conf            # 配置基于SSL的虛擬主機(jī)
/etc/httpd/conf.modules.d/00-ssl.conf # 裝載mod_ssl.so模塊的指令
/usr/lib64/httpd/modules/mod_ssl.so   # mod_ssl.so的路徑
/usr/libexec/httpd-ssl-pass-dialog    # 
/var/cache/httpd/ssl                  # ssl緩存目錄,有效期為5分鐘
`systemctl reload httpd`              # 重載httpd使生效
2. 創(chuàng)建測試用的私有CA
    cd /etc/pki/CA/
    (umask 077;openssl genrsa -out private/cakey.pem 4096)
    openssl req -new -x509 -key private/cakey.pem -out cacert.pem
    echo 01 > serial
    touch index.txt
    
    cd /etc/httpd; mkdir certs;cd certs
    (umask 077;openssl genrsa -out httpd.key 2048)
    openssl req -new -key httpd.key -out httpd.csr  # 生成證書請求文件
    openssl ca -in httpd.csr -out httpd.crt
3. 編輯/etc/httpd/conf.d/ssl.conf 
    SSLCertificateFile /etc/httpd/certs/httpd.crt
    SSLCertificateKeyFile /etc/httpd/certs/httpd.key
    DocumentRoot "/var/www/html"
    ServerName www.magedu.com:443
4. systemctl httpd reload                           # 此時(shí)443端口應(yīng)該開啟了

httpd自帶的應(yīng)用程序

? htpasswd: basic認(rèn)證基于文件實(shí)現(xiàn),用于生成賬號和密碼的程序
? apachectl: httpd自帶的報(bào)務(wù)控制腳本,支持start和stop等命令
? apxs: apache 擴(kuò)展工具
? rotatelogs:
? ab: apache benchmarking tools

httpd2.2與httpd2.4的不同之處

? 2.2中的"mpm_prefork_module (static)" 是靜態(tài)編譯的,可在/etc/sysconfig/httpd文件中更改,httpd的啟動(dòng)腳本會(huì)調(diào)用這個(gè)環(huán)境文件

? 2.2的配置文件中MPM的默認(rèn)配置如下

<IfModule prefork.c>
    StartServers       8         # 初始啟動(dòng)的子進(jìn)程數(shù)量
    MinSpareServers    5         # 最小空閑子進(jìn)程數(shù)量
    MaxSpareServers   20         # 最大空閑子進(jìn)程數(shù)量
    ServerLimit      256         # 子進(jìn)程數(shù)量上限
    MaxClients       256         # 最大并發(fā)請求數(shù) 其值小于等于ServerLimit
    MaxRequestsPerChild  4000    # 每個(gè)子進(jìn)程服務(wù)請求超過4000的話就會(huì)被主進(jìn)程銷毀重建
</IfModule>
    
<IfModule worker.c>
    StartServers         4       # 初始啟動(dòng)的子進(jìn)程數(shù)量 worker進(jìn)程
    MaxClients         300       # 最大并請求數(shù)
    MinSpareThreads     25       # 最小空閑線程數(shù)量
    MaxSpareThreads     75       # 最大空閑線程數(shù)量
    ThreadsPerChild     25       #  每個(gè)worker有多少個(gè)線程,即啟動(dòng)時(shí)有100個(gè)線程,但因?yàn)樯厦娑x了最大空閑線程為75個(gè)所以會(huì)自動(dòng)殺死一個(gè)worker子進(jìn)程.(可實(shí)驗(yàn))
    MaxRequestsPerChild  0       # 每個(gè)worker進(jìn)程最多能處理多少個(gè)請求.0表示沒有限制
</IfModule>

? 2.2中基于IP的訪問機(jī)制的指令與2.4不同,前者使用allow deny等詞,后者使用Require

Require all denied|granted       # httpd2.4中(將基于IP與基于用戶都用Require指令配置,統(tǒng)一了風(fēng)格)
Order allow,deny                 # httpd2.2中,由這2行設(shè)置
Allow from all

? 2.2中基于ServerName的虛擬主機(jī),要使用專用指令NameVirtualHost

即在2.2中定義基于ServerName的虛擬主機(jī)的話必須在開件開頭添加一行如下:
NameVirtualHost IP:PORT
...
否則httpd會(huì)有如下錯(cuò)誤提示:
[warn] _default_ VirtualHost overlap on port 80, the first has precedence

? 2.2中對于<Directory >授權(quán)沒有2.4嚴(yán)格,在2.4中必須對指定的文件做Directory授權(quán)才能訪問
[1]: http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丸边,隨后出現(xiàn)的幾起案子叠必,更是在濱河造成了極大的恐慌,老刑警劉巖妹窖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纬朝,死亡現(xiàn)場離奇詭異,居然都是意外死亡骄呼,警方通過查閱死者的電腦和手機(jī)共苛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門判没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隅茎,你說我怎么就攤上這事澄峰。” “怎么了辟犀?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵俏竞,是天一觀的道長。 經(jīng)常有香客問我堂竟,道長魂毁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任出嘹,我火速辦了婚禮漱牵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疚漆。我一直安慰自己酣胀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布娶聘。 她就那樣靜靜地躺著闻镶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丸升。 梳的紋絲不亂的頭發(fā)上铆农,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音狡耻,去河邊找鬼墩剖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夷狰,可吹牛的內(nèi)容都是我干的岭皂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼沼头,長吁一口氣:“原來是場噩夢啊……” “哼爷绘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起进倍,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤土至,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后猾昆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陶因,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年垂蜗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楷扬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解幽。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毅否,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝇刀,我是刑警寧澤螟加,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吞琐,受9級特大地震影響捆探,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜站粟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一黍图、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奴烙,春花似錦助被、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幅虑,卻和暖如春丰滑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倒庵。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工褒墨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人擎宝。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓郁妈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绍申。 傳聞我的和親對象是個(gè)殘疾皇子圃庭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)失晴,斷路器剧腻,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • 以下教程翻譯自Spring官方網(wǎng)站(spring.io), 原文名(Building a RESTful Web ...
    Haocheng閱讀 3,240評論 0 5
  • 如今微服務(wù)和分布式架構(gòu)變的越來越流行,而簡單涂屁,可靠书在,高效,跨平臺(tái)和跨語言的 Web Service 則是這類系統(tǒng)架...
    JeffreyLi閱讀 5,458評論 0 42
  • web service 相關(guān) 什么是Web Service栈源? 答:從表面上看挡爵,Web Service就是一個(gè)應(yīng)用程...
    niuben閱讀 921評論 0 3
  • 手機(jī)里嘀嘀的信息提示聲響起,可孩子感冒住院倒騰的我連看手機(jī)的時(shí)間也沒有甚垦。等寶寶鬧過睡著了茶鹃。我終于可以松一口氣忙乎一...
    補(bǔ)拙莫如勤LV閱讀 447評論 6 5