Linux 筆記 - 第十四章 LAMP 之(二) 環境配置

博客地址:http://www.moonxy.comjavascript

1、前言php

LAMP 環境搭建好以後,其實僅僅是安裝上了軟件,咱們還須要掌握 httpd 和 PHP 的配置。css

2、httpd 配置html

2.1 建立虛擬主機java

咱們以搭建 discuz 論壇爲例,介紹如何在 Apache 中建立虛擬主機。mysql

下載 discuz 論壇建站程序包以後,解壓到指定目錄,並刪掉無用的文件及目錄。linux

# mkdir /data/www
# cp ComsenzDiscuz-DiscuzX-3.4.zip /data/www/
# cd /data/www
# unzip ComsenzDiscuz-DiscuzX-3.4.zip
# rm -rf ComsenzDiscuz-DiscuzX-3.4.zip
# cd DiscuzX
# rm -rf readme utility README.md
# mv upload/* .
# rm -rf upload

編輯 httpd 的主配置文件:/usr/local/apache24/conf/httpd.conf程序員

去掉#號,修改成:web

保存後,編輯虛擬主機配置文件:/usr/local/apache24/conf/extra/httpd-vhosts.conf,其中 ServerAdmin 爲服務器管理員的郵箱;DocumentRoot爲虛擬主機站點的根目錄;ServerName 爲網站的域名,只能定義一個;ServerAlias 爲域名的別名,能夠寫多個,用分號分隔;ErrorLog 爲站點的錯誤日誌,Customer 爲站點的訪問日誌。sql

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/www/DiscuzX"
    ServerName www.lamper.com
    ServerAlias lamper.com
    ErrorLog "logs/www.lamper.com-error_log"
    CustomLog "logs/www.lamper.com-access_log" common
</VirtualHost>

在啓動狀態中,能夠從新加載 httpd,命令以下:

# apachectl graceful

若是咱們在 Windows 中訪問咱們 Linux 服務器中搭建的 LAMP 應用,能夠修改 hosts 文件來自定義域名解析映射,以下:

C:\Windows\System32\drivers\etc\hosts 文件中添加以下映射:

192.168.1.121 www.lamper.com

而後在瀏覽器中訪問:

http://www.lamper.com

自動跳轉到discuz安裝頁面:

點擊 "我贊成"

發現目錄、文件權限檢查不符合所需狀態,查看 apache 運行進程所屬用戶爲 daemon,以下:

修改上面列出的不符合權限的目錄所屬主爲 daemon,以下:

# chown -R daemon config data uc_client uc_server

修改後,再次刷新剛纔的安裝頁面:

發現已經知足所需的權限了。

點擊 "下一步" 後進入:

選擇 "全新安裝",點擊下一步進入安裝數據庫的頁面。

此時,咱們先建立數據庫和用戶:

[root@ryan DiscuzX]# mysql -uroot -p123456
mysql> create database discuz;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on discuz.* to 'rain'@'localhost' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> quit
Bye

注意:當數據庫存在用戶的時候 GRANT 會對用戶進行受權,但當數據庫不存在該用戶的時候,就會建立相應的用戶並進行受權。

填入咱們建立的數據庫和用戶:

點擊下一步,進入初始化過程當中:

初始化完成以後,自動跳入結果頁面:

返回咱們搭建的輪胎:

2.2 添加用戶認證

首先建立密碼文件:

[root@ryan extra]# /usr/local/apache24/bin/htpasswd -cm /data/.htpasswd admin
New password:
Re-type new password:
Adding password for user admin

其中 /data/.htpasswd 文件爲要建立的密碼文件,可自定義路徑;htpasswd 命令爲建立用戶的工具,-c 表示 create 建立,-m 表示使用 MD5 加密方式(默認加密方式),若是是第一次建立時須要使用 -c 選項,第二次時就不須要添加 -c 選項了,不然 /data/.htpasswd 會被覆蓋,其他選項能夠經過幫助:# /usr/local/apache24/bin/htpasswd --help

[root@ryan extra]# /usr/local/apache24/bin/htpasswd --help
Usage:
        htpasswd [-cimBdpsDv] [-C cost] passwordfile username
        htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password

        htpasswd -n[imBdps] [-C cost] username
        htpasswd -nb[mBdps] [-C cost] username password
 -c  Create a new file.
 -n  Don't update file; display results on stdout.
 -b  Use the password from the command line rather than prompting for it.
 -i  Read password from stdin without verification (for script usage).
 -m  Force MD5 encryption of the password (default).
 -B  Force bcrypt encryption of the password (very secure).
 -C  Set the computing time used for the bcrypt algorithm
     (higher is more secure but slower, default: 5, valid: 4 to 31).
 -d  Force CRYPT encryption of the password (8 chars max, insecure).
 -s  Force SHA encryption of the password (insecure).
 -p  Do not encrypt the password (plaintext, insecure).
 -D  Delete the specified user.
 -v  Verify password for the specified user.
On other systems than Windows and NetWare the '-p' flag will probably not work.
The SHA algorithm does not use a salt and is less secure than the MD5 algorithm.

而後在虛擬主機中添加用戶認證,能夠添加 Directory,表示指定認證的目錄信息:

