一、程序文件組成
CentOS 7程序環境:yum安裝httpd-2.4
官方幫助文檔:http://httpd.apache.org/docs/2.4/
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
檢查配置文件語法:
httpd –t
服務單元文件: /usr/lib/systemd/system/httpd.service
配置文件:/etc/sysconfig/httpd
服務控制和啓動:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status|reload} httpd.service
站點網頁文檔根目錄:
/var/www/html
模塊文件路徑:
/etc/httpd/modules #下面文件的軟連接
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd
主進程文件:
/etc/httpd/run/httpd.pid
日誌文件目錄:
/var/log/httpd
access_log: 訪問日誌
error_log:錯誤日誌
幫助文檔包:
httpd-manual
二、配置講解
1、顯示服務器版本信息
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full #各種類型
http://httpd.apache.org/docs/2.4/mod/core.html#servertokens 各種類型的格式
vi /etc/httpd/conf.d/test.conf
ServerTokens Prod # 建議使用
2、修改監聽的IP和port
Listen [IP:]PORT
(1) 省略IP表示爲本機所有IP
(2) Listen指令至少一個,可重複出現多次
Listen 80
Listen 8080
3、持久連接
Persistent Connection:連接建立,每個資源獲取完成後不會斷開連
接,而是繼續等待其它的請求完成,默認關閉持久連接
斷開條件:時間限制:以秒爲單位, 默認5s,httpd-2.4 支持毫秒級
副作用:對併發訪問量大的服務器,持久連接會使有些請求得不到響應
折中:使用較短的持久連接時間
設置:KeepAlive On|Off
KeepAliveTimeout 15
模擬測試:telnet 192.168.12.27 80
GET /URL HTTP/1.1
Host: 192.168.12.27
4、
DSO: Dynamic Shared Object
加載動態模塊配置,不需重啓即生效
/etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
httpd -M #查看所有模塊,如果需要註釋對應模塊即可
httpd -l #查看靜態模塊,核心模塊
添加模塊示例:LoadModule auth_basic_module modules/mod_auth_basic.so
5、MPM( Multi-Processing Module)多路處理模塊
prefork, worker, event
切換使用的MPM(centos6中不能)
/etc/httpd/conf.modules.d/00-mpm.conf
啓用要啓用的MPM相關的LoadModule指令即可
prefork的配置: (默認使用)一個進程下面有若干子進程,由子進程提供服務,默認4個子進程,現有進程不夠用會自動開啓
vi /etc/httpd/conf.d/test.conf
StartServers 8 #初始子進程建議調大
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 最多進程數,最大值 20000 preforw模式下最大200000
MaxClients 256 最大的併發連接數,2.4官方文檔沒有說明,2.2中有,不加的話子進程數不會改變
MaxRequestsPerChild 4000 子進程最多能處理的請求數量。在處理MaxRequestsPerChild 個
請求之後,子進程將會被父進程終止,這時候子進程佔用的內存就會釋放(爲0時永遠不釋放)
worker的配置: 一個進程下面若干子進程,由子進程下面的線程提供服務,
ServerLimit 16
StartServers 2
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
event MPM單線程響應多請求,佔據更少的內存,高併發下表現更優秀,會有一個專門的線
程來管理keep-alive類型的線程
6、定義'Main' server的文檔頁面路徑
DocumentRoot “/path”
文檔路徑映射:
DocumentRoot指向的路徑爲URL路徑的起始位置
示例:
DocumentRoot "/data/html“ 2.4版本只改這一行不行,需要授權,2.2可以直接修改
<Directory "/data/html">
Require all granted
</Directory>
文件是軟連接,在其他目錄也可以訪問
7、定義站點主頁面
DirectoryIndex index.html index.php
8、站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制
訪問控制機制有兩種:客戶端來源地址,用戶賬號
文件系統路徑:
<Directory “/path"> 限制文件夾
...
</Directory>
<File “/path/file”> 限制文件
...
</File>
<FileMatch "PATTERN"> 支持通配符
...
</FileMatch>
<location /status> #示例
<requireany>
require all denied
require ip 192.168.12.1 192.168.12.27
</requireany>
SetHandler server-status
</Location>
9、<Directory>中“基於源地址”實現訪問控制 可以加在上一步的<directory>中
(1) Options:後跟1個或多個以空白字符分隔的選項列表
在選項前的+,- 表示增加或刪除指定選項
常見選項:
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
None:全部禁用
All: 全部允許
(2) AllowOverride
與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName指定)文件中,覆蓋之前的配置指令
只對<directory>語句有效,可以將上面options的配置放在網站目錄下的.htaccess文件中
AllowOverride All: .htaccess中所有指令都有效
AllowOverride None: .htaccess 文件無效
AllowOverride AuthConfig .htaccess 文件中,除了AuthConfig 其它指令都無法生效
(3) 基於IP的訪問控制:
無明確授權的目錄,默認拒絕
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all denied
控制特定的IP訪問:
Require ip IPADDR:授權指定來源的IP訪問
Require not ip IPADDR:拒絕特定的IP訪問
控制特定的主機訪問:
Require host HOSTNAME:授權特定主機訪問
Require not host HOSTNAME:拒絕
不能有失敗,至少有一個成功匹配才成功,即失敗優先
<RequireAll>
Require all granted
Require not ip 172.16.1.1 拒絕特定IP
</RequireAll>
多個語句有一個成功,則成功,即成功優先
<RequireAny>
Require all denied
require ip 172.16.1.1 允許特定IP
</RequireAny>
10、日誌設定
日誌類型:訪問日誌、錯誤日誌
錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
LogLevel 可選值: debug, info, notice, warn,error, crit, alert, emerg
訪問日誌:
定義日誌格式:LogFormat format strings
LogFormat "%h %l %u %{%F %T}t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" testlog
使用日誌格式:
CustomLog logs/access_log testlog
http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats 官方幫助文檔
11、設定默認字符集
AddDefaultCharset UTF-8 此爲默認值
中文字符集:GBK, GB2312, GB18030
基於模塊mod_userdir.so實現
相關設置:
12、實現家目錄共享
vim /etc/httpd/conf.d/userdir.conf 修改該文件即可
<IfModule mod_userdir.c>
#UserDir disabled
UserDir public_html #指定共享目錄的名稱
</IfModule>
準備目錄
su – sun;mkdir ~/public_html
echo homesun > ~/sun/public_html/index.html
setfacl –m u:apache:x ~sun
訪問
13、status頁面
LoadModule status_module modules/mod_status.so
<Location "/status">
SetHandler server-status
</Location>
ExtendedStatus On 顯示擴展信息