1.3http的配置詳解-1-編譯安裝,持久鏈接,MPM,DSO,修改根等

http的基本配置詳解

apr這個軟件是apache依賴的,要編譯安裝http,必需要保證apr版本和http版本配合php

由於centos8上的http版本很新2.4,就在centos7上編譯安裝,不能用yum的apr版本,由於過久,不支持httpd2.4.41的安裝html

yum info httpd
Name        : httpd
Arch        : x86_64
Version     : 2.4.6
yum info apr
Name        : apr
Arch        : x86_64
Version     : 1.4.8
版本有點偏舊
複製代碼

1.httpd的編譯安裝

1.1 編譯安裝httpd-2.4方法一:源碼分開編譯

進入官網apr.apache.orglinux

下載apr和apr-util,bz2壓縮比更高nginx

準備apache

  • 安裝相關包:yum -y install gcc make pcre-devel openssl-devel expat-devel
  • 下載源代碼並解壓縮:httpd-2.4.41.tar.bz2,apr-1.7.0.tar.bz2,apr-util-1.6.1.tar.bz

wget mirrors.tuna.tsinghua.edu.cn/apache//apr…vim

wget mirrors.tuna.tsinghua.edu.cn/apache//apr…centos

wget mirrors.tuna.tsinghua.edu.cn/apache//htt…瀏覽器

解包:tar jxvf安全

1.編譯安裝APR-基本的可移植庫bash

cd apr-1.7.0
./configure --prefix=/app/apr
make && make install
複製代碼

2.編譯安裝APR-util-在APR之上提供了許多有用的抽象

cd ../apr-util-1.6.1
./configure --prefix=/app/apr-util --with-apr=/app/apr/  
# 依賴以前的apr編譯
make -j 2 && make install
複製代碼

3.編譯安裝httpd-2.4

cd ../httpd-2.4.41
./configure --prefix=/app/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/app/apr/ \
--with-apr-util=/app/apr-util/ \
# 主要要單獨指定apr和apr-util
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork 
# 多路處理模塊MPM={prefork|worker|event}
make -j 4 && make install
複製代碼

1.2 編譯安裝httpd-2.4方法二:源碼合併編譯

準備

  • selinux關閉,防火牆關閉,時間同步
  • 安裝相關包:yum -y install gcc make pcre-devel openssl-devel expat-devel
  • 下載源代碼並解壓縮:httpd-2.4.41.tar.bz2,apr-1.7.0.tar.bz2,apr-util-1.6.1.tar.bz

wget mirrors.tuna.tsinghua.edu.cn/apache//apr…

wget mirrors.tuna.tsinghua.edu.cn/apache//apr…

wget mirrors.tuna.tsinghua.edu.cn/apache//htt…

解包:tar jxvf

1.將apr和apr-util源碼與httpd源碼合併

mv apr-1.7.0 httpd-2.4.41/srclib/apr
mv apr-util-1.6.1 httpd-2.4.41/srclib/apr-util
ls httpd-2.4.41/srclib/
apr apr-util  Makefile.in 
複製代碼

2.將三者一併編譯並安裝

cd httpd-2.4.41/
./configure \
--prefix=/app/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-included-apr \
--enable-moudules=most \
--enable-mpms-shared=all \
--with-mpm=prefork 
make -j 4 && make install
複製代碼

目錄分析

bin 二進制程序所在目錄-主程序和客戶端工具都在這
	httpd 二進制執行程序
	apachectl 控制檯腳本-不加任何參數也是啓動
	# 必需要解決路徑調用才能夠
		/app/httpd24/apachectl -h
		若是直接調用apachectl -h沒有寫到path路徑下
		若是bin下bash/. apachectl -h會退出客戶端
	# 用ls |xargs file便可

cgi-bin
error
icons
lib
man
modules
build
conf:存放配置文件
htdocs:主頁面存放位置
	index.html
include
logs
manual
複製代碼

2.編譯安裝後配置

http編譯過程:/app/httpd24/build/config.nice

