HTTP-常用配置

来源:https://www.cnblogs.com/xsuid/archive/2018/08/10/9456028.html
-Advertisement-
Play Games

前言這篇主要介紹HTTP服務程式環境可能有一些介紹不到,博主能力有限,歡迎大神來糾正改進HTTP協議從http/0.9到如今的http/2.0中間發生了很大的改變,現在主流的事http/1.1在很多面試當主就會問起http協議各個版本的不同之處,這裡就不介紹它們之間的區別了,有想要瞭解的可以百度下,... ...



前言

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

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

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

image

在很多面試當主就會問起http協議各個版本的不同之處,這裡就不介紹它們之間的區別了,有想要瞭解的可以百度下,面試的時候看下

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

在上篇中基本簡單說了下https://www.cnblogs.com/xsuid/p/9451811.html

http伺服器程式:
       httpd apache
       nginx
       lighttpd

Httpd介紹

httpd:

20世紀90年代初,國家超級電腦應用中心NCSA開發

特性:

高度模塊化:core + modules

DSO: Dynamic Shared Object 動態加/卸載

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

MPM工作模式

prefork:

1、多進程I/O模型,每個進程響應一個請求,預設模型

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

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

如圖:

image

worker:

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

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

如圖:

image

event:

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

2、一個主進程:生成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.57、192.168.43.67,57當http伺服器,67當客戶端,首先yum安裝HTTP伺服器


1、版本號修改

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

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

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

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

curl -I 192.168.43.57

image

版本信息一目瞭然

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

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

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

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

4、再次測試驗證

image

OK

2、修改監聽的IP和Port

1) 省略IP表示為本機所有IP

2) Listen指令至少一個,可重覆出現多次

示例:

Listen 192.168.1.100:8080

Lsten 80

3、持久連接

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

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

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

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

設置:

KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100

測試:

telnet 192.168.43.57 80

image

4、切換使用的MPM-開啟100個線程

1、編輯

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

image

2、重讀配置文件或重啟服務

systemctl reload httpd
systemctl restart httpd

3、查看確認

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

備註:

1)設置進程為100個,在我們

image

StartServers   100

2)重啟服務並查看

systemctl reload httpd
ps aux


5、定義HTTP主目錄

1、預設得主目錄在

/var/www/html/

2、更改主目錄

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的狀態


6、定義站點主頁面

預設是找index.html文件最為主頁得,也可更改把以下代碼加入texe.conf配置文件就可

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


7、基於IP的訪問控制:

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

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

2、重啟服務

備註:

加上這項

options indexes

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


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

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


8、自定義日誌格式

日誌類型:

訪問日誌
錯誤日誌

錯誤日誌:

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

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

LogLevel 可選值:

debug, info, notice, warn,error

crit, alert, emerg

備註:最往後嚴重性越高

訪問日誌

1、定義日誌格式:

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

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

2、使用日誌格式:

CustomLog "logs/access_log" testlog

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

man 3 strftime

9、設定預設字元集

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

10、定義路徑別名

意思是說:

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

實現方式:

Alias /data  /app/stud

備註:別忘了授權文件夾

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

重啟服務


11、實現身份驗證

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

認證方式兩種:

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

安全域:

需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因

用戶的賬號和密碼

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

存儲:文本文件,SQL資料庫,ldap目錄存儲,nis等

備註:用虛擬用戶來訪問特定的目錄,虛擬賬號可以放到文件里或資料庫里

方法一

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

1、修改配置文件:

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>

2、創建用戶

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

備註:第一次創建用戶必須加“-c”之後就不需要加了

3、重啟服務

方法二

1、在要設置許可權的目錄下創建一個文件存放驗證信息

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

2、編輯配置文件

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

3、重啟服務

基於組驗證

示例:
<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和用戶驗證,有一個滿足即可


12、ServerSignature On | Off | EMail

說明:

