Apache 是一款使用量排名第一的 網頁伺服器,LAMP 中的 A 指的就是它。由於其開源、穩定、安全等特性而被廣泛使用。前邊的一篇文章中已經記錄過如何搭建 LAMP 架構,搭建僅是第一步,其中最為重要的就是 Apache 服務,也是 LAMP 的核心。下邊記錄了使用 Apache 以來經常用到的功能。 一、Apache的三種工作模式
編譯的時候,可以通過 configure 的參數來指定:
--with-mpm=prefork|worker|event
1、prefork 工作模式
Apache在啟動之初,就預先fork一些子進程,然後等待請求進來。之所以這樣做,是為了減少頻繁建立和銷毀進程的開銷。每個子進程只有一個線程,在一個時間點內,只能處理一個請求。
優點:成熟穩定,相容所有新老模組。同時,不需要擔心安全執行緒的問題。
缺點:一個進程相對佔用更多的系統資源,消耗更多的記憶體。而且,它並不擅長處理高並發請求。
2、worker 工作模式
使用了多進程和多線程的混合模式。它也預先fork了幾個子進程(數量比較少),然後每個子進程建立一些線程,同時包括一個監聽線程。每個請求過來,會被分配到1個線程來服務。線程比起進程會更輕量,因為線程通常會共用父進程的記憶體空間,因此,記憶體的佔用會減少一些。在高並發的情境下,因為比起prefork有更多的可用線程,表現會更優秀一些。
優點:佔據更少的記憶體,高並發下表現更優秀。
缺點:必須考慮安全執行緒的問題。
3、event 工作模式
它和worker模式很像,最大的區別在於,它解決了keep-alive情境下,長期被佔用的線程的資源浪費問題。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高並發情境下的請求處理能力。
HTTP採用keepalive方式減少TCP串連數量,但是由於需要與伺服器線程或進程進行綁定,導致一個繁忙的伺服器會消耗完所有的線程。Event MPM是解決這個問題的一種新模型,它把服務進程從串連中分離出來。在伺服器處理速度很快,同時具有非常高的點擊率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效,但不能在HTTPS訪問下工作。
在對應的虛擬機器主機配置中加入如下配置:(加粗部分是新增內容)
<VirtualHost *:80> DocumentRoot "/usr/local/apache2/htdocs" ServerName www.123.com ServerAlias www.abc.com <Directory /usr/local/apache2/htdocs/admin.php> AllowOverride AuthConfig AuthName "Please input you acount." AuthType Basic AuthUserFile /usr/local/apache2/htdocs/.htpasswd require valid-user </Directory> </VirtualHost>
說明:首先指定要對哪個目錄進行驗證,AuthName自訂,AuthUserFile指定使用者密碼檔案在哪裡。
2、建立加密用的使用者名稱和密碼檔案
htpasswd -c /usr/local/apache2/htdocs/.htpasswd liwei htpasswd -m /usr/local/apache2/htdocs/.htpasswd admin
建立第一個使用者時-c選項建立.htpasswd檔案,-m選項增加使用者,根據提示輸入密碼。
3、重啟apache服務
apachectl -t apachectl graceful
先檢查配置是否正確,然後用graceful相當於是reload配置,不用重啟apache服務,效果一樣。測試,通過瀏覽器輸入 www.123.com/admin.php 提示輸入密碼。
添加一個虛擬機器主機的記錄:
<VirtualHost *:80> DocumentRoot "/var/123" ServerName xxxxx.com.cn <Directory /var/123> Order allow,deny Deny from all </Directory> </VirtualHost>
建立/var/123目錄,並且設定600許可權,daemon使用者無法訪問:
mkdir /var/123 chmod -R 600 /var/123
2、重啟apache伺服器
apachectl -t apachectl graceful
如果用IP或其它解析的網域名稱訪問,發現提示:
ForbiddenYou don't have permission to access / on this server.
四、網域名稱301跳轉
一個網站難免會有多個網域名稱,而多個網域名稱總得有一個主次,比如我的網站可以用兩個網域名稱訪問:www.itepub.cn 和 www.linuxblogs.cn 但大家發現不管我用哪個網域名稱訪問,最終都會跳轉到www.linuxblogs.con 上來。這個行為就叫做網域名稱跳轉,這裡的301隻是一個狀態代碼,跳轉除了301還有302,301是永久跳轉,302
是臨時跳轉,網站上一定要設定為301,這樣對搜尋引擎是比較友好的。
1、佈建網域名跳轉
# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.abc.com$ RewriteRule ^/(.*)$ http:<span>//www.123.com/$1 [R=301,L] </IfModule> 配置為:當訪問aaa時,跳轉到123的網站。
2、配置多個網域名稱跳轉
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.abc.com$ [OR] RewriteCond %{HTTP_HOST} ^www.abcd.com$ RewriteRule ^/(.*)$ http:<span>//www.123.com/$1 [R=301,L] </IfModule> 3、重啟伺服器並測試
apachectl -t apachectl graceful
測試:
# curl -x192.168.0.8:80 www.abc.com -I HTTP/1.1 301 Moved Permanently Date: Tue, 25 Oct 2016 15:48:10 GMT Server: Apache/2.2.31 (Unix) PHP/5.5.38 Location: http://www.123.com/
# curl -x192.168.0.8:80 www.abcd.com -I HTTP/1.1 301 Moved Permanently Date: Tue, 25 Oct 2016 15:48:49 GMT Server: Apache/2.2.31 (Unix) PHP/5.5.38 Location: http://www.123.com/ Content-Type: text/html; charset=iso-8859-1
通過上述測試,發現無論是abc或abcd都可以跳轉到 www.123.com 網域名稱上來,通過瀏覽器訪問也一樣。
編輯新增內容如下:
ErrorLog "logs/error.log" CustomLog "logs/access.log" combined
指定了日誌存放在/usr/local/apache2/logs目錄下分別為error.log和access.log,combined為日誌顯示的格式,日誌格式可以參考設定檔httpd.conf中格式的指定,如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common 2、設定apache日誌分割
同樣編輯設定檔httpd-vhosts.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400" CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y%m%d.log 86400" combined
ErrorLog是錯誤記錄檔,CustomLog是訪問日誌。|就是管道符,意思是把產生的日誌交給rotatelog這個工具,而這個工具就是apache內建的切割日誌的工具。-l的作用是校準時區為UTC,也就是北京時間。86400,單位是秒,正好是一天,那麼日誌會每天切割一次。而最後面的combined為日誌的格式,在httpd.conf中有定義。
或者使用 mod_headers 模組實現:
<IfModule mod_headers.c> # htm,html,txt 類的檔案快取一個小時 <filesmatch "\.(html|htm|txt)$"> header set cache-control "max-age=3600" </filesmatch> # css, js, swf 類的檔案快取一個星期 <filesmatch "\.(css|js|swf)$"> header set cache-control "max-age=604800" </filesmatch> # jpg,gif,jpeg,png,ico,flv,pdf 等檔案快取一年 <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$"> header set cache-control "max-age=29030400" </filesmatch> </IfModule>
說明:這裡的時間單位可以 days、 hours 甚至是 min,兩種不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers,要想使用這些模組,必須要事先已經支援。如何查看是否支援,使用命令:
# /usr/local/apache2/bin/apachectl -M
2、重啟伺服器並驗證
apachectl -t apachectl graceful
驗證:
# curl -x127.0.0.1:80 'http://www.123.com/static/image/common/online_admin.gif' -I HTTP/1.1 200 OK Date: Wed, 26 Oct 2016 03:51:26 GMT Server: Apache/2.2.31 (Unix) PHP/5.5.38 Last-Modified: Tue, 31 May 2016 03:08:36 GMT ETag: "46891b-16b-5341ab0597500" Accept-Ranges: bytes Content-Length: 363 Cache-Control: max-age=86400 Expires: Thu, 27 Oct 2016 03:51:26 GMT Content-Type: image/gif
如果你的網站有很多漂亮的圖片,比如你網站網域名稱 www.123.com,圖片地址為 www.123.com/image/111.jpg,那麼其它人就可以直接把這個地址放到他自己的網站上,他的使用者可以直接從他網站查看這張圖片,而實際圖片是從你的網站訪問的,所產生的頻寬消耗對你沒有任何意義,應該對這些圖片限制一下,凡是在第三方網站上,嚴禁訪問你網站的圖片,如何配置呢。
1、配置防盜鏈
# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf SetEnvIfNoCase Referer "^http://.*\.123\.com" local_ref SetEnvIfNoCase Referer ".*\.abc\.com" local_ref SetEnvIfNoCase Referer "^$" local_ref <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> Order Allow,Deny Allow from env=local_ref </filesmatch>
說明:在這段配置中涉及到一個名詞referer,其實就是上次訪問的網站連結。配置referer是根據來源連結做限制的,如果來源連結不是我們想要的,就直接拒絕,這就是防盜鏈的原理。當然不止是圖片,mp3、rar、zip等檔案同樣支援。上述配置中預設是除了定義的列表中的referer,其它都拒絕。
我們的判斷依據是這樣的: 看Order後面的,哪個在前,哪個在後 如果deny在前,那麼就需要看deny from這句,然後看allow from這句 規則是一條一條匹配的,不管是deny在前還是allow在前,都會生效的。
2、舉例2
Order allow,deny deny from all allow from 127.0.0.1
這個就會deny所有了,127.0.0.1也會被deny。因為順序是先allow然後deny,雖然開始allow了127,但是後面又拒絕了它。
3、舉例3
Order allow,deny deny from all
上面的規則就表示,全部都不能通過。
4、舉例4
Order deny,allow deny from all 上面的規則表示,全部都不能通。 Order deny,allow 只有順序,沒有具體規則,表示全部都可以通行(預設的),因為allow在最後了。 Order allow,deny 這個表示,全部都不能通行(預設的),因為deny在最後。
5、針對某個目錄限制
比如這個目錄很重要,只允許我們公司的IP訪問,當然這個目錄可以是網站根目錄,也就是整個網站。
<Directory /usr/local/apache2/htdocs> Order deny,allow Deny from all Allow from 127.0.0.1 </Directory>
6、針對請求的URL去限制
<filesmatch "(.*)admin(.*)"> Order deny,allow Deny from all Allow from 127.0.0.1 </filesmatch>
這裡用到了filesmatch文法,表示匹配的意思。
7、驗證
# curl -x192.168.0.8:80 www.123.com/admin.php -I HTTP/1.1 403 Forbidden Date: Wed, 26 Oct 2016 06:24:54 GMT Server: Apache/2.2.31 (Unix) PHP/5.5.38 Content-Type: text/html; charset=iso-8859-1
# curl -x127.0.0.1:80 www.123.com/admin.php -I HTTP/1.1 401 Authorization Required Date: Wed, 26 Oct 2016 06:25:03 GMT Server: Apache/2.2.31 (Unix) PHP/5.5.38 WWW-Authenticate: Basic realm="Please input you acount." Content-Type: text/html; charset=iso-8859-1
十、禁止解析PHP
某個目錄下禁止解析PHP,這個很有作用,我們做網站安全的時候,這個用的很多,比如某些目錄可以上傳檔案,為了避免上傳的檔案有木馬,所以我們禁止這個目錄下面的訪問解析PHP。
1、配置禁止解析php
<Directory /usr/local/apache2/htdocs/data> php_admin_flag engine off <filesmatch "(.*)php"> Order deny,allow Deny from all </filesmatch> </Directory>
說明:php_admin_flag engine off這個語句就是禁止解析php的控制語句,但只這樣配置還不夠,因為這樣配置後使用者依然可以訪問php檔案,只不過不解析了,但可以下載,使用者下載php檔案也是不合適的,所以有必要再禁止一下。
我們可以allow和deny去現在網站根目錄下的某個子目錄,當然這個rewrite也可以實現,配置如下:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} ^.*/tmp/* [NC] RewriteRule .* - [F] </IfModule> 這段配置,會把只要是包含 /tmp/ 字樣的請求都限制了。
此為張大神原創,轉載請自覺註明:
轉載請註明來自張辰雲的個人網站-雲編碼Note,本文地址:http://www.itzcy.com/blog/1299.html
除非註明,張辰雲的個人網站-雲編碼Note文章均為原創,轉載請註明出處和連結。
轉載請註明來自 張辰雲的個人網站-雲編碼Note ,本文地址: http://www.itzcy.com/blog/1299.html
除非註明,張辰雲的個人網站-雲編碼Note文章均為原創,轉載請註明出處和連結。