自帶的服務控制腳本:/app/httpd24/bin/apchectl

2.1建立專門用戶

useradd -s /sbin/nologin -r apache
# 自動建立用戶和組
複製代碼

2.2指定運行httpd用戶

vim /app/httpd24/conf/httpd
User apache
Group apache
# 用來起worker進程
# 若是以前有yum安裝過httpd,apache帳號會自動建立
複製代碼

2.3配置環境變量

vim /etc/profile.d/httpd24.sh
PATH=/app/httpd24/bin:$PATH

. /etc/profile.d/httpd24.sh 讓腳本生效
# 解決調用可執行腳本的全路徑調用的問題
複製代碼

2.4配置幫助-一般不配

vim /etc/man_db.conf
MANDATORY_MANPATH   /app/http24/man
複製代碼

2.5設置開機啓動-不建議-已經淘汰

vim /etc/rc.d/rc.local
/app/httpd24/bin/apachectl start
chmod +x /etc/rc.d/rc.local

# 開機啓動還有service文件和腳本
複製代碼

2.6.1建立service unit 文件(centos7以上版本)-能夠實現systemctl的集中管理-建議

vim /usr/lib/systemd/system/httpd24.service

[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=forking
#Environment=/etc/sysconfig/httpd
ExecStart=/app/httpd24/bin/httpd $OPTIONS -k start
ExecReload=/app/httpd24/bin/httpd $OPTIONs -k graceful
ExecStop=/bin/kill -WINCH {MAINPID}
# 用httpd的stop也能夠
killsignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target


# 上述的都不用徹底本身寫的,手工在yum安裝的httpd裏有service文件,能夠拿來參考修改
# 修改服務文件後要systemctl daemon-reload
複製代碼

2.6.2建立啓動腳本(centos6之前版本-將來會被淘汰)

# 自定義啓動腳本(參考httpd-2.2的服務腳本)
cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24
vim /etc/rc.d/init.d/httpd24
apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
pidfile=¥{PIDFILE-/app/htttpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

chkconfig -add httpd24
chkconfig -add httpd24
複製代碼

3.httpd常見配置-主配置文件裏

修改配置文件的時候記得過濾註釋和空行

grep -Ev '^ *#|^$' /app/http24/conf/httpd.conf

配置文件能夠寫到主配置裏,也能夠用Include包含一個文件進去xxx.conf,應用服務器儘可能不要改主配置文件

優點:之後想恢復的話,刪掉這個配置文件便可
因此專門建一個文件夾conf.d
可是Include用的是相對的路徑
由於ServerRoot 「/app/httpd24」 它認爲整個服務的文件都是在這個目錄下的
在主配置文件最下面添加 include conf.d/*.conf 指令大小寫不敏感
以後就能夠把本身寫的配置放進去
vim /app/httpd24/conf.d/test.conf
複製代碼

3.1指定服務器名

http -t
vim /etc/httpd/conf/httpd.conf
# ServerName www.example.com:80
severname www.wyjn.com

http -t
複製代碼

3.2顯示服務器版本信息

serverTokens Major|Minor|Min[imal]|prod
# 默認值full
# 爲安全考慮用prod
複製代碼

默認狀況下,用戶經過瀏覽器訪問會暴露你的軟件版本,這樣是很不安全的,瞭解版本後可能會針對版本漏洞攻擊

範例:

curl -I 域名/IP 抓頭
# curl是個文本瀏覽器,至關於把網站源碼抓下來了
[root@localhost ~]# curl -I http://10.0.0.52
HTTP/1.1 200 OK
Date: Tue, 24 Mar 2020 02:42:18 GMT
Server: Apache/2.4.41 (Unix)
Last-Modified: Tue, 24 Mar 2020 01:08:33 GMT
ETag: "2f-5a18f6401598a"
Accept-Ranges: bytes
Content-Length: 47
Content-Type: text/html

[root@localhost ~]# curl -I www.taobao.com
HTTP/1.1 301 Moved Permanently
Server: Tengine(淘寶作的nginx二次研發版)
Date: Tue, 24 Mar 2020 02:53:38 GMT
Content-Type: text/html
Content-Length: 278
Connection: keep-alive
Location: https://www.taobao.com/
Via: cache5.cn2587[,0]
Timing-Allow-Origin: *
EagleId: 6fa4108715850184186018305e

[root@localhost ~]# curl -I www.jd.com
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Tue, 24 Mar 2020 02:54:55 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: https://www.jd.com/
Access-Control-Allow-Origin: *
Timing-Allow-Origin: *
X-Trace: 302-1585018495196-0-0-0-0-0
Strict-Transport-Security: max-age=360

# 具體的也看組織,有的組織對安全性要求不高
# 北京市政府的連版本號都給去掉了,更安全
[root@localhost ~]# curl -I www.beijing.gov.cn
HTTP/1.1 200 OK
Date: Tue, 24 Mar 2020 02:56:02 GMT
Content-Type: text/html; charset=gb2312
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
Expires: Tue, 24 Mar 2020 02:52:29 GMT
Cache-Control: max-age=60
X-Via-JSL: 099bae7,-
Set-Cookie: __jsluid_h=c2e94f4436f03d9085ff6e3a93c9c1bb; max-age=31536000; path=/; HttpOnly
X-Cache: bypass

[root@localhost ~]# curl -I www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Tue, 24 Mar 2020 02:56:55 GMT
Etag: "575e1f5c-115"
Last-Modified: Mon, 13 Jun 2016 02:50:04 GMT
Pragma: no-cache
Server: bfe/1.0.8.18  百度本身改的名字,等學nginx的時候想改爲啥均可以改
# 只要手上有源碼,想怎麼改均可以
# 運維不用改源碼改配置就能夠了

ServerTokens Prod[uctOnly]:Server:Apache
ServerToken Major:Server:Apache/2 版本號
ServerToken Minor:Server:Apache/2.0 小版本號
ServerToken Min[imal]:Server:Apache/2.0.41 子版本號
ServerToken OS:Server:Apache/2.0.41(unix) 系統
ServerToken Full(or not specified):Server:Apache/2.0.41(unix) PHP/4.2.2 MyMod/1.2 顯示更全
# 主配置文件沒有這個值,查看官方版本說明,查看默認值
複製代碼

建議使用:ServerTokens Prod

vim /app/httpd24/conf.d/test.conf
ServerTokens Prod

[root@localhost conf.d]# systemctl daemon-reload
[root@localhost conf.d]# curl -I http://10.0.0.52
HTTP/1.1 200 OK
Date: Tue, 24 Mar 2020 03:13:03 GMT
Server: Apache
Last-Modified: Tue, 24 Mar 2020 02:43:54 GMT
ETag: "94d-5a190b8fe1ba0"
Accept-Ranges: bytes
Content-Length: 2381
Content-Type: text/html
複製代碼

3.3監聽的IP和Port

Listen [IP:]PORT
複製代碼

說明:默認80

​ 1.省略IP表示爲本機全部IP

​ 2.Listen指令至少一個,可重複屢次

# 增長端口,訪問特定ip端口
vim /app/httpd24/conf.d/test.conf
Listen 10.0.0.7:8081
# 這個端口只支持10.0.0.52的8081端口訪問
優點:能夠監聽在多個端口,未來能夠一個IP對應一個網站,實現了前面所謂的虛擬
主機,不一樣的IP端口號,一個物理服務器端能夠託管上百個網站
# 可是有個缺點,訪問要寫端口號,瀏覽器默認訪問http協議的80端口
複製代碼

3.4 持久鏈接

協議約定持久鏈接,服務器決定接收模式

Persistent Connection:鏈接創建,每一個資源獲取完成後不斷開鏈接,而是繼續等待其餘請求完成,默認關閉持久鏈接(一個TCP鏈接中能夠屢次進行http請求而且不斷開,除非知足兩個條件)

斷開條件:時間限制:以秒爲單位,默認5s,httpd-2.4支持毫秒級// 事件限制:傳輸請求的次數

# 具體使用根據業務
好比電商網站,同一個連接瀏覽,不須要再鏈接了,慢慢離線看就能夠了,用短期鏈接便可

若是是遊戲的,要長鏈接
複製代碼

缺點:對併發訪問量大的服務器,持久鏈接會使有些請求得不到響應

平衡:使用較短的持久鏈接事件

持久鏈接相關指令:

注意:先看主配置的過濾文件有沒有,沒有說明是默認配置,去官網看默認配置是什麼-指令快速索引

注意:修改,不改主配置文件

httpd.apache.org/docs/2.4/zh…

KeepAlive On|off
KeepAliveTimeout 15 # 鏈接持續15s,能夠以ms作單位,默認值5s
MaxKeepAliveRequests 500 # 持久鏈接最大鏈接請求數,默認值100 # 
達到100個請求就斷開
複製代碼
測試是否是持久鏈接,用telnet模擬瀏覽器發請求
telnet IP 端口
telnet 10.0.0.52 80
GET / HTTP/1.1    /表示htdoc下的頁面index.html,也能夠指定/test.html
host: 1.1.1.1 (隨便寫)     回車

# 修改持續鏈接事件長點後,能夠持續請求
GET /test.html HTTP/1.1
host: 2.2.2.2

# telnet WEB_SERVER_IP PORT
# GET /URL HTTP/1.1 這是個請求報頭
# Host: WEB_SERVER_IP
沒有馬上斷開,說明啓用了持久鏈接
若是馬上斷開,就說明沒有啓用持久鏈接
複製代碼

3.5 DSO(Dynamic Shared Object)

Dynamic Shared Object,加載動態模塊配置,無需重啓即生效

動態模塊所在路徑:/usr/lib64/httpd/modules/

編譯安裝的時候動態模塊所在modules(實際上已經編譯了,只是沒有加載)

編譯安裝後,配置文件會指明加載了哪些模塊

[root@localhost httpd24]# grep -Ev "^ *#|^$" conf/httpd.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
複製代碼

主配置/etc/httpd/conf/httpd/conf文件中指定加載模塊配置文件

ServerRoot "/etc/httpd"
Include conf.modules.d/*.conf
複製代碼

配置指定實現模塊加載格式:

LoadModule <mod_name> <mod_path>
複製代碼

模塊文件路徑可使用i相對路徑:相對於ServerRoot(默認/etc/httpd)

範例:查看模塊加載的配置文件

http -M 列出已經加載的模塊列表(satic 
靜態加載的,無論有沒有寫都是默認加載的/share 動態模塊,須要加載,不須要不加載)

在主配值文件中註釋掉不想加載的那個文件便可實現模塊不加載(share)
#LoadModule auth_basic_module modules/mod_auth_basic.so
systemctl restart httpd (注意:若是用apachectl 
啓動的服務,systemctl是管不了的,除非先用apachectl stop)
httpd -M 就沒有basic_moudule
可是平時這個模塊是要用的,用於身份驗證的
或者能夠用systemctl reload httpd
複製代碼

3.6 MPM(multi-processing Module)多路處理模塊

httpd支持三種MPM工做模式:prefork(基於進程),worker(多線程),event(每一個子進程有一個監聽線程)

切換使用MPM:

httpd -M能夠看到加載了prefork模塊
三種模式只能三選一,註釋掉prefork模塊,啓用event模塊
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
[root@localhost httpd24]# systemctl restart httpd24.service
httpd -M  看一下模塊有沒有加載
mpm_event_module (shared)

pstree -p
  ├─httpd───3*[httpd───26*[{httpd}]]

注意:event模型對高併發有用,若是訪問量大的話,能夠用event模塊,可是event模
塊可能和其餘模塊不兼容,由於比較新,prefork模塊最悠久


注意:若是是yum安裝
有一個專門指定加載模塊的路徑
ServerRoot "/etc/httpd"  以這個爲參考點
Include conf.modules.d/*.conf
centos8用的是event模型
複製代碼

3.6.1 prefork模式相關配置:

# 默認開啓5個進程,假如網站上線了,瞬間幾千個,短短期就要開幾千個進程,
系統會崩,那就提早準備
StartServers	2000  啓動時開啓2000個進程
MinSpareServers	2000  最小空閒
# 機器一啓動開了2000個,可是沒人訪問,保留2000個
MaxSpareServers	3000  最大空閒
# 最多容許3000個空閒
# 這時候來了10000我的,開了10000個進程,而後高峯期過了,慢慢關了7000個

ServerLimit		2560 # 最多進程數,最大值20000/和MaxRequestworkers保持一致
# 若是要支持個更多的鏈接,能夠改爲10000,超過10000個進程,後面的就不響應了

MaxRequestworkers	2560 # 最大的併發鏈接數,默認256/和ServerLimit保持一致
MaxConnectionsPerChild	4000 # 子進程最多能處理的請求數量,在處理

MaxConnectionsPerChild個請求以後,子進程將會被父進程終止,這時候子進程佔用
的內存就會被釋放(爲0時永遠不釋放)
# 開了2000個進程後,不會回收,會繼續爲下一個用戶提供服務,進程持續過久會出
問題,因此響應4000個請求之後就會銷燬

MaxRequestsPerChild 
#從http2.3.9開始被MaxConnectionsPerChild代替-這個不用管了
複製代碼

vim /app/httpd24/conf.d/test.conf

StartServers	100  
MinSpareServers	100 
MaxSpareServers	300
ServerLimit		2560 
MaxRequestworkers	2560 
MaxConnectionsPerChild	4000 

這裏意思一下能看到便可
# 注意:這個只適合prefork模式,若是是其餘模式會報錯
# 一旦錯誤,會致使httpd服務關閉,要重啓

[root@localhost httpd24]# ps aux|grep httpd|wc -l
102
1個主進程,100個子進程,1個grep進程

pstree 
  ├─httpd───100*[httpd]

複製代碼

3.6.2 worker和event模式相關配置-不用進程用線程

StartServers	2  提早開2個進程
MinSpareThreads 25
MaxSpareSTheads 75
ServerLimit		16 # 最多進程數,最大值20000
MaxRequestworkers	150 # 最大的併發鏈接數,默認256
ThreadsPerChild	25 
# 子進程最多能處理的請求數量,在處理ThreadsPerChild個請求以後,子進程將會
被父進程終止,這時候子進程佔用的內存就會被釋放(爲0時永遠不釋放)

複製代碼

3.7 定義Main server的文檔頁面路徑-默認主頁面路徑

# 默認yum安裝在/var/www/html下
# 編譯安裝在htdoc下
DocumentRoot "/path"
# 2.4版本有個要求光改這一項會報提示錯誤403fobbiden
# 必定要作好原數據備份,也就是先複製再從新寫值
<directory /path>
	Require all granted 
	# 這個是受權指令,容許任何人訪問
</directory>
複製代碼

說明:

  • DocumentRoot指向的路徑爲URL路徑的起始位置
  • /path必須顯式受權後才能夠訪問

範例:

DocumentRoot "/data/html"
# 訪問網站,全部數據都是以這個目錄爲參考點
<directory /data/html>
	Require all granted 
</directory>
[root@localhost htdocs]# mkdir -p /data/html
[root@localhost htdocs]# mv * /data/html/
systemctl restart http24.service
複製代碼
訪問http://10.0.0.52/test
對應/data/html/test
# 至關於定義了整個網站的根
複製代碼

3.8 定義站點主頁面

DirectoryIndex index.php index.html test.html
# 訪問的時候默認找什麼文件做爲主頁
# 就是找不着index.php 文件找文件,找不到index.html這個文件找test.html也行
# 會順序找,多加幾個均可以的,即便不寫文件路徑也能夠找到
注意:修改文件必定要備份
cp  xxx{,.bak}  xx 
xxx.bak  xx
複製代碼

log

2020-3.25 12:14
複製代碼
相關文章
相關標籤/搜索