HTTP-經常使用配置


前言

這篇主要介紹HTTP服務程序環境php

可能有一些介紹不到,博主能力有限,歡迎大神來糾正改進html

HTTP協議從http/0.9到現在的http/2.0中間發生了很大的改變,如今主流的事http/1.1nginx

image

在不少面試當主就會問起http協議各個版本的不一樣之處,這裏就不介紹它們之間的區別了,有想要了解的能夠百度下,面試的時候看下web

HTTP工做機制:
http請求:http request
http響應:http response
一次http事務:請求<-->響應
面試

在上篇中基本簡單說了下http://www.javashuo.com/article/p-oqtmhmoh-bm.html數據庫

http服務器程序:
       httpd apache
       nginx
       lighttpd
apache

Httpd介紹

httpd:

20世紀90年代初,國家超級計算機應用中心NCSA開發vim

特性:

高度模塊化:core + modules後端

DSO: Dynamic Shared Object 動態加/卸載centos

MPM:multi-processing module多路處理模塊

MPM工做模式

prefork:

一、多進程I/O模型,每一個進程響應一個請求,默認模型

二、個主進程:生成和回收n個子進程,建立套接字,不響應請求

三、多個子進程:工做work進程,每一個子進程處理一個請求;系統初始時,預先生成多個空閒進程,等待請求,最大不超過1024個

如圖:

image

worker:

一、複用的多進程I/O模型,多進程多線程,IIS使用此模型

二、一個主進程:生成m個子進程,每一個子進程負責生個n個線程,每一個線程響應一個請求,併發響應請求:m*n

如圖:

image

event:

一、事件驅動模型(worker模型的變種)

二、一個主進程:生成m個子進程,每一個進程直接響應n個請求,併發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力

如圖:

image

備註:MPM模式也是面試中常問的問題

HTTP安裝

版本

CentOS 6:默認2.2版本(官方以中止支持)

CentOS 7:默認2.4版本

安裝方式

rpm:centos發行版,穩定,建議使用
編譯:定製或特殊需求

備註:後面會介紹編譯安裝----


HTTP-CentOS 7程序環境

新版本2.4特性

MPM支持運行爲DSO機制;以模塊形式按需加載

event MPM生產環境可用

異步讀寫機制

支持每模塊及每目錄的單獨日誌級別定義

每請求相關的專用配置

加強版的表達式分析式

毫秒級持久鏈接時長定義

基於FQDN的虛擬主機不須要NameVirutalHost指令

新指令,AllowOverrideList

支持用戶自定義變量

更低的內存消耗

配置文件:

/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf


檢查配置語法:

httpd –t
service httpd configtest

模塊相關的配置文件:

/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 -l

查看靜態編譯及動態裝載的模塊

httpd –M

動態模塊加載:不需重啓即生效

動態模塊路徑
/usr/lib64/httpd/modules

image


Httpd 2.4常見配置

備註:在這我用兩臺主機進行實驗,分別是:192.168.43.5七、192.168.43.67,57當http服務器,67當客戶端,首先yum安裝HTTP服務器


一、版本號修改

備註:要是別人查詢到你的網站事用http那個版本,是否是很差,容易利用版本漏洞進行攻擊,因此讓他不顯示版本號

一、首先得有個主頁,在這我就隨便建立個index.httml

echo /var/www/html/index.html > /var/www/html/index.html

二、咱們先來看一下沒有進行版本設置時候得狀況,在67主機上

curl -I 192.168.43.57

image

版本信息一目瞭然

三、在服務器端(57)隱藏版本信息設置

cd /etc/httpd/conf.d/
vim texe.conf

備註:寫在主配置文件裏也可,推薦寫在以上目錄下,方便來管理,主配置文件中標記了/conf.d/目錄,寫在/conf.d/目錄下得配置優先生效

ServerTokens Prod
# 寫入
systemctl restart httpd
systemctl reload httpd
#重啓服務最好用reload

四、再次測試驗證

image

OK

二、修改監聽的IP和Port

1) 省略IP表示爲本機全部IP

2) Listen指令至少一個,可重複出現屢次

示例:

Listen 192.168.1.100:8080

Lsten 80

三、持久鏈接

Persistent Connection:鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其它的請求完成,默認關閉持久鏈接
斷開條件:數量限制:100

       時間限制:以秒爲單位, httpd-2.4 支持毫秒級

