一、httpd 2.2.x目錄結構
Cnetos 6.10 YUM安裝httpd 2.2.x
# yum install -y httpd
程序環境 主配置文件: /etc/httpd/conf/httpd.conf #主配置文件 /etc/httpd/conf.d/*.conf #補充配置文件
服務腳本: /etc/rc.d/init.d/httpd 配置文件:/etc/sysconfig/httpd
主程序文件: /usr/sbin/httpd /usr/sbin/httpd.event 對於這種模型切換,2.2版本的切換只能重新編譯 /usr/sbin/httpd.worker
日志文件目錄: /var/log/httpd access_log: 訪問日志 error_log:錯誤日志(啟動、停止、運行)
站點文檔目錄: /var/www/html
模塊文件路徑: /usr/lib64/httpd/modules 配置文件的組成: [root@localhost ~]# grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts 配置格式:directive value directive: 不區分字符大小寫; value: 為路徑時,取決於文件系統;
二、主配置文件httpd.conf常用選項說明

[root@localhost ~]# grep -Ev "^#|^[ ]+#|^$" /etc/httpd/conf/httpd.conf ServerTokens OS ServerRoot "/etc/httpd" #httpd程序目錄 PidFile run/httpd.pid #pid文件路徑 Timeout 60 KeepAlive Off #長連接開啟或關閉On|Off MaxKeepAliveRequests 100 #長連接最大請求數 KeepAliveTimeout 15 #長連接超時時間配置 <IfModule prefork.c> #prefork模式配置 StartServers 8 #服務啟動時的子進程數量 MinSpareServers 5 #最小空閑進程數 MaxSpareServers 20 #最大空閑進程數 ServerLimit 256 #服務器生命周期內為MaxClient所允許的最大進程數,通常相等MaxClients MaxClients 256 #最大並發請求數 MaxRequestsPerChild 4000 #單個進程響應的最大請求數 </IfModule> <IfModule worker.c> #work模式配置 StartServers 4 #服務器啟動時的進程數 MaxClients 300 #最大並發請求數 MinSpareThreads 25 #最小空閑線程數 MaxSpareThreads 75 #最大空閑線程數 ThreadsPerChild 25 #每個進程能啟動的線程數 MaxRequestsPerChild 0 #每個線程能響應的最大請求數,0表示不做限制 </IfModule> Listen 80 #監聽端口,格式:Listen [IP:]PORT,省略ip表示監聽本機所有IP; Listen可重復出現多次; LoadModule auth_basic_module modules/mod_auth_basic.so #模塊導入 LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.so LoadModule authn_alias_module modules/mod_authn_alias.so LoadModule authn_anon_module modules/mod_authn_anon.so LoadModule authn_dbm_module modules/mod_authn_dbm.so LoadModule authn_default_module modules/mod_authn_default.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_owner_module modules/mod_authz_owner.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_dbm_module modules/mod_authz_dbm.so LoadModule authz_default_module modules/mod_authz_default.so LoadModule ldap_module modules/mod_ldap.so LoadModule authnz_ldap_module modules/mod_authnz_ldap.so LoadModule include_module modules/mod_include.so LoadModule log_config_module modules/mod_log_config.so LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so LoadModule ext_filter_module modules/mod_ext_filter.so LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule expires_module modules/mod_expires.so LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so LoadModule usertrack_module modules/mod_usertrack.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule mime_module modules/mod_mime.so LoadModule dav_module modules/mod_dav.so LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so LoadModule info_module modules/mod_info.so LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module modules/mod_dir.so LoadModule actions_module modules/mod_actions.so LoadModule speling_module modules/mod_speling.so LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so LoadModule substitute_module modules/mod_substitute.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule cache_module modules/mod_cache.so LoadModule suexec_module modules/mod_suexec.so LoadModule disk_cache_module modules/mod_disk_cache.so LoadModule cgi_module modules/mod_cgi.so LoadModule version_module modules/mod_version.so Include conf.d/*.conf #包含擴展配置文件 User apache #進程運行用戶配置 Group apache ServerAdmin root@localhost #管理員郵箱配置 ServerName localhost:80 #域名配置 UseCanonicalName Off DocumentRoot "/var/www/html" #網站根目錄配置 <Directory /> #網站根訪問權限配置 Options FollowSymLinks #允許跟蹤符號鏈接 AllowOverride None #通常利用Apache的rewrite模塊對URL進行重寫,rewrite規則會寫在 .htaccess 文件里。但要使 apache 能夠正常的讀取.htaccess 文件的內容,就必須對.htaccess 所在目錄進行配置。從安全性考慮,根目錄的AllowOverride屬性一般都配置成不允許任何Override </Directory> <Directory "/var/www/html"> #默認站點目錄訪問權限配置 Options Indexes FollowSymLinks #允許索引和跟蹤符號鏈接 AllowOverride None Order allow,deny #訪問規則,allow,deny,哪個在前先匹配哪個,這里的allow對應下面Allow from all規則 Allow from all </Directory> <IfModule mod_userdir.c> UserDir disabled </IfModule> DirectoryIndex index.html index.html.var #網站默認頁面配置 AccessFileName .htaccess #訪問入口文件名 <Files ~ "^\.ht"> #正則匹配以.ht結尾的文件訪問權限配置 Order allow,deny Deny from all Satisfy All -->詳解:http://www.fwolf.com/blog/post/341 </Files> TypesConfig /etc/mime.types #類型配置路徑指定 DefaultType text/plain #默認類型 <IfModule mod_mime_magic.c> MIMEMagicFile conf/magic </IfModule> HostnameLookups Off ErrorLog logs/error_log #錯誤日志配置 LogLevel warn #錯誤日志級別 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #日志格式配置 LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent CustomLog logs/access_log combined #訪問日志配置 ServerSignature On Alias /icons/ "/var/www/icons/" <Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> <IfModule mod_dav_fs.c> DAVLockDB /var/lib/dav/lockdb </IfModule> ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" <Directory "/var/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8 AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip AddIconByType (TXT,/icons/text.gif) text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/* AddIcon /icons/binary.gif .bin .exe AddIcon /icons/binhex.gif .hqx AddIcon /icons/tar.gif .tar AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip AddIcon /icons/a.gif .ps .ai .eps AddIcon /icons/layout.gif .html .shtml .htm .pdf AddIcon /icons/text.gif .txt AddIcon /icons/c.gif .c AddIcon /icons/p.gif .pl .py AddIcon /icons/f.gif .for AddIcon /icons/dvi.gif .dvi AddIcon /icons/uuencoded.gif .uu AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl AddIcon /icons/tex.gif .tex AddIcon /icons/bomb.gif /core AddIcon /icons/back.gif .. AddIcon /icons/hand.right.gif README AddIcon /icons/folder.gif ^^DIRECTORY^^ AddIcon /icons/blank.gif ^^BLANKICON^^ DefaultIcon /icons/unknown.gif ReadmeName README.html HeaderName HEADER.html IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t AddLanguage ca .ca AddLanguage cs .cz .cs AddLanguage da .dk AddLanguage de .de AddLanguage el .el AddLanguage en .en AddLanguage eo .eo AddLanguage es .es AddLanguage et .et AddLanguage fr .fr AddLanguage he .he AddLanguage hr .hr AddLanguage it .it AddLanguage ja .ja AddLanguage ko .ko AddLanguage ltz .ltz AddLanguage nl .nl AddLanguage nn .nn AddLanguage no .no AddLanguage pl .po AddLanguage pt .pt AddLanguage pt-BR .pt-br AddLanguage ru .ru AddLanguage sv .sv AddLanguage zh-CN .zh-cn AddLanguage zh-TW .zh-tw LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW ForceLanguagePriority Prefer Fallback AddDefaultCharset UTF-8 AddType application/x-compress .Z AddType application/x-gzip .gz .tgz AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl AddHandler type-map var AddType text/html .shtml AddOutputFilter INCLUDES .shtml Alias /error/ "/var/www/error/" <IfModule mod_negotiation.c> <IfModule mod_include.c> <Directory "/var/www/error"> AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allow,deny Allow from all LanguagePriority en es de fr ForceLanguagePriority Prefer Fallback </Directory> </IfModule> </IfModule> BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0 BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully BrowserMatch "MS FrontPage" redirect-carefully BrowserMatch "^WebDrive" redirect-carefully BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully BrowserMatch "^gnome-vfs/1.0" redirect-carefully BrowserMatch "^XML Spy" redirect-carefully BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
三、常用配置解析
-
(1)修改監聽的IP和Port
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf Listen 80 格式:Listen [IP:]PORT 省略ip表示監聽本機所有IP; Listen可重復出現多次,表示監聽多個端口
-
(2)持久連接
每個web頁面都由多個資源組成,每個資源都由一個url進行訪問。這也就意味着打開頁面就需要對服務器請求多次。這樣每次訪問都需要經過三次握手,這樣非常耗費資源,為了解決這問題,引入了長連接。但是如果請求一直連接,而用戶不再獲取資源時,會導致連接一直占用資源,這需要進行對長連接進行限制。
Persistent Connection:連接建立,每個資源獲取完成后不會斷開連接,而是繼續等待其它的請求完成;那么長連接又是如何配置斷開的呢?有2種方式:
連接數量限制:100,表示最多100個連接
連接時間限制:可配置,比如60s,不建議設置太長,尤其是並發較大的環境中
持久連接副作用:對並發訪問量較大的服務器,持久連接功能會使用有些請求得不到響應;
持久連接折衷方案:使用較短的持久連接時間;比如5s。httpd-2.4 支持毫秒級持久時間;
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf KeepAlive On #開啟|關閉長連接 MaxKeepAliveRequests 100 #最大長連接請求數配置 KeepAliveTimeout 15 #長連接超時時間配置 測試長、短連接: [root@localhost apache]# yum install -y telnet [root@localhost extra]# telnet 192.168.56.13 80 Trying 192.168.56.13... Connected to 192.168.56.13. Escape character is '^]'. GET / HTTP/1.1 Host: 192.168.56.11 HTTP/1.1 200 OK Date: Wed, 11 Jul 2018 08:29:49 GMT Server: Apache/2.2.31 (Unix) Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT ETag: "2059de5-2c-3e9564c23b600" Accept-Ranges: bytes Content-Length: 44 Content-Type: text/html <html><body><h1>It works!</h1></body></html>Connection closed by foreign host. #短連接會請求完畢會直接斷開(Connection closed),配置好長連接和超時,可以在第一次請求完畢后再次請求,在超過超時時間內自動斷開。 [root@localhost extra]# vim httpd.conf 解除注釋: Include conf/extra/httpd-default.conf [root@localhost extra]# telnet 192.168.56.13 80 Trying 192.168.56.13... Connected to 192.168.56.13. Escape character is '^]'. GET / HTTP/1.1 Host: 192.168.56.13 HTTP/1.1 200 OK Date: Wed, 11 Jul 2018 08:38:17 GMT Server: Apache/2.2.31 (Unix) Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT ETag: "2059de5-2c-3e9564c23b600" Accept-Ranges: bytes Content-Length: 44 Content-Type: text/html <html><body><h1>It works!</h1></body></html> 此處不會提示Connection closed,而是等待再次請求,而后超過超時時間,自動斷開
-
(3)MPM
Multipath Process Module:多道處理模塊,主要有三種prefork, worker, event
httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不同MPM機制的支持;確認方法:
[root@localhost ~]# ps axu |grep httpd root 1444 0.0 0.3 175456 4028 ? Ss Jul11 0:11 /usr/sbin/httpd apache 6014 0.0 0.3 175588 3184 ? S 09:37 0:00 /usr/sbin/httpd apache 6015 0.0 0.3 175588 3184 ? S 09:37 0:00 /usr/sbin/httpd apache 6016 0.0 0.3 175588 3184 ? S 09:37 0:00 /usr/sbin/httpd apache 6017 0.0 0.3 175588 3192 ? S 09:37 0:00 /usr/sbin/httpd apache 6018 0.0 0.3 175588 3128 ? S 09:37 0:00 /usr/sbin/httpd apache 6019 0.0 0.3 175588 3116 ? S 09:37 0:00 /usr/sbin/httpd apache 6020 0.0 0.3 175588 3180 ? S 09:37 0:00 /usr/sbin/httpd apache 6021 0.0 0.3 175588 3184 ? S 09:37 0:00 /usr/sbin/httpd apache 6028 0.0 0.2 175588 2860 ? S 09:38 0:00 /usr/sbin/httpd root 6070 0.0 0.0 103320 880 pts/0 S+ 09:49 0:00 grep httpd 默認為/usr/sbin/httpd, 其使用prefork模型,如果是work會顯示httpd.work 或httpd.event
查看模塊列表:

[root@localhost apache]# httpd -l #查看靜態編譯的模塊 Compiled in modules: core.c mod_authn_file.c mod_authn_default.c mod_authz_host.c mod_authz_groupfile.c mod_authz_user.c mod_authz_default.c mod_auth_basic.c mod_include.c mod_filter.c mod_deflate.c mod_log_config.c mod_env.c mod_expires.c mod_setenvif.c mod_version.c prefork.c http_core.c mod_mime.c mod_status.c mod_autoindex.c mod_asis.c mod_cgi.c mod_negotiation.c mod_dir.c mod_actions.c mod_userdir.c mod_alias.c mod_rewrite.c mod_so.c [root@localhost apache]# httpd -M 查看靜態編譯及動態裝載的模塊 Loaded Modules: core_module (static) authn_file_module (static) authn_default_module (static) authz_host_module (static) authz_groupfile_module (static) authz_user_module (static) authz_default_module (static) auth_basic_module (static) include_module (static) filter_module (static) deflate_module (static) log_config_module (static) env_module (static) expires_module (static) setenvif_module (static) version_module (static) mpm_prefork_module (static) http_module (static) mime_module (static) status_module (static) autoindex_module (static) asis_module (static) cgi_module (static) negotiation_module (static) dir_module (static) actions_module (static) userdir_module (static) alias_module (static) rewrite_module (static) so_module (static) Syntax OK
解析prefork、work模式的配置
[root@localhost apache]# vim conf/httpd.conf 去除注釋符號"#",將mpm模式配置包含進來 Include conf/extra/httpd-mpm.conf [root@localhost extra]# vim httpd-mpm.conf prefork的配置: <IfModule prefork.c> StartServers 8 #服務啟動時的子進程數量 MinSpareServers 5 #最小空閑進程數 MaxSpareServers 20 #最大空閑進程數 ServerLimit 256 #服務器生命周期內為MaxClient所允許的最大進程數,通常相等MaxClients MaxClients 256 #最大並發請求數 MaxRequestsPerChild 4000 #單個進程響應的最大請求數 </IfModule> worker的配置: <IfModule worker.c> StartServers 4 #服務器啟動時的進程數 MaxClients 300 #最大並發請求數 MinSpareThreads 25 #最小空閑線程數 MaxSpareThreads 75 #最大空閑線程數 ThreadsPerChild 25 #每個進程能啟動的線程數 MaxRequestsPerChild 0 #每個線程能響應的最大請求數,0表示不做限制 </IfModule>
-
(4)PV, UV的概念
PV: Page View 有效計算的頁面訪問量,每一個頁面鏈接都是一個請求
UV: User View 用戶量
獨立IP量;
300 * 86400 = 2592 0000 架設頁面有50個資源,大概就有40W+PV,從早到晚全負荷工作
每一個PV需要多少帶寬,假設一個資源需要200k,1個請求20k
一個主站頁面有100個請求,服務器最大並發300個,滿負荷計算PV
300 * 86400 = 2592 0000 /100 = 25w+ 的PV
-
(5)DSO 配置指令實現模塊加載
格式:LoadModule <mod_name> <mod_path> 模塊路徑可使用相對地址,相對於ServerRoot("/etc/httpd")指向的路徑而言;
[root@localhost ~]# grep LoadModule /etc/httpd/conf/httpd.conf
# have to place corresponding `LoadModule' lines at this location so the
# LoadModule foo_module modules/mod_foo.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
......
-
(6)定義'Main' server的文檔頁面路徑
[root@localhost conf]# vim httpd.conf DocumentRoot "/var/www/html"
文檔路徑映射:DocumentRoot指向的路徑為URL路徑的起始位置;
舉例: DocumentRoot "/var/www/html" test/index.html --> http://HOST:PORT/test/index.html
-
(7)站點訪問控制
可基於兩種類型的路徑指明對哪些資源進行訪問控制
文件系統路徑:
<Directory ""> </Direcotry> <File ""> </File> <FileMatch ""> </FileMatch> 正則表達式模式匹配
URL路徑:
<Location ""> </Location> ...
訪問控制機制:
基於來源地址;對ip地址訪問控制
基於賬號;
-
(8)Directory中“基於來源地址”實現訪問控制
(1) Options 訪問選項:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None, All Indexes: 索引;允許索引會把網站所有的文件列出來,很危險。當我們訪問網站並未給明指定資源時,會直接返回主頁面(index.html),如http://www.123.com/。但是如果沒有指明主頁面,啟用該索引就會把網站所有的頁面將會以列表形式全部展示出來。常用於下載站點,
要禁止,去掉或在前面加上減號“-”: -Indexes
FollowSymlinks:允許跟蹤符號鏈接文件;假設網站下有一個軟鏈接,可以使用該選項進行配置是否允許訪問軟鏈接。要禁止以上的選項,可以直接使用Options None [root@localhost ~]# mv /etc/httpd/conf.d/welcome.conf{,.bak} [root@localhost ~]# mkdir /www/htdocs -pv [root@localhost ~]# vim /etc/httpd/conf/httpd.conf 修改成 DocumentRoot "/www/htdocs" <Directory "/www/htdocs">
[root@localhost ~]# service httpd reload
[root@localhost ~]# ll /www/htdocs/
total 8
-rw-r--r-- 1 root root 779 Jul 13 10:02 fstab.html
-rw-r--r-- 1 root root 45 Jul 13 09:44 test.html
[root@localhost ~]# ln -sv /etc/issue /www/htdocs/
`/www/htdocs/issue' -> `/etc/issue'
[root@localhost ~]# ll /www/htdocs/
total 8
-rw-r--r-- 1 root root 779 Jul 13 10:02 fstab.html
lrwxrwxrwx 1 root root 10 Jul 13 10:24 issue -> /etc/issue
-rw-r--r-- 1 root root 45 Jul 13 09:44 test.html
當在網站根目錄下沒有默認的index.html主頁面時,開啟了Indexes會以列表形式展示所有的代碼鏈接,而issue文件作為軟鏈接,因為設置了FollowSymlinks,所以也可以訪問到issue文件,如下圖:
(2) 基於來源地址的訪問控制機制 使用allow和deny的規則 例如: Order deny,allow deny from all allow from 127.0.0.1 判斷依據如下: ①看Order后面的,哪個在前,哪個在后 ②如果deny在前,那么就要先看deny from這句,然后看allow這句 ③規則是一條一條的匹配,不管是deny在前還是allow在前,都會生效。如案列中,先是deny了所有,然后又allow了127.0.0.1,所以127.0.0.1是通過的。 再舉幾個例子: Order allow,deny deny from all allow from 127.0.0.1 這個就會deny所有,127.0.0.1也會被deny。因為順序是先allow然后deny,雖然一開始allow了127.0.0.1,但后面有deny掉了。 Order allow,deny deny from all 上面的規則表明,全部都不能通 Order deny,allow deny from all 上面規則表示,全部都不能通行 Order deny,allow 只有順序,沒有規則,表示,全部都可以通行(默認的),因為allow在最后了 Order allow,deny 這個表示全部都不能通行(默認的),因為deny在最后了 (1)對某個目錄做限制,至允許本公司ip訪問,當然這個目錄可以是網站的根目錄,也就是整個站點都需要做限制了 <Directory /data/www> Order deny,allow deny from all allow from 127.0.0.1 </Directory> 說明:只允許127.0.0.1訪問,其他ip全部拒絕掉 (2)針對請求的uri去限制,前面安裝的discuz論壇,訪問后台是admin.php,那么我們就可以針對這個admin.php做限制。 <filesmatch "(.*)admin(.*)> Order deny ,allow Deny from all Allow from 127.0.0.1 </filesmatch> 說明:這里用到了filesmatch語法,表示匹配的意思。
-
(9)定義默認主頁面
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.html.var
默認的主頁面可以有很多,如index.php 、index.htm等
-
(10)日志設定、切割以及不記錄指定類型日志
①日志的格式設定
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf 錯誤日志: ErrorLog logs/error_log #日志路徑 LogLevel warn #日志級別 日志級別:debug, info, notice, warn, error, crit, alert, emerg 訪問日志: CustomLog logs/access_log combined #combined為日志格式名 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined %h:客戶端IP地址; %l: Remote logname (from identd, if supplied). -表示為空; %u: Remote user, (from auth; may be bogus if return status (%s) is 401); %t:Time the request was received (standard english format),服務器收到請求的時間; %r:First line of request,請求報文的道行信息(method url version); %>s: 響應狀態碼; %b: 響應報文的大小,單位是字節,不包括響應報文首部; %{Referer}i:請求報文當中"referer"首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來; %{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的應用程序; 詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
②日志切割
這里的日志指的是訪問日志,我們每訪問一次網站,那么就會記錄若干條日志。當然前提是已經配置了日志,日志如果不去管理,時間長了就會越來越大。那么如何避免產生這么大的日志文件呢?Apache有相關的配置,是日志按照我們的需求進行歸檔,比如每天一個新日志,或者每小時更新一個日志。
[root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf #配置虛擬主機配置文件vhosts.conf <VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" ErrorLog "|usr/sbin/retatelogs -l /etc/httpd/logs/www.abc.org_error_%Y%m%d_log 86400" #配置錯誤日志按天切割 CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_access_%Y%m%d_log 86400" combined #配置訪問日志按天切割 </VirtualHost> [root@localhost ~]# apachectl -t Syntax OK [root@localhost ~]# service httpd reload Reloading httpd: [root@localhost ~]# curl www.abc.org welcome to www.abc.org
[root@localhost ~]# ll /etc/httpd/logs/www.abc.org_* -rw-r--r-- 1 root root 368 Jul 15 09:23 /etc/httpd/logs/www.abc.org_access_20180715_log -rw-r--r-- 1 root root 148 Jul 15 09:22 /etc/httpd/logs/www.abc.org_error_20180715log
解析說明:ErrorLog是錯誤日志,CustomLog是訪問日志。最前面的管道符意識是把產生的日志交給rotatelogs這個工具,而這個工具就是Apache自帶的切割日志的工具。-l的作用是校准時區為UTC,也就是北京時間。最后面的86400,單位為秒,所以正好是一天,那么日志會每天切割一次,后面的combined為日志格式。
③apache不記錄指定類型的日志
如果一個站點的訪問量過大,那么訪問日志就會有很多,但有一些訪問日志我們其實是可以忽略的,比如網站的一些圖片,還有js,css等靜態對象。而這些文件的訪問往往是巨量的,而且即使記錄這些日志也沒什么用,那么如何忽略掉這些訪問的日志呢?
相關配置為:
[root@localhost logs]# !vim vim /etc/httpd/conf.d/vhosts.conf <VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" SetEnvIf Request_URI ".*\.gif$" image-request SetEnvIf Request_URI ".*\.jpg$" image-request SetEnvIf Request_URI ".*\.png$" image-request SetEnvIf Request_URI ".*\.bmp$" image-request SetEnvIf Request_URI ".*\.swf$" image-request SetEnvIf Request_URI ".*\.js$" image-request SetEnvIf Request_URI ".*\.css$" image-request ErrorLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_error_%Y%m%d_log 86400" CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_access_%Y%m%d_log 86400" combined env=!image -request </VirtualHost> [root@localhost logs]# apachectl -t Syntax OK [root@localhost logs]# service httpd reload Reloading httpd:
解析說明:在原來日志配置的基礎上,增加了一些image-request的定義,比如把gif、jpg、bmp、swf、js、css等結尾的全部標記為image-request,然后再配置日志的時候加一個標記env!=image-request,這里有個嘆號,表示取反,這樣就可以把那些忽略了。
-
(11)Apache配置靜態緩存
這里的靜態文件指的是圖片、js、css等文件,用戶訪問一個站點,其實大多數元素都是圖片、js、css等,這些靜態文件其實是會被客戶端的瀏覽器緩存到本地電腦上的,目的就是為了下次再請求時不再去服務器上下載,這樣就加快了速度,提高了用戶體驗,但是這些靜態文件不能一直緩存,它總有一些時效性。
[root@localhost logs]# vim /etc/httpd/conf.d/vhosts.conf [root@localhost logs]# apachectl -t Syntax OK [root@localhost logs]# service httpd reload Reloading httpd: [root@localhost logs]# <VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/gif "access plus 1 days" ExpiresByType image/jpeg "access plus 24 hours" ExpiresByType image/png "access plus 24 hours" ExpiresByType text/css "now plus 2 hours" ExpiresByType application/x-javascript "now plus 2 hours" ExpiresByType application/javascript "now plus 2 hours" ExpiresByType application/x-shockwave-flash "now plus 2 hours" ExpiresDefault "now plus 0 min" </IfModule> SetEnvIf Request_URI ".*\.gif$" image-request SetEnvIf Request_URI ".*\.jpg$" image-request SetEnvIf Request_URI ".*\.png$" image-request SetEnvIf Request_URI ".*\.bmp$" image-request SetEnvIf Request_URI ".*\.swf$" image-request SetEnvIf Request_URI ".*\.js$" image-request SetEnvIf Request_URI ".*\.css$" image-request ErrorLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_error_%Y%m%d_log 86400" CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_access_%Y%m%d_log 86400" combined env=!image-request </VirtualHost>
說明:這里的時間單位可以是days、hours、min,要想使用這些模塊,必要要查看是否支持,查看命令為:# /usr/local/apache2/bin/apachectl -M
-
(12)路徑別名
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf DocumentRoot "/www/htdocs" 假設訪問鏈接:http://www.192.168.56.13.com/download/bash-4.4.2-3.el6.x86_64.rpm --> 資源路徑為:/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm 那么如果將訪問的路徑配置一個別名,將會實現一個跳轉頁面 語法格式:Alias /URL/ "/PATH/TO/SOMEDIR/" 舉例: [root@localhost htdocs]# pwd /www/htdocs [root@localhost htdocs]# tree . ├── bbs │ └── index.html ├── forum └── index.html [root@localhost htdocs]# curl http://192.168.56.13/bbs/index.html #沒有配置別名時訪問 Page At /bbs/index.html [root@localhost ~]# vim /etc/httpd/conf/httpd.conf Alias /bbs/ "/www/htdocs/forum/" #配置bbs目錄的別名 [root@localhost htdocs]# curl http://192.168.56.13/bbs/index.html #配置別名時訪問 Page at /www/htdocs/forum
-
(13)基於用戶的訪問控制
當訪問網站頁面時,會對用戶的身份進行驗證。這請求需要經歷一下階段:
(1)認證質詢:
WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶提供賬號和密碼;
(2)認證:
Authorization:客戶端用戶填入賬號和密碼后再次發送請求報文;認證通過,則服務器發送響應的資源;
客戶端所用到的賬號密碼通過http發送,由於http是明文傳輸,存在安全隱患,由此引申認證類型:
①basic:明文,解決安全隱患,可以放在https進行傳輸
②digest:消息摘要,通過md5加密,較老的瀏覽器不支持
目前來說都是以表單認證的形式
安全域:需要用戶認證后方能訪問的路徑;針對某一目錄的認證
應該通過名稱對其進行標識,並用於告知用戶認證的原因;
那么認證的用戶的賬號和密碼存儲於何處?
虛擬賬號:僅用於訪問某服務時用到的認證標識;和系統賬號無關
虛擬賬號的存儲方式:文本文件、SQL數據庫、ldap、nis等等
basic認證方式三步曲:
(1) 定義安全域
<Directory ""> Options None AllowOverride None AuthType Basic #認證方式 AuthName "STRING" #認證名稱 AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" #認證用戶相關文件 Require user username1 username2 ... #指定用戶 #Require valid-user #如果允許賬號文件中的所有用戶登錄訪問,則選用該選項 </Directory>
(2) 提供賬號和密碼存儲(文本文件)
使用htpasswd命令進行管理 語法格式:htpasswd [options] passwordfile username -c: 自動創建passwordfile,因此,僅應該在添加第一個用戶時使用; -m: md5加密用戶密碼; -s: sha1加密用戶密碼; -D: 刪除指定用戶
(3) 實現基於組進行認證
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group GROUP1 GROUP2 ... </Directory> 需要提供:用戶賬號文件和組文件; 組文件需要手動創建:每一行定義一個組 格式:GRP_NAME:user1 user2 user3 ...
舉個例子:
[root@localhost admin]# vim /etc/httpd/conf/httpd.conf #修改配置文件,對/www/htdocs/admin目錄進行認證訪問 增加 <Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic #認證類型為Basic AuthName "Administator private" #認證提示 AuthUserFile "/etc/httpd/conf.d/.htpasswd" #用戶密碼文件路徑 Require valid-user #設置全部用戶有效 </Directory> [root@localhost admin]# apachectl -t #測試配置文件語法 Syntax OK [root@localhost admin]# service httpd reload #重新加載httpd Reloading httpd: [root@localhost admin]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom #創建第一個用戶tom New password: 123456 Re-type new password: 123456 Adding password for user tom [root@localhost admin]# htpasswd -m /etc/httpd/conf.d/.htpasswd jack #創建第二個用戶jack New password: 123456 Re-type new password: 123456 Adding password for user jack [root@localhost admin]# tail /etc/httpd/conf.d/.htpasswd #查看用戶密碼文件,都是以加密格式存放密碼 tom:$apr1$4GLjLGoJ$E523FFHh3hp84gU1y1X431 jack:$apr1$gER/EINJ$G.AZHOt7D49tZkGsirVwp1 [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
訪問:http://192.168.56.13/admin/index.html,提示需要輸入用戶密碼登陸:tom 123456
修改配置僅限tom用戶訪問
[root@localhost admin]# !vim vim /etc/httpd/conf/httpd.conf <Directory "/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administator private" AuthUserFile "/etc/httpd/conf.d/.htpasswd" #Require valid-user Require user tom #配置僅限tom用戶訪問 </Directory> [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
實現基於組進行認證
root@localhost admin]# htpasswd -m /etc/httpd/conf.d/.htpasswd kim #增加認證用戶kim New password: 123456 Re-type new password: 123456 Adding password for user kim [root@localhost admin]# vim /etc/httpd/conf.d/.htgroup #手動創建組文件,將用戶jack和kim歸並到webadmin組 webadmin: jack kim [root@localhost admin]# vim /etc/httpd/conf/httpd.conf #修改配置文件,僅限組內用戶訪問 <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 valid-user #Require user tom Require group webadmin #僅限webadmin組內用戶訪問 </Directory> [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
-
(14)虛擬主機
有三種實現方案:
基於ip:
為每個虛擬主機准備至少一個ip地址;
基於port:
為每個虛擬主機准備至少一個專用port;實踐中很少使用;
基於hostname:
為每個虛擬主機准備至少一個專用hostname;
可混合使用上述三種方式中任意方式;
注意:一般虛擬主機莫與中心主機混用,所以,要使用虛擬主機,先禁用中心主機;
禁用中心主機:注釋DocumentRoot
每個虛擬主機都有專用配置:
<VirtualHost "IP:PORT"> SeverName DocumentRoot "" </VirtualHost> ServerAlias: 虛擬主機的別名; ErrorLog:錯誤日志 CustomLog:訪問日志 <Directory ""> 封裝目錄進行訪問控制 </Directory>
①配置基於IP虛擬主機
(1)配置站點目錄和主頁文件
[root@localhost admin]# mkdir -pv /vhosts/{www,bbs,blog}/htdocs #創建網站目錄 mkdir: created directory `/vhosts' mkdir: created directory `/vhosts/www' mkdir: created directory `/vhosts/www/htdocs' mkdir: created directory `/vhosts/bbs' mkdir: created directory `/vhosts/bbs/htdocs' mkdir: created directory `/vhosts/blog' mkdir: created directory `/vhosts/blog/htdocs' [root@localhost admin]# echo "welcome to www.abc.org" > /vhosts/www/htdocs/index.html #創建www的主頁index.html [root@localhost admin]# echo "welcome to bbs.abc.org" > /vhosts/bbs/htdocs/index.html #創建bbs的主頁index.html [root@localhost admin]# echo "welcome to blog.abc.org" > /vhosts/blog/htdocs/index.html #創建blog的主頁index.html
(2)為eth0:0配置臨時新ip:192.168.56.130 [root@localhost admin]# ifconfig eth0:0 192.168.56.130/24 up #配置虛擬網卡 [root@localhost admin]# ifconfig eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:83:73:08 inet addr:192.168.56.130 Bcast:192.168.56.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
(3)修改主配置文件httpd.conf [root@localhost admin]# vim /etc/httpd/conf/httpd.conf <VirtualHost 192.168.56.13:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost 192.168.56.130:80> ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost>
(4)檢查語法,平滑重啟Apache [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
(5)配置hosts解析,測試訪問 [root@localhost admin]# vim /etc/hosts
配置hosts解析:
192.168.56.13 www.abc.org bbs.abc.org blog.abc.org
[root@localhost admin]# curl 192.168.56.13 welcome to www.abc.org [root@localhost admin]# curl 192.168.56.130 welcome to bbs.abc.org
②基於端口虛擬主機
(1)修改主配置文件httpd,配置監聽端口以及多端口虛擬主機
[root@localhost admin]# vim /etc/httpd/conf/httpd.conf Listen 80 Listen 8080 Listen 8081 <VirtualHost *:80> #配置www.abc.org監聽80端口 ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost *:8080> #配置bbs.abc.org監聽8080端口 ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:8081> #配置blog.abc.org監聽8081端口 ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost>
(2)檢查配置文件語法,平滑重啟Apache [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
(3)測試訪問 [root@localhost admin]# curl www.abc.org welcome to www.abc.org [root@localhost admin]# curl bbs.abc.org:8080 welcome to bbs.abc.org [root@localhost admin]# curl bbs.abc.org:8081 welcome to blog.abc.org
③基於域名的虛擬主機
(1)修改主配置文件httpd.conf
[root@localhost admin]# vim /etc/httpd/conf/httpd.conf NameVirtualHost *:80 #打開注釋 <VirtualHost *:80> #配置www.abc.org域名 ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost *:80> #配置bbs.abc.org域名 ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:80> #配置blog.abc.org域名 ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost>
(2)修改Host本地解析 [root@localhost admin]# vim /etc/hosts 192.168.56.13 www.abc.org bbs.abc.org blog.abc.org
(3)檢測語法,平滑重啟Apache [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
(4)測試訪問 [root@localhost admin]# curl www.abc.org welcome to www.abc.org [root@localhost admin]# curl bbs.abc.org welcome to bbs.abc.org [root@localhost admin]# curl blog.abc.org welcome to blog.abc.org
-
(15)內置的status頁面
修改主配置文件,找到server-status的注釋行,打開注釋。修改Allow from .example.com 為Allow from all
該配置可以在主配置中配置,全局生效;也可以在虛擬主機內配置,局部生效,一般這種狀態信息頁,可以使用前面的Auth認證的方式進行打開,更為安全。
[root@localhost admin]# vim /etc/httpd/conf/httpd.conf <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from all </Location> [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
訪問頁面http://www.abc.org/server-status
狀態頁面解析:
Current Time: Saturday, 14-Jul-2018 06:51:47 EDT #當前時間 Restart Time: Saturday, 14-Jul-2018 06:50:17 EDT #重啟時間 Parent Server Generation: 30 Server uptime: 1 minute 30 seconds #服務更新時間 1 requests currently being processed, 7 idle workers W_______........................................................ ................................................................ ................................................................ ................................................................ Scoreboard Key: "_" Waiting for Connection(正在等待連接), "S" Starting up(正在啟動), "R" Reading Request(正在接收用戶請求), "W" Sending Reply(正在發送響應), "K" Keepalive (read)(保持連接), "D" DNS Lookup(DNS查詢), "C" Closing connection(正在關閉連接), "L" Logging(正在記錄日志), "G" Gracefully finishing(優雅終止), "I" Idle cleanup of worker(空閑清理work進程), "." Open slot with no current process(打開槽位等待進程) PID Key: (從左至右的pid狀態展示) 9143 in state: W , 9144 in state: _ , 9145 in state: _ 9146 in state: _ , 9147 in state: _ , 9148 in state: _ 9149 in state: _ , 9150 in state: _ ,
如果還需要獲取更加詳細的信息,可以修改配置文件中的擴展狀態開關: ExtendedStatus On
,開啟后,可以看到下圖的狀態信息:
-
(16)默認虛擬主機
在windows下修改C:\windows\system32\drivers\etc\hosts或Linux的/etc/hosts下,增加一個www.222.com指向192.168.56.13保存后退出,在瀏覽器訪問依舊可以實現訪問,這樣就顯得很不安全。此時我們需要修改虛擬主機配置文件。
[root@localhost admin]# vim /etc/hosts 192.168.56.13 www.abc.org bbs.abc.org blog.abc.org www.222.com [root@localhost admin]# curl www.222.com welcome to www.abc.org
此時,配置虛擬主機配置文件,第一個為默認虛擬主機,指向一個隨意的域名和空目錄,即可達到禁止隨意解析
[root@localhost conf.d]# vim /etc/httpd/conf/httpd.conf #在主配置文件中可以使用Include包含擴展配置文件,這里啟用這種方式,可以更方便地管理虛擬主機 Include conf.d/*.conf
[root@localhost conf.d]# vim vhosts.conf #編輯虛擬主機配置文件,添加默認虛擬主機 <VirtualHost *:80> ServerName 12332.com #任意域名 DocumentRoot "/tmp/123" #根目錄為空 <Directory /tmp/123> #對網站根目錄進行全新配置,拒絕所有訪問 Order allow,deny Deny from all </Directory> </VirtualHost>
<VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost *:80> ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:80> ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost> [root@localhost conf.d]# mkdir /tmp/123 [root@localhost conf.d]# apachectl -t Syntax OK [root@localhost conf.d]# service httpd reload Reloading httpd: [root@localhost conf.d]# curl www.222.com #訪問返回了403狀態碼 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access / on this server.</p> <hr> <address>Apache/2.2.15 (CentOS) Server at www.222.com Port 80</address> </body></html>
-
(17)域名301跳轉
一個站點難免會有多個域名,而多個域名總的有一個主次之分,比如阿銘linux的網站可以用兩個域名進行訪問:www.abc.org 和www.123.com,但是不管用哪個域名進行訪問,最終都會跳到www.abc.org上來。那么這個行為就叫做域名跳轉,這里的301只是一個狀態碼,跳轉除了301外還有302。下面如何配置域名跳轉呢?假設配置如何讓www.123.com跳轉到www.abc.org
(1)修改虛擬主機配置文件vhosts.conf,在虛擬主機內配置跳轉模塊規則
[root@localhost conf.d]# vim vhosts.conf 需要注釋原來的默認虛擬主機,否則實驗會報錯 #<VirtualHost *:80> # ServerName 12332.com # DocumentRoot "/tmp/123" # <Directory /tmp/123> # Order allow,deny # Deny from all # </Directory> #</VirtualHost> <VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" <IfModule mod_rewrite.c> #使用rewrite模塊 Options +FollowSymLinks RewriteEngine on #開始重寫模塊 RewriteCond %{HTTP_HOST} ^www.123.com$ #判斷條件:域名是否是www.123.com RewriteRule ^(.*)$ http://www.abc.org/$1 [R=301,L] #跳轉規則,上面條件成立,則跳轉到www.abc.org </IfModule> </VirtualHost> <VirtualHost *:80> ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:80> ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost>
(2)配置hosts解析 [root@localhost conf.d]# vim /etc/hosts 192.168.56.13 www.abc.org bbs.abc.org blog.abc.org www.123.com
(3)檢查語法,平滑重啟Apache [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
(4)測試頁面是否跳轉 [root@localhost conf.d]# curl www.123.com -I HTTP/1.1 301 Moved Permanently #提示301跳轉頁面 Date: Sat, 14 Jul 2018 11:46:33 GMT Server: Apache/2.2.15 (CentOS) Location: http://www.abc.org// Content-Type: text/html; charset=iso-8859-1
如果有多個域名,可以使用一下配置:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.123.com [OR] RewriteCond %{HTTP_HOST} ^www.456.com RewriteRule ^/(.*)$ http://www.abc.org/$1 [R=301,L] </IfModule> 或者 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} !^www.abc.org$ RewriteRule ^/(.*)$ http://www.abc.org/$1 [R=301,L] </IfModule>
- (18)使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景:
(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持;
(2) 壓縮適於壓縮的資源,例如文件文件;
(1)編輯主配置文件httpd.conf導入delfalte模塊並在末尾添加: LoadModule deflate_module modules/mod_deflate.so #######deflate####### 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. 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
(2)檢測配置文件語法,並重載
[root@localhost htdocs]# apachectl -t Syntax OK [root@localhost htdocs]# service httpd reload Reloading httpd:
(3)頁面測試 [root@localhost ~]# curl --compressed www.abc.org/test.html -I #沒有啟用deflate模塊壓縮時,文本大小長度為282080 HTTP/1.1 200 OK Date: Sun, 15 Jul 2018 14:10:02 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Sun, 15 Jul 2018 14:09:28 GMT ETag: "f4f-44de0-5710a42d25bb8" Accept-Ranges: bytes Content-Length: 282080 Cache-Control: max-age=0 Expires: Sun, 15 Jul 2018 14:10:02 GMT Content-Type: text/html; charset=UTF-8 [root@localhost ~]# curl --compressed www.abc.org/test.html -I #啟用deflate模塊壓縮后,文本大小長度為23797 HTTP/1.1 200 OK Date: Sun, 15 Jul 2018 14:10:27 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Sun, 15 Jul 2018 14:09:28 GMT ETag: "f4f-44de0-5710a42d25bb8" Accept-Ranges: bytes Cache-Control: max-age=0 Expires: Sun, 15 Jul 2018 14:10:27 GMT Vary: Accept-Encoding Content-Encoding: gzip #結果看到啟用了gzip壓縮 Content-Length: 23797 #壓縮后的大小 Content-Type: text/html; charset=UTF-8