對目錄進行用戶認證

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/www/DiscuzX"
    ServerName www.lamper.com
    ServerAlias lamper.com
    ErrorLog "logs/www.lamper.com-error_log"
    CustomLog "logs/www.lamper.com-access_log" common
    <Directory "/data/www/DiscuzX">
        AllowOverride AuthConfig
        AuthName "lamper.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>
</VirtualHost>

其中 Directory 爲指定認證的目錄,AllowOverride AuthConfig 至關於打開認證的開關, AuthName 自定義認證的名字,AuthType 爲認證類型,AuthUserFile 指定密碼文件所在位置,require valid-user 說明須要有效的認證用戶。

保存後檢查配置文件語法正確性並從新加載配置文件:

[root@ryan extra]# apachectl -t
Syntax OK
[root@ryan extra]# apachectl graceful

而後訪問 http://www.lamper.com 時,瀏覽器會彈出對話框進行用戶身份驗證:

點擊取消後,瀏覽器會提示 401 Unauthorized:

上面添加的配置是對整個站點添加的用戶認證,其實用的最多的仍是對某個目錄或文件進行認證。

對文件進行用戶認證

好比對文件認證,在 VirtualHost 中添加 FileMath 以下:

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/www/DiscuzX"
    ServerName www.lamper.com
    ServerAlias lamper.com
    ErrorLog "logs/www.lamper.com-error_log"
    CustomLog "logs/www.lamper.com-access_log" common
    <FilesMatch "admin.php">
        AllowOverride AuthConfig
        AuthName "lamper.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd # 基於用戶的
        # AuthGroupFile /data/.htgpasswd    # 基於組的
        # Require user csr      # 只容許csr用戶認證
        Require valid-user  容許有效用戶認證
        # Require group group-csr   容許group-csr組認證
    </FilesMatch>
</VirtualHost>

注意:FilesMatch 後面的文件是相對路徑,而 Files、Directory則使用絕對路徑。

也能夠將 Directory 中的目錄認證直接改成文件據對路徑,以下:

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/www/DiscuzX"
    ServerName www.lamper.com
    ServerAlias lamper.com
    ErrorLog "logs/www.lamper.com-error_log"
    CustomLog "logs/www.lamper.com-access_log" common
    <Directory "/data/www/DiscuzX/admin.php">
        AllowOverride AuthConfig
        AuthName "lamper.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>
</VirtualHost>

驗證和重載配置文件:

[root@ryan extra]# apachectl -t
Syntax OK
[root@ryan extra]# apachectl graceful

這樣可使只有咱們訪問管理員登陸頁時:http://www.lamper.com/admin.php 纔出現用戶認證,訪問其餘頁面則不會出現用戶認證對話框。

2.3 域名 rewrite 重定向

因爲實現域名重定向須要rewrite模塊支持,首先查找httpd是否已經加載該模塊:

[root@ryan conf]# grep -i rewrite /usr/local/apache24/conf/httpd.conf
#LoadModule rewrite_module modules/mod_rewrite.so

若是沒有加載,則將其前面的#號刪除,以下:

[root@ryan conf]# vim /usr/local/apache24/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so

而後在 httpd-vhosts.conf 的 VirtualHost 中添加 rewrite 模塊:

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.amlinux.com$
    RewriteRule ^/(.*)$ http://www.lamper.com/$1 [R=301,L]
</IfModule>

此處將 www.amlinux.com 重定向到 www.lamper.com。

修改 Windows 中的 hosts 文件:

C:\Windows\System32\drivers\etc\hosts

添加以下域名映射,注意同一個IP能夠對應多個域名,多個域名之間用空格分隔,以下:

192.168.1.121 www.lamper.com www.amlinux.com

而後驗證域名重定向:

當在瀏覽器中輸入 http://www.amlinux.com 後會從新跳轉到 http://www.lamper.com;輸入 http://www.amlinux.com/123.html 後瀏覽器會跳轉到 http://www.lamper.com/123.html。

若是須要將多個域名重定向到一個域名,則配置多個 RewriteCond 並用 OR 鏈接,能夠將每個 RewriteCond 看作一個條件表達式,知足這個條件時才執行下面的 RewriteRule 表達式。

多域名重定向,以下:

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.amlinux.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www.moonxy.com$
    RewriteRule ^/(.*)$ http://www.lamper.com/$1 [R=301,L]
</IfModule>

此處將 www.amlinux.com 和 www.moonxy.com 均重定向到 www.lamper.com。

若是使用的是 360 安全瀏覽器,發現會出現域名重定向的提示:

查看 http 請求和響應信息:

狀態碼爲 301,跳轉後的網址 Location: http://www.lamper.com,L 表示 last,意思是跳轉一次就結束。

注意:

域名重定向最經常使用到的是 301 和 302 這兩個 http 狀態碼,301 重定向和 302 重定向的區別:

301 重定向是永久的重定向,搜索引擎在抓取新的內容的同時也將舊的網址替換爲了重定向以後的網址。

302重定向只是臨時的重定向,搜索引擎會抓取新的內容而保留舊的地址,由於服務器返回 302,因此,搜索搜索引擎認爲新的網址是暫時的。302 又叫 redirect。

2.4 配置訪問日誌

系統的訪問日誌能夠記錄網站的訪問狀況,還能夠在網站出現異常發生時幫助咱們定位問題。

要配置 httpd 的訪問日誌,首先須要在主配置文件中定義訪問日誌的格式,打開 httpd 的主配置文件:

/usr/local/apache24/conf/httpd.conf

[root@ryan conf]# grep -i LogFormat /usr/local/apache24/conf/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
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

能夠看到httpd已經提供了兩種格式,combined 和common 分別至關於對應格式的引用名稱,當讓也能夠自定義日誌格式和引用名稱。要使用第三種格式 combinedio,則必須啓用 mod_logio.c 模塊。

參數說明:

%a 遠端IP地址
%A 本機IP地址
%B 除HTTP頭之外傳送的字節數
%b 以CLF格式顯示的除HTTP頭之外傳送的字節數,也就是當沒有字節傳送時顯示’-'而不是0。
%{Foobar}C 在請求中傳送給服務端的cookieFoobar的內容。
%D 服務器處理本請求所用時間,以微爲單位。
%{FOOBAR}e 環境變量FOOBAR的值
%f 文件名
%h 遠端主機
%H 請求使用的協議
%{Foobar}i 發送到服務器的請求頭Foobar:的內容。
%l 遠端登陸名(由identd而來,若是支持的話),除非IdentityCheck設爲"On",不然將獲得一個"-"%m 請求的方法
%{Foobar}n 來自另外一個模塊的註解Foobar的內容。
%{Foobar}o 應答頭Foobar:的內容。
%p 服務器服務於該請求的標準端口。
%P 爲本請求提供服務的子進程的PID。
%{format}P 服務於該請求的PID或TID(線程ID),format的取值範圍爲:pid和tid(2.0.46及之後版本)以及hextid(須要APR1.2.0及以上版本)
%q 查詢字符串(若存在則由一個"?"引導,不然返回空串)
%r 請求的第一行
%s 狀態。對於內部重定向的請求,這個狀態指的是原始請求的狀態,—%>s則指的是最後請求的狀態。
%t 時間,用普通日誌時間格式(標準英語格式)
%{format}t 時間,用strftime(3)指定的格式表示的時間。(默認狀況下按本地化格式)
%T 處理完請求所花時間,以秒爲單位。
%u 遠程用戶名(根據驗證信息而來;若是返回status(%s)爲401,多是假的)
%U 請求的URL路徑,不包含查詢字符串。
%v 對該請求提供服務的標準ServerName。
%V 根據UseCanonicalName指令設定的服務器名稱。
%X 請求完成時的鏈接狀態:X= 鏈接在應答完成前中斷。
+= 應答傳送完後繼續保持鏈接。
-= 應答傳送完後關閉鏈接。

(在1.3之後的版本中,這個指令是%c,但這樣就和過去的SSL語法:%{var}c衝突了)
%I 接收的字節數,包括請求頭的數據,而且不能爲零。要使用這個指令你必須啓用mod_logio模塊。
%O 發送的字節數,包括請求頭的數據,而且不能爲零。要使用這個指令你必須啓用mod_logio模塊。

修飾符
能夠緊跟在"%"後面加上一個逗號分隔的狀態碼列表來限制記錄的條目。例如,"%400,501{User-agent}i" 只記錄狀態碼400和501發生時的User-agent頭內容;不知足條件時用"-"代替。狀態碼前還能夠加上"!"前綴表示否 定,"%!200,304,302{Referer}i"記錄全部不一樣於200,304,302的狀態碼發生時的Referer頭內容。

"<"">"修飾符能夠用來指定對於已被內部重定向的請求是選擇原始的請求仍是選擇最終的請求。默認狀況下,%s, %U, %T, %D, %r 使用原始請求,而全部其餘格式串則選擇最終請求。例如,%>s 能夠用於記錄請求的最終狀態,而 %<u 則記錄一個已經被內部重定向到非認證資源的請求的原始認證用戶。

繼續編輯虛擬主機配置文件

/usr/local/apache24/conf/extra/httpd-vhosts.conf

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/www/DiscuzX"
    ServerName www.lamper.com
    ServerAlias lamper.com
    ErrorLog "logs/www.lamper.com-error_log"
    CustomLog "logs/www.lamper.com-access_log" combined <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.amlinux.com$
        RewriteRule ^/(.*)$ http://www.lamper.com/$1 [R=301,L]
    </IfModule>
    <Directory "/data/www/DiscuzX/admin.php">
        AllowOverride AuthConfig
        AuthName "lamper.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>
</VirtualHost>

咱們將系統默認的 common 格式修改成 combined,這樣記錄的信息會更全面一些。

保存以後,咱們驗證一下:

[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# curl -x127.0.0.1:80 -I www.lamper.com
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 05:31:10 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
X-Powered-By: PHP/7.2.8
Set-Cookie: P6bY_2132_saltkey=ZCE7eKcE; expires=Mon, 27-Aug-2018 05:31:10 GMT; Max-Age=2592000; path=/; HttpOnly
Set-Cookie: P6bY_2132_lastvisit=1532752270; expires=Mon, 27-Aug-2018 05:31:10 GMT; Max-Age=2592000; path=/
Set-Cookie: P6bY_2132_sid=PCAWeC; expires=Sun, 29-Jul-2018 05:31:10 GMT; Max-Age=86400; path=/
Set-Cookie: P6bY_2132_lastact=1532755870%09index.php%09; expires=Sun, 29-Jul-2018 05:31:10 GMT; Max-Age=86400; path=/
Set-Cookie: P6bY_2132_onlineusernum=1; expires=Sat, 28-Jul-2018 05:36:10 GMT; Max-Age=300; path=/
Set-Cookie: P6bY_2132_sid=PCAWeC; expires=Sun, 29-Jul-2018 05:31:10 GMT; Max-Age=86400; path=/
Content-Type: text/html; charset=utf-8

[root@ryan conf]# tail /usr/local/apache24/logs/www.lamper.com-access_log
192.168.1.101 - - [28/Jul/2018:13:01:48 +0800] "GET /static/image/admincp/btn_block.gif HTTP/1.1" 200 3484
192.168.1.101 - - [28/Jul/2018:13:01:48 +0800] "GET /static/image/admincp/logo.gif HTTP/1.1" 200 3403
192.168.1.101 - - [28/Jul/2018:13:01:48 +0800] "GET /static/image/admincp/bg_repx_h.gif HTTP/1.1" 200 4028
192.168.1.101 - admin [28/Jul/2018:13:01:48 +0800] "GET /admin.php?action=index HTTP/1.1" 200 40
192.168.1.101 - - [28/Jul/2018:13:01:49 +0800] "GET /static/image/admincp/logo_hover.gif HTTP/1.1" 200 4100
192.168.1.101 - admin [28/Jul/2018:13:01:51 +0800] "GET /admin.php?action=setting&operation=basic HTTP/1.1" 200 7635
192.168.1.101 - - [28/Jul/2018:13:01:51 +0800] "GET /static/image/admincp/bg_repx_hc.gif HTTP/1.1" 200 259
192.168.1.101 - admin [28/Jul/2018:13:01:53 +0800] "GET /admin.php?action=nav HTTP/1.1" 200 7006
192.168.1.101 - - [28/Jul/2018:13:01:53 +0800] "GET /static/image/admincp/btn_block_3.gif HTTP/1.1" 200 375
127.0.0.1 - - [28/Jul/2018:13:31:10 +0800] "HEAD http://www.lamper.com/ HTTP/1.1" 200 - "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

能夠發現最後一行的日誌信息是修改日誌格式後產生的。

curl 命令

curl 命令能夠用來執行下載、發送各類HTTP請求,指定 HTTP 頭部等操做。若是系統沒有 curl 可使用 yum install curl 安裝,也能夠下載安裝。curl 是將下載文件輸出到 stdout,將進度信息輸出到 stderr,不顯示進度信息使用 --silent 選項。

上面使用到了 -x 選項能夠爲 CURL 添加代理功能,如:

1 # 指定代理主機和端口
2 curl -x proxysever.test.com:3128 http://google.co.in

-I/--head 表示只顯示請求頭信息,如:

curl -I http://www.lamper.com

-e/--referer 表示來源網址,能夠用來僞造 referer(盜鏈)

不少服務器會檢查http訪問的referer從而來控制訪問。好比:你是先訪問首頁,而後再訪問首頁中的郵箱頁面,這裏訪問郵箱的referer地址就是訪問首頁成功後的頁面地址,若是服務器發現對郵箱頁面訪問的referer地址不是首頁的地址,就判定那是個盜連了

curl 中內置 option:-e可讓咱們設定referer,以下:

curl -e "http://www.amlinux.com" http://www.lamper.com

日誌過濾掉靜態文件

一個網站會有不少文件,其中就包括不少的圖片、js、css 等靜態文件,用戶每請求一個頁面就會訪問這些靜態元素,可是這些靜態元素在日誌裏面存在的意義不大,爲了防止日誌文件過大,咱們須要在記錄日誌時過濾掉這些靜態文件,且須要敬日誌按天歸檔,一天一個日誌。

修改虛擬主機配置文件:/usr/local/apache24/conf/extra/httpd-vhosts.conf

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/data/www/DiscuzX"
    ServerName www.lamper.com
    ServerAlias lamper.com
    ErrorLog "logs/www.lamper.com-error_log" 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
    CustomLog "logs/www.lamper.com-access_log" combined env=!image-request <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.amlinux.com$
        RewriteRule ^/(.*)$ http://www.lamper.com/$1 [R=301,L]
    </IfModule>
    <Directory "/data/www/DiscuzX/admin.php">
        AllowOverride AuthConfig
        AuthName "lamper.com user auth"
        AuthType Basic
        AuthUserFile /data/.htpasswd
        require valid-user
    </Directory>
</VirtualHost>

如上,先添加一個 image-request 環境變量,把 gif、jpg、png、bmp、swf、js 和 css 等格式的文件所有歸類到 image-request 裏,後面的 env=!image-request 用到了一個 "!" 表示取反,意思是隻將 image-requset 之外的類型文件記錄到日誌裏。

若是想將日誌按天歸檔,可修改 CustomLog 爲:

CustomLog "|/usr/local/apache24/bin/rotatelogs -l logs/www.lamper.com-access_%Y%m%d.log 86400" combined env=!image-request

正常 CustomLog 後面爲日誌文件名,可是這裏使用一個管道,它會把日誌內容交給後面的 rotatelogs(apache 自帶的日誌切割工具)命令處理,它會把訪問日誌按照咱們定義的文件名進行切割,86400 單位爲秒,至關於一天。

保存以後驗證日誌:

[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# curl -x127.0.0.1:80 -I www.lamper.com
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 06:15:24 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
X-Powered-By: PHP/7.2.8
Set-Cookie: P6bY_2132_saltkey=o77ZVSKV; expires=Mon, 27-Aug-2018 06:15:24 GMT; Max-Age=2592000; path=/; HttpOnly
Set-Cookie: P6bY_2132_lastvisit=1532754924; expires=Mon, 27-Aug-2018 06:15:24 GMT; Max-Age=2592000; path=/
Set-Cookie: P6bY_2132_sid=jWISSI; expires=Sun, 29-Jul-2018 06:15:24 GMT; Max-Age=86400; path=/
Set-Cookie: P6bY_2132_lastact=1532758524%09index.php%09; expires=Sun, 29-Jul-2018 06:15:24 GMT; Max-Age=86400; path=/
Set-Cookie: P6bY_2132_onlineusernum=1; expires=Sat, 28-Jul-2018 06:20:24 GMT; Max-Age=300; path=/
Set-Cookie: P6bY_2132_sid=jWISSI; expires=Sun, 29-Jul-2018 06:15:24 GMT; Max-Age=86400; path=/
Content-Type: text/html; charset=utf-8

[root@ryan conf]# ll /usr/local/apache24/logs
total 120
-rw-r--r-- 1 root root   974 Jul 21 16:34 access_log
-rw-r--r-- 1 root root  7467 Jul 28 14:14 error_log
-rw-r--r-- 1 root root     5 Jul 28 14:14 httpd.pid
-rw-r--r-- 1 root root   203 Jul 28 14:15 www.lamper.com-access_20180728.log -rw-r--r-- 1 root root 93717 Jul 28 13:31 www.lamper.com-access_log
-rw-r--r-- 1 root root   184 Jul 24 22:06 www.lamper.com-error_log

能夠看到新生成的日誌已經帶了日期戳:www.lamper.com-access_20180728.log,並且之後會天天生成一個按日期命名的日誌文件。咱們能夠再添加一個定時任務,將日期間隔大於兩個月的日誌,按期清理掉,達到釋放磁盤的目的。

再來驗證靜態文件是否已通過濾:

[root@ryan conf]# touch /data/www/DiscuzX/ryan.jpg
[root@ryan conf]# touch /data/www/DiscuzX/ryan.txt
[root@ryan conf]# curl -x127.0.0.1:80 www.lamper.com/ryan.jpg
[root@ryan conf]# curl -x127.0.0.1:80 www.lamper.com/ryan.txt
[root@ryan conf]# cat /usr/local/apache24/logs/www.lamper.com-access_20180728.log
127.0.0.1 - - [28/Jul/2018:14:15:24 +0800] "HEAD http://www.lamper.com/ HTTP/1.1" 200 - "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
127.0.0.1 - - [28/Jul/2018:14:21:55 +0800] "GET http://www.lamper.com/ryan.txt HTTP/1.1" 200 - "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

在日誌中只能看到請求 ryan.txt的日誌記錄,而看不到請求ryan.jpg的請求日誌,表示日誌已通過濾掉了靜態元素。

2.5 配置靜態元素過時時間

若是咱們仔細查看日誌文件,會發現存在狀態碼爲304的日誌記錄,這個狀態碼錶示該文件已經緩存到了用戶的電腦裏了,再次請求服務器的時候,再也不下載,而是直接從用戶的電腦緩存裏面讀取。這樣能夠提高用戶訪問網站的速度,且下降服務器的資源消耗。

若是服務器上面某個圖片已經更改,那就須要訪問新的圖片,這就涉及到靜態文件緩存時長的問題,也稱做 "緩存過時時間"。

配置緩存過時時間須要使用到 mod_expires 模塊,首先檢查當前 httpd 是否支持 expires 模塊:

[root@ryan conf]# /usr/local/apache24/bin/apachectl -M|grep -i expires

沒有任何輸出表示當前httpd並不支持expires模塊,須要手動開啓,以下:

[root@ryan conf]# vim /usr/local/apache24/conf/httpd.conf
//去掉前面的#註釋,開啓 expires 模塊
LoadModule expires_module modules/mod_expires.so
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# /usr/local/apache24/bin/apachectl -M|grep -i expires
 expires_module (shared)

有上面的輸出,表示已經正確加載了 expires 模塊。

打開虛擬主機配置文件:/usr/local/apache24/conf/extra/httpd-vhosts.conf

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<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/x-shockwave-flash "now plus 2 hours"
    ExpiresDefault "now plus 0 min"
</IfModule>

說明:

ExpiresActive on 表示開啓過時時間功能。"access plus 1 days" 意指瀏覽時起算1天。依照 Apache 官方說明文件,過時起算時間有三種,分別是 access、now 以及 modification。其中 access 與 now 意義相同,而 modification 指的是網頁文件的 "最後編輯時間"。因此若是要以文檔的最後編輯時間起算,能夠寫成這樣:"modification plus 1 days"。而時間的指定也很簡單,就是英文單詞(years、months、weeks、days、hours、minutes、seconds)。例如,能夠寫成這樣:"access plus 1 month 15 days 2 hours"。

驗證元素過時時間

[root@ryan conf]# curl -x127.0.0.1:80 -I 'http://www.lamper.com/static/image/common/logo.png'
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 07:45:03 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Mon, 04 Jun 2018 10:16:47 GMT
ETag: "1149-56dce3b2c41c0"
Accept-Ranges: bytes
Content-Length: 4425
Content-Type: image/png

[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# curl -x127.0.0.1:80 -I 'http://www.lamper.com/static/image/common/logo.png'
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 07:45:58 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Mon, 04 Jun 2018 10:16:47 GMT
ETag: "1149-56dce3b2c41c0"
Accept-Ranges: bytes
Content-Length: 4425 Cache-Control: max-age=86400 Expires: Sun, 29 Jul 2018 07:45:58 GMT
Content-Type: image/png

能夠看到修改後比修改前多了 max-age 等頭信息,一樣,86400單位爲秒,表示一天,與上面的設置: ExpiresByType image/png "access plus 24 hours" 保持一致,表示設置成功,一般能夠設置過時日期爲 30 天。

2.6 配置防盜鏈

經過防盜鏈的方式,能夠設置限制第三方的站點經過引用的方式獲取服務器上的圖片,數據等,若是想要獲取本站點的圖片數據,只能經過本站點訪問獲取,這樣也有效的減小了服務器的資源。

配置防盜鏈以前,須要瞭解什麼是 referer?

HTTP Referer是 request header 的一部分,當瀏覽器向 web 服務器發送請求的時候,通常會帶上 Referer,告訴服務器我是從哪一個頁面連接過來的,服務器基此能夠得到一些信息用於處理。

好比:在A網站的某個頁面 http://aaa.com/a.html 裏面的連接去訪問B網站的某個頁面 http://bbb.com/b.html,那麼 B 網站的 reffer 就是http://aaa.com/a.html。

編輯虛擬主機配置文件,添加防盜鏈規則:

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<Directory "/data/www/DiscuzX">
    SetEnvIfNoCase Referer "http://www.lamper.com" local_ref
    SetEnvIfNoCase Referer "http://lamper.com" local_ref
    SetEnvIfNoCase Referer "^$" local_ref
    <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
        Order Allow,Deny
        Allow from env=local_ref
</FilesMatch>
</Directory>

首先定義容許訪問連接的 referer,其中 ^$ 爲空 refer,當直接在瀏覽器中輸入圖片們地址去訪問它時,他的 referer 就爲空。而後使用 FileMatch 來定義須要保護的文件類型,訪問 txt、doc、mp三、zip、rar、jpg、gif、png 等格式的文件,當訪問這樣類型的文件時就會運用防盜鏈規則。

驗證防盜鏈

[root@ryan conf]# curl -x 127.0.0.1:80 -I -e "http://www.amlinux.com" http://www.lamper.com/static/image/common/logo.png
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 09:26:31 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Mon, 04 Jun 2018 10:16:47 GMT
ETag: "1149-56dce3b2c41c0"
Accept-Ranges: bytes
Content-Length: 4425
Cache-Control: max-age=86400
Expires: Sun, 29 Jul 2018 09:26:31 GMT
Content-Type: image/png

[root@ryan conf]# /usr/local/apache24//bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24//bin/apachectl graceful
[root@ryan conf]# curl -x 127.0.0.1:80 -I -e "http://www.amlinux.com" http://www.lamper.com/static/image/common/logo.png
HTTP/1.1 403 Forbidden
Date: Sat, 28 Jul 2018 09:29:24 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Content-Type: text/html; charset=iso-8859-1

對比配置文件生效先後,請求同一個 png 圖片的請求結果,發現已經生效,狀態碼 403 Forbidden,表示禁止訪問某些資源。-e 來定義 referer,這個 referer 建議以 http:// 開頭,不然可能致使不生效。

[root@ryan conf]# curl -x 127.0.0.1:80 -I -e "http://www.amlinux.com" http://www.lamper.com/rayn.jpg
HTTP/1.1 403 Forbidden
Date: Sat, 28 Jul 2018 09:39:47 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Content-Type: text/html; charset=iso-8859-1

[root@ryan conf]# curl -x 127.0.0.1:80 -I -e "http://www.amlinux.com" http://www.lamper.com/rayn.txt
HTTP/1.1 403 Forbidden
Date: Sat, 28 Jul 2018 09:39:56 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Content-Type: text/html; charset=iso-8859-1

[root@ryan conf]# touch /data/www/DiscuzX/rayn.html
[root@ryan conf]# curl -x 127.0.0.1:80 -I -e "http://www.amlinux.com" http://www.lamper.com/rayn.html
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 09:40:38 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Sat, 28 Jul 2018 09:40:27 GMT
ETag: "0-5720c04b33a19"
Accept-Ranges: bytes
Cache-Control: max-age=0
Expires: Sat, 28 Jul 2018 09:40:38 GMT
Content-Type: text/html

對於不是上面限制的格式,好比 .html,能夠正常訪問,沒有運用防盜鏈規則。

2.7 訪問控制

對於一些比較重要的網站內容,除了可使用用戶認證限制訪問以外,還能夠經過其餘一些方法作到限制,好比能夠限制 IP,也能夠限制 user_agent。限制 IP 指的是限制訪問網站的來源IP,而限制 user_agent,一般用來限制惡意或者不正常的請求。

通常凡是涉及網站後臺的訪問都要作 IP 限制,只容許公司內網IP或者被信任的公司IP訪問。這樣就能夠防止別有用心的人拿到網站後臺權限,並得到數據。

首先限制IP訪問,編輯虛擬機主機配置文件,以下:

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
<Directory "/data/wwww/DiscuzX/admin/">
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Directory>

使用 <Directory> 來指定要限制訪問的目錄,Order 定義控制順序,哪一個在前面就先匹配哪一個規則。本例中 deny 在前,因此先匹配 Deny from all,表示全部的IP都會被限制,而後匹配 Allow from 127.0.0.1,這樣只容許127.0.0.1 這個 IP 訪問目錄: /data/wwww/DiscuzX/admin/,因此最終也只有 127.0.0.1 才能訪問 /data/wwww/DiscuzX/admin/。

驗證訪問控制:

[root@ryan conf]# mkdir /data/www/DiscuzX/admin
[root@ryan conf]# echo "admin" > /data/www/DiscuzX/admin/index.html
[root@ryan conf]# curl -x 192.168.1.121:80 -I  http://www.lamper.com/admin/index.html
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 11:23:44 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Sat, 28 Jul 2018 11:23:01 GMT
ETag: "6-5720d737d5bf5"
Accept-Ranges: bytes
Content-Length: 6
Cache-Control: max-age=0
Expires: Sat, 28 Jul 2018 11:23:44 GMT
Content-Type: text/html

[root@ryan conf]# curl -x 127.0.0.1:80 -I  http://www.lamper.com/admin/index.html
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 11:24:01 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Sat, 28 Jul 2018 11:23:01 GMT
ETag: "6-5720d737d5bf5"
Accept-Ranges: bytes
Content-Length: 6
Cache-Control: max-age=0
Expires: Sat, 28 Jul 2018 11:24:01 GMT
Content-Type: text/html

[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# curl -x 192.168.1.121:80 -I  http://www.lamper.com/admin/index.html
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 11:24:55 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Sat, 28 Jul 2018 11:23:01 GMT
ETag: "6-5720d737d5bf5"
Accept-Ranges: bytes
Content-Length: 6
Cache-Control: max-age=0
Expires: Sat, 28 Jul 2018 11:24:55 GMT
Content-Type: text/html

[root@ryan conf]# curl -x 127.0.0.1:80 -I  http://www.lamper.com/admin/index.html
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 11:25:05 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Sat, 28 Jul 2018 11:23:01 GMT
ETag: "6-5720d737d5bf5"
Accept-Ranges: bytes
Content-Length: 6
Cache-Control: max-age=0
Expires: Sat, 28 Jul 2018 11:25:05 GMT
Content-Type: text/html

[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# curl -x 192.168.1.121:80 -I  http://www.lamper.com/admin/index.html
HTTP/1.1 403 Forbidden
Date: Sat, 28 Jul 2018 11:30:43 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Content-Type: text/html; charset=iso-8859-1

[root@ryan conf]# curl -x 127.0.0.1:80 -I  http://www.lamper.com/admin/index.html
HTTP/1.1 200 OK
Date: Sat, 28 Jul 2018 11:30:51 GMT
Server: Apache/2.4.34 (Unix) PHP/7.2.8
Last-Modified: Sat, 28 Jul 2018 11:23:01 GMT
ETag: "6-5720d737d5bf5"
Accept-Ranges: bytes
Content-Length: 6
Cache-Control: max-age=0
Expires: Sat, 28 Jul 2018 11:30:51 GMT
Content-Type: text/html

修改前用 Windows 的瀏覽器訪問:

修改後用 Windows 的瀏覽器訪問:

也能夠針對單個文件來作限制

<Directory "/data/www/DiscuzX">
    <FilesMatch "admin.php(.*)">
        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
</Directory>

禁止某些目錄解析PHP代碼

有些 PHP 網站運行上傳文件,若是某些黑客上傳了一個用PHP寫的木馬,因爲網站能夠執行PHP代碼,這樣就可能致使黑客拿到服務器權限,爲了不此類狀況發送,咱們須要把能上傳文件的目錄禁止解析 PHP代碼。

編輯虛擬主機配置文件,以下:

#禁止解析某些目錄的PHP代碼
<Directory "/data/www/DiscuzX/upload/">
    php_admin_flag engine off
</Directory>

驗證過程以下:

[root@ryan conf]# mkdir /data/www/DiscuzX/upload
[root@ryan conf]# cp /usr/local/apache24/htdocs/test.php /data/www/DiscuzX/upload/
[root@ryan conf]# ll /data/www/DiscuzX/upload
total 4
-rw-r--r-- 1 root root 29 Jul 28 19:58 test.php
[root@ryan conf]# curl -x127.0.0.1:80 www.lamper.com/upload/test.php
個人LAMP
[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful
[root@ryan conf]# curl -x127.0.0.1:80 www.lamper.com/upload/test.php
<?php
        echo "個人LAMP";
?>

說明 upload 目錄下的 test.php 已經不能正常解析了。

限制 user_agent

user_agent 爲瀏覽器標識,當咱們用 Chrome 瀏覽器訪問網站時,user_agent 爲 "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",firefox 瀏覽器訪問時的user_agent 爲 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0",IE 瀏覽器訪問時的 user_agent 爲 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)",一般能夠針對一些惡意網絡爬蟲來作 user_agent 限制。

修改虛擬主機配置文件,以下:

[root@ryan conf]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
#限制某些USER_AGENT訪問網站
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_USER_AGENT} .*Firefox.* [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} .*Chrome.* [NC]
    RewriteRule .* - [F]
</IfModule>

這裏也使用到了 rewrite 模塊,%{HTTP_USER_AGENT} 爲user_agent 的內置變量,NC表示不區分大小寫,OR表示或者,F至關於Forbidden,此例中,限制火狐 Firefox 和谷歌 Chrome 瀏覽器訪問本網站。

使配置生效

[root@ryan conf]# /usr/local/apache24/bin/apachectl -t
Syntax OK
[root@ryan conf]# /usr/local/apache24/bin/apachectl graceful

驗證

Firefox 瀏覽器:

Chorome 瀏覽器:

IE 瀏覽器:

發現 Firefox 和 Chrome 瀏覽器已經被限制訪問了。

3、PHP 配置

雖然 PHP 是以 httpd 一個模塊的形式存在的,可是 PHP 自己也有本身的配置文件。查看 PHP 配置文件所在位置的命令:

[root@ryan ~]# /usr/local/php7/bin/php -i |grep -i configuration
Configuration File (php.ini) Path => /usr/local/php7/etc
Loaded Configuration File => /usr/local/php7/etc/php.ini
Configuration

php.ini 爲 PHP 的配置文件,能夠看出其在 /usr/local/php7/etc/php.ini,好比能夠設置時區爲:

[root@ryan ~]# fgrep date.timezone /usr/local/php7/etc/php.ini
; http://php.net/date.timezone
;date.timezone = Asia/Shanghai

分號;在 php.ini 中表示註釋。

3.1 配置 PHP 的 disable_functions

PHP 有不少的內置函數,有一些函數會直接調用Linux系統命令,若是開放此函數的話將會帶來很大的危險。所以,基於風險考慮,能夠將這些不安全的函數禁掉。以下:

[root@ryan ~]# vim /usr/local/php7/etc/php.ini
disable_functions = phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

這些被禁掉的函數是不能在PHP代碼中調用的。更改完php.ini後,因爲須要在httpd中調用PHP,因此還須要重啓httpd服務使其生效。

好比在網站根目錄下新建一個phpinfo.php文件,添加以下內容:

<?php
phpinfo();
?>

而後訪問:http://www.lamper.com/phpinfo.php,保存前發現能夠正常訪問,保存後再次訪問時發現是 "白屏"。

[root@ryan ~]# tail /usr/local/apache24/logs/www.lamper.com-error_log
[Sun Jul 29 20:54:54.458570 2018] [php7:warn] [pid 2226:tid 140718538475264] [client 127.0.0.1:45105] PHP Warning:  phpinfo() has been disabled for security reasons in /data/www/DiscuzX/phpinfo.php on line 2

查看日誌發現給出了提示:phpinfo() has been disabled for security reasons in /data/www/DiscuzX/phpinfo.php on line 2

3.2 配置 error_log

PHP的日誌對於程序員來講很是重要,經過它能夠排查好多問題。

設置以下:

[root@ryan ~]# vim /usr/local//php7/etc/php.ini
log_errors = On
error_log = /var/log/php7/php_errors.log
error_reporting = E_ALL & ~E_NOTICE
display_errors = Off

說明:log_errors 能夠設置爲 on 或者 off,若是想讓 PHP 記錄錯誤日誌,須要設置爲 on。error_log 設定錯誤日誌路徑。error_reporting 設定錯誤日誌的級別,E_ALL 爲全部類型的日誌,無論是提醒仍是警告都會記錄。在開發環境下面設置爲 E_ALL,能夠方便開發人員排查問題,&表示而且,~表示排除,因此二者組合在一塊兒使用時,就表示在E_ALL的基礎上排除掉notice相關的日誌。display_errors 設置爲 on,則會把錯誤信息直接顯示在瀏覽器的頁面中,這樣對用戶來講不友好,並且還會暴露網站的一些文件的路徑等信息,因此將其設置爲 off。

[root@ryan ~]# mkdir /var/log/php7
[root@ryan ~]# chmod 777 /var/log/php7
[root@ryan ~]# apachectl graceful

須要手動建立日誌目錄,而且權限可寫。

3.3 配置 open_basedir

open_basedir 的做用是將網站限定在指定目錄裏,就算該站點被黑了,黑客也只能在該目錄下面操做,而不能操做其餘目錄。若是你的服務器上只有一個站點,那能夠直接在 php.ini 中設置 open_basedir 參數。但若是服務器上跑的站點比較多,那在 php.ini 中設置就不合適了,由於在php.ini中只能定義一次,也就是所全部站點都一塊兒定義限定的目錄,那這樣彷佛起不到隔離多個站點的目的,此時能夠將其定義在虛擬主機的配置文件中。

先來在 php.ini 中配置 open_basedir,以下:

[root@ryan ~]# vim /usr/local//php7/etc/php.ini
open_basedir = /data/www/DiscuzX:/tmp

open_basedir 能夠是多個目錄,之間用:分隔。

也能夠在虛擬主機配置文件中設置,以下:

[root@ryan ~]# vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir "/data/www/DiscuzX/:/tmp/"

能夠將 php_admin_value 這一行添加到 CustomLog 這一行下面。

附錄

關於USER_AGENT:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/User-Agent

Php與Apache的三種結合方式以及各自優缺點:https://blog.csdn.net/sinat_22991367/article/details/73431316

相關文章
相關標籤/搜索