反作用:對併發訪問量較大的服務器,持久鏈接功能會使用有些請求得不到響應

折衷:使用較短的持久鏈接時間

設置:

KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100

測試:

telnet 192.168.43.57 80

image

四、切換使用的MPM-開啓100個線程

一、編輯

vim /etc/httpd/conf.modules.d/00-mpm.conf

image

二、重讀配置文件或重啓服務

systemctl reload httpd
systemctl restart httpd

三、查看確認

httpd –M |grep mpm
重啓服務生效
pstree -p|grep httpd 查看進程和線程

備註:

1)設置進程爲100個,在咱們

image

StartServers   100

2)重啓服務並查看

systemctl reload httpd
ps aux


五、定義HTTP主目錄

一、默認得主目錄在

/var/www/html/

二、更改主目錄

1)首先建立目錄

mkdir /data/website -pv

2)建立index.html首頁

echo /data/website/index.html > /data/website/index.html

3)設置配置文件

vim /etc/httpd/conf.d/texe.conf

image

DocumentRoot "/data/website"
<Directory "/data/website">
Require all granted
</Directory>

4)重啓服務

5)測試

image

注意:SELinux和iptables的狀態


六、定義站點主頁面

默認是找index.html文件最爲主頁得,也可更改把如下代碼加入texe.conf配置文件就可

DirectoryIndex index.php 
# 值能夠是多個。找步到第一個找第二個


七、基於IP的訪問控制:

一、conf結尾的文件只能特定IP才能訪問(如只容許192.168.43.67)

<FilesMatch ".+\.(conf|ini)$">
<RequireAny>                                                                                                                  
Require all denied ##拒絕全部
require ip 192.168.43.67 ##只容許
</RequireAny>
</FilesMatch>

二、重啓服務

備註:

加上這項

options indexes

說明要是這個網站主頁面訪問不了就顯示目錄下全部文件列表


也可限定目錄只對特定用戶訪問

<location /admin> ##URL路徑
<RequireAny>
Require all denied
require ip 192.168.31.6
</RequireAny>
</location>


八、自定義日誌格式

日誌類型:

訪問日誌
錯誤日誌

錯誤日誌:

路徑:ErrorLog logs/error_log(這是相對路徑基於/etc/httpd/)

推薦設置爲:LogLevel warn(級別,從警報級別開始記錄)

LogLevel 可選值:

debug, info, notice, warn,error

crit, alert, emerg

備註:最日後嚴重性越高

訪問日誌

一、定義日誌格式:

LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" testlog

備註:根據環境需求來定義

二、使用日誌格式:

CustomLog "logs/access_log" testlog

參考幫助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

man 3 strftime

九、設定默認字符集

AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030

十、定義路徑別名

意思是說:

當用戶訪問192.168.43.57/data目錄時,出現的數據不在website/data目錄下,實際上是在/website/app/stud目錄下

實現方式:

Alias /data  /app/stud

備註:別忘了受權文件夾

<Directory "/app/stud">
Require all granted
</Directory>

重啓服務


十一、實現身份驗證

說明:只有通過驗證的用戶才能訪問某個目錄

認證方式兩種:

basic:明文
digest:消息摘要認證,兼容性差

安全域:

須要用戶認證後方能訪問的路徑;應該經過名稱對其進行標識,以便於告知用戶認證的緣由

用戶的帳號和密碼

虛擬帳號:僅用於訪問某服務時用到的認證標識

存儲:文本文件,SQL數據庫,ldap目錄存儲,nis等

備註:用虛擬用戶來訪問特定的目錄,虛擬帳號能夠放到文件裏或數據庫裏

方法一

說明:咱們針對admin目錄來訪問

一、修改配置文件:

vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin>
AuthType Basic ##驗證方式
AuthName "Secure login" ##加的一段話,只要通過驗證的用戶才能訪問
AuthUserFile "/etc/httpd/conf.d/.htpasswd" ##存放位置加‘.’是隱藏改目錄,要是目錄不存在,就建立出來
Require user bob  ##但願所訪問的用戶                                                                                                 
</Directory>

二、建立用戶