當客戶請求的網頁並不存在時,伺服器將產生錯誤文檔,預設情況下由於打開了 ServerSignature選項,錯誤文檔的最後一行將包含伺服器的名字、Apache的版本等信息

如果不對外顯示這些信息,就可以將這個參數設置為Off

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


13、status頁面

說明:

用來判斷伺服器的狀態

依賴於這個模塊

httpd -M |grep status_module

1、編輯配置文件

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

2、重啟服務

3、測試

192.168.43.57/status

14、虛擬主機

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

有三種實現方式:

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

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

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

備註:假如有三台虛擬主機分別是“www.a.com、www.b.comwww.c.com” 分別在web1、web2、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

基於埠實現

分別對應8001、8002、8003

1、編輯配置文件

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>

2、重啟服務

3、測試

image

基於IP地址實現

1、在物理機上增加三個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

2、修改配置文件

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>

3、重啟服務並測試

image

基於FQDN(主機頭)實現

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

在這我們寫到hosts文件中

vim /etc/hosts

image

1、編輯配置文件

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>

2、重啟服務並測試

image

備註:如果用IP地址訪問,那麼配置文件中誰靠前誰就是預設地址


15、實現https加密訪問

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

生產中是向CA機構花錢申請的,在這裡我們自己搭建一個CA伺服器,我們用67當CA伺服器

1、CA伺服器端(67)安裝yum包

yum install mod_ssl

2、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

16、http跳轉到https

說明:當我們輸入 “www.a.com” 自動跳轉到”https://www.a.com

1、修改配置文件

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


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

2、重啟測試

image

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

適用場景:

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

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

1、編輯配置文件

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


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

2、重啟測試


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 – 網關超時


結語:後續更精彩


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 Bitmap bit= new Bitmap(@"" + Path);//給圖片加邊框 2 //Bitmap bit = new Bitmap(Screen.AllScreens[0].Bounds.Size.Width, Screen.AllScreens[0].Bounds.Size.Hei... ...
  • 最近寫了個定時郵件推送的服務,當利用lognet4記錄日誌時,發現日誌並沒有記錄。後來明白windows 服務一般預設是在C:\Windows\System 或是C:\Windows\System32,而我們自己的服務程式一般是放在其他的目錄,這樣log4net.config文件中的配置路徑將無法正 ...
  • 本文主要介紹在Asp.net Core採用CORS方式解決跨域 關於跨域的原理介紹可參考 "Asp.net Web API 解決跨域詳解" 1 在Startup添加允許跨域的策略 2怎樣應用AnyOrigin策略 只需要在控制器頭上(或某個行為上)添加標識: 如: 3 AnyOrigin略幾乎直接完 ...
  • 方法一: public static string Reverse(string name) { if (String.IsNullOrEmpty(name)) { throw new Exception("字元串不能為空!"); } StringBuilder sb = new StringBui ...
  • 接著上一篇:上一篇寫了安裝,這篇直接搞定批量列印,A4紙橫版豎版頁面設計,正式開始。(我的表達不怎麼好,我儘量發圖片都是程式員一點就通) 一、界面展示 忽略界面設計醜 查看預覽界面,因為有數據就不截全屏了,盒號是我自己加的,我們自己的業務邏輯。 三、核心代碼,批量列印(參考代碼鏈接,放到文章結尾處) ...
  • 需要引用 SixLabors.ImageSharp 和SixLabors.ImageSharp.Drawing 引用方法 NuGet包管理 添加程式包來源 https://www.myget.org/F/imagesharp 包括預覽發行版 目前使用的是 1.0.0-beta0005 版本 3個引用 ...
  • 為了學習 加群。大家一起探討 C# 學習及解答 731738614為了學習 加群。大家一起探討 C# 學習及解答 731738614為了學習 加群。大家一起探討 C# 學習及解答 731738614為了學習 加群。大家一起探討 C# 學習及解答 731738614 ...
  • 1.atlas 簡介 Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司內部得到了廣泛應用。 Atlas官 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...