htpasswd -c /etc/httpd/conf.d/.htpasswd alice
htpasswd   /etc/httpd/conf.d/.htpasswd bob
htpasswd   /etc/httpd/conf.d/.htpasswd jack

備註:第一次建立用戶必須加「-c」以後就不須要加了

三、重啓服務

方法二

一、在要設置權限的目錄下建立一個文件存放驗證信息

vim /data/website/admin/.htaccess
AuthType Basic
AuthName "Secure login"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
Require user bob 

二、編輯配置文件

vim /etc/httpd/conf.d/test.conf
<Directory /data/website/admin>
AllowOverride authconfig #容許覆蓋                                                                                                  
</Directory>

三、重啓服務

基於組驗證

示例:
<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 g1
</Directory>

建立用戶

和上面建立方法同樣

給用戶分組

image

備註:

在/etc/httpd/conf.d目錄下建立

ctrl+D結束

備註:

遠程客戶端和用戶驗證的控制

Satisfy ALL|Any

ALL 客戶機IP和用戶驗證都須要經過才能夠

Any客戶機IP和用戶驗證,有一個知足便可


十二、ServerSignature On | Off | EMail

說明:

當客戶請求的網頁並不存在時,服務器將產生錯誤文檔,缺省狀況下因爲打開了 ServerSignature選項,錯誤文檔的最後一行將包含服務器的名字、Apache的版本等信息

若是不對外顯示這些信息,就能夠將這個參數設置爲Off

設置爲Email,將顯示ServerAdmin 的Email提示


1三、status頁面

說明:

用來判斷服務器的狀態

依賴於這個模塊

httpd -M |grep status_module

一、編輯配置文件

<Location /status>
SetHandler server-status
Order allow,deny
Allow from 172.18
</Location>

二、重啓服務

三、測試

192.168.43.57/status

1四、虛擬主機

說明:在一臺物理機上實現多個網站

有三種實現方式:

基於ip:爲每一個虛擬主機準備至少一個ip地址

基於port:爲每一個虛擬主機使用至少一個獨立的port

基於FQDN:爲每一個虛擬主機使用至少一個FQDN

備註:假若有三臺虛擬主機分別是「www.a.com、www.b.comwww.c.com」 分別在web一、web二、web3文件夾中

準備

1)首先建立三個文件夾

mkdir /data/web{1,2,3}

2)建立三個主頁

echo /data/web1 > /data/web1/index.html
echo /data/web2 > /data/web2/index.html
echo /data/web3 > /data/web3/index.html

基於端口實現

分別對應800一、800二、8003

一、編輯配置文件

vim /etc/httpd/conf.d/texe.conf


listen 8001  #端口
listen 8002  #
listen 8003  #
<virtualhost *:8001> #定義
documentroot /data/web1 #主站點
servername www.a.com 
<directory /data/web1> #定義受權
require all granted # 都受權
</directory>
</virtualhost>

<virtualhost *:8002>
documentroot /data/web2
servername www.b.com
<directory /data/web2>
require all granted
</directory>
</virtualhost>

<virtualhost *:8003>                                                                                                          
documentroot /data/web3
servername www.c.com
<directory /data/web3>
require all granted
</directory>
</virtualhost>

二、重啓服務

三、測試

image

基於IP地址實現

一、在物理機上增長三個IP地址

ip a a 192.168.43.101/24 dev ens33
ip a a 192.168.43.102/24 dev ens33
ip a a 192.168.43.103/24 dev ens33

二、修改配置文件

vim /etc/httpd/conf.d/texe.conf


<virtualhost 192.168.31.101:80>
documentroot /data/web1
servername www.a.com
<directory /data/web1>
require all granted
</directory>
</virtualhost>

<virtualhost 192.168.31.102:80>
documentroot /data/web2
servername www.b.com
<directory /data/web2>
require all granted
</directory>
</virtualhost>

<virtualhost 192.168.31.103:80>
documentroot /data/web3
servername www.c.com
<directory /data/web3>
require all granted
</directory>
</virtualhost>

三、重啓服務並測試

image

基於FQDN(主機頭)實現

說明:想要主機名訪問必須使用DNS解析或hosts文件解析

在這咱們寫到hosts文件中

vim /etc/hosts

image

一、編輯配置文件

vim /etc/httpd/conf.d/texe.conf


<virtualhost *:80>
documentroot /data/web2
servername www.b.com
<directory /data/web2>
require all granted
</directory>
ErrorLog "logs/b_error_log" #錯誤日誌分開
CustomLog "logs/b_access_log" combined #訪問日誌分開
</virtualhost>

<virtualhost *:80>
documentroot /data/web3
servername www.c.com
<directory /data/web3>
require all granted
</directory>
ErrorLog "logs/c_error_log"
CustomLog "logs/c_access_log" combined
</virtualhost>

<virtualhost *:80>
documentroot /data/web1
servername www.a.com 
ServerAlias  a.com *.a.com #別名也就是泛域名
<directory /data/web1>
require all granted
</directory>
ErrorLog "logs/a_error_log"
CustomLog "logs/a_access_log" combined
</virtualhost>

二、重啓服務並測試

image

備註:若是用IP地址訪問,那麼配置文件中誰靠前誰就是默認地址


1五、實現https加密訪問

說明:要是你的網站涉及到「¥」那麼就必須加https加密訪問

生產中是向CA機構花錢申請的,在這裏咱們本身搭建一個CA服務器,咱們用67當CA服務器

一、CA服務器端(67)安裝yum包

yum install mod_ssl

二、httpd服務器申請證書

cd /etc/pki/CA

1)生成私鑰

(umask 077;openssl genrsa -out private/cakey.pem 2048)

2)自簽名

openssl req -new -x509 -key private/cakey.pem -out cacert.pem

3)CA主機建立目錄

touch index.txt
echo 01 > serial
#存放序列號

4)在57HTTP服務器主機建立目錄來存放證書與私鑰並生產本身的私鑰

cd /etc/httpd/conf.d/
# 在這個目錄下建立存放目錄
mkdir ssl
[root@centos7_05 ssl]# (umask 077;openssl genrsa -out heepd.key 2048)

5)57HTTP主機生成請求

openssl req -new -key heepd.key -out httpd.csr

image

6)CA服務器給HTTP頒發證書

備註:把57主機生成的申請文件scp傳送給CA主機

scp httpd.csr 192.168.43.67:/etc/pki/CA/

CA給HTTP簽名

openssl ca -in httpd.csr -out certs/httpd.csr
#頒發證書

7)把HTTP的證書和CA的證書傳送到(57)HTTP服務器

scp certs/httpd.csr cacert.pem 192.168.43.57:/etc/httpd/conf.d/ssl/

8)修改ssl.cof配置文件

[root@centos7_05 conf.d]# vim ssl.conf

image

9)重啓服務測試

image

image

image

1六、http跳轉到https

說明:當咱們輸入 「www.a.com」 自動跳轉到」https://www.a.com

一、修改配置文件

[root@centos7_05 conf.d]# vim texe.conf


RewriteEngine on  #啓動這個引擎
rewritecond %{SERVER_PORT} !^443 #條件跳轉--若是不是443的時候我就進行跳轉
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #這是跳轉規則

二、重啓測試

image

1七、使用mod_deflate模塊壓縮頁面優化傳輸速度

適用場景:

(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持

(2) 壓縮適於壓縮的資源,例如文本文件

一、編輯配置文件

vim /etc/httpd/conf.d/texe2.conf


AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
DeflateCompressionLevel 9
SetOutputFilter DEFLATE

二、重啓測試


http協議經常使用的狀態碼

200: 成功,請求數據經過響應報文的entity-body部分發送;OK

301: 請求的URL指向的資源已經被刪除;但在響應報文中經過首部Location指明瞭資源如今所處的新位置;Moved Permanently

302: 響應報文Location指明資源臨時新位置 Moved Temporarily

304: 客戶端發出了條件式請求,但服務器上的資源不曾發生改變,則經過響應此響應狀態碼通知客戶端;Not Modified

401: 須要輸入帳號和密碼認證方能訪問資源;Unauthorized

403: 請求被禁止;Forbidden

404: 服務器沒法找到客戶端請求的資源;Not Found

500: 服務器內部錯誤;Internal Server Error

502: 代理服務器從後端服務器收到了一條僞響應,如沒法鏈接到網關;Bad Gateway

503 – 服務不可用,臨時服務器維護或過載,服務器沒法處理請求

504 – 網關超時


結語:後續更精彩

相關文章
相關標籤/搜索