1. 程式人生 > >apache web服務器

apache web服務器

rect sof zip avi mysqli vision ssi 用戶密碼 進程創建

一、安裝 apache2.4.23

新版本的 httpd-2.4 新增以下特性;

新增模塊;

mod_proxy_fcgi(可提供 fcgi 代理)

mod_ratelimit(限制用戶帶寬)

mod_request(請求模塊,對請求做過濾)

mod_remoteip(匹配客戶端的 IP 地址)

對於基於 IP 的訪問控制做了修改,不再支持 allow,deny,order 機制,而是統一使用 require 進行

還新增以下幾條新特性;

1、MPM 支持在運行時裝載;不過要開啟這種特性,在編譯安裝要啟用這三種功能;

--enable-mpms-shared=all --with-mpm=event

2、支持 event

3、支持異步讀寫

4、在每個模塊及每個目錄上指定日誌級別

5、增強版的表達式分析器

6、每請求配置:,

7、毫秒級別的 keepalive timeout

8、基於 FQDN 的虛擬主機不再需要 NameVirtualHost 指令

9、支持使用自定義變量


安裝環境:操作系統:Centos7.2,關閉 selinux

檢查 httpd 包是否安裝,如查安裝則卸載

[root@www ~]# rpm -q httpd

1、安裝 apache2.4.23

下載源碼包:

httpd-2.4.23.tar.gz

apr-1.5.2.tar.gz

apr-util-1.5.4.tar.gz

zlib-1.2.8.tar.gz pcre-8.39.tar.gz

:apr(Apache Portable Runtime)Apache 可移植運行庫,它是一個對操作系統調用的抽 象庫,用來實現 Apache 內部組件對操作系統的使用,提高系統的可移植性。

安裝 apr 和 apr-util

[root@www ~]# tar zxf apr-1.5.2.tar.gz

[root@www ~]# cd apr-1.5.2/

[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr

[root@www apr-1.5.2]# make && make install

[root@www ~]# tar zxf apr-util-1.5.4.tar.gz

[root@www ~]# cd apr-util-1.5.4/

[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

[root@www apr-util-1.5.4]# make && make install

安裝 zlib

[root@www ~]# tar zxf zlib-1.2.8.tar.gz

[root@www ~]# cd zlib-1.2.8/

[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib

[root@www zlib-1.2.8]# make && make install

安裝 pcre

[root@www ~]# tar zxf pcre-8.39.tar.gz

[root@www ~]# cd pcre-8.39/

[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre

[root@www pcre-8.39]# make && make install

安裝 openssl

安裝 apache2.4.23 時提示 openssl 版本過低,centos7 自帶版本 openssl-1.0.1e

下載 openssl

#wget https://www.openssl.org/source/openssl-1.0.1u.tar.gz

[root@www ~]# tar zxf openssl-1.0.1u.tar.gz

[root@www ~]# cd openssl-1.0.1u/

[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared

[root@www openssl-1.0.1u]# make && make install

[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e

[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

安裝 apache2.4.23

[root@www ~]# tar zxf httpd-2.4.23.tar.gz

[root@www ~]# cd httpd-2.4.23/

[root@www httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate

相關參數解釋:

--enable-so:支持動態共享模塊(即打開 DSO 支持)

--enable-rewrite:支持 url 重寫

--enable-ssl:支持 ssl --with-ssl=/usr/local/openssl:指定 ssl 安裝位置

--enable-cgi:啟用 cgi --enable-cgid:MPM 使用的是 event 或 worker 要啟用 cgid

--enable-modules=most:明確指明要靜態編譯到 httpd 二進制文件的模塊,為 空格分隔的模塊名列表、all 或者 most,all 表示包含所有模塊,most 表示包含大部分常用模 塊

--enable-mods-shared=most:明確指明要以 DSO 方式編譯的模塊,為空格分隔 的模塊名列表、all 或者 most,all 表示包含所有模 塊,most 表示包含大部分模塊

--enable-mpms-shared=all:啟用 MPM 所有支持的模式,這樣 event、worker、prefork 就會以 模塊化的方式安裝,要用哪個就在 httpd.conf 裏配置就好了。

--with-mpm=event:指定啟用的 mpm 模式,默認使用 enevt 模式,在 apache 的早期版本 2.0 默認 prefork,2.2 版本是 worker,2.4 版本是 event.

--with-pcre=/usr/local/pcre:支持 pcre

--with-z=/usr/local/zlib:使用 zlib 壓縮庫

--with-apr=/usr/local/apr:指定 apr 的安裝路徑

--with-apr-util=/usr/local/apr-util:指定 apr-util 的安裝路徑

--enable-expires:激活彧通過配置文件控制 HTTP 的“Expires:”和“Cache-Control:”頭內容,即 對網站圖片、js、css 等內容,提供客戶端瀏覽器緩存的設置。這個是 apache 調優的一個重 要選項之一。

--enable-deflate:提供對內容的壓縮傳輸編碼支持,一般是 html、js、css 等內容的站點。使 用此參數會打打提高傳輸速度,提升訪問者訪問的體驗。在生產環境中,這是 apache 調優 的一個重要選項之一。

[root@www httpd-2.4.23]# make && make install

優化 http 程序執行路徑

[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/

修改配置文件 httpd.conf,設置其中的 ServerName 值 (在vim /usr/local/http-2.4.23/conf)

例如:ServerName www.benet.com

開啟 apache 服務器:

# /usr/local/http-2.4.23/bin/apachectl start

開機後自動啟動

[root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd

編輯 /etc/init.d/httpd 文件,在首行 #!/bin/sh 下面加入這行:

[root@www httpd-2.4.23]# vi /etc/init.d/httpd

# chkconfig: 35 85 15 (在 3 和 5 啟動模式下的--啟動優先級

將 Apache 加入開機自動啟動:

[root@www httpd-2.4.23]# chkconfig --add httpd

[root@www httpd-2.4.23]# chkconfig httpd on

啟動編譯好的 Apache 2.4.23:

[root@www httpd-2.4.23]# service httpd start

[root@www httpd-2.4.23]# netstat -anplt | grep 80

tcp6 0 0 :::80 :::* LISTEN 4807/httpd

客戶端測試訪問(註意防火墻)


二、Apache 的優化配置:

apache 所運行的硬件環境都是對性能影響最大的因素,即使不能對硬件進行升級,也最好 給 apache 一個單獨的主機以免受到其他應用的幹擾。各個硬件指標中,對性能影響最大的 是內存,對於靜態內容(圖片、javascript 文件、css 文件等),它決定了 apache 可以緩存多 少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,大內存可以極大提高靜態站 點的速度;對動態高負載站點來說,每個請求保存的時間更多一些,apache 的 mpm 模塊會 為每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正 比,因此增大內存對提高動態站點的負載和運行速度也極為有利 其次是硬盤的速度,靜態站點尤為突出,apache 不斷的在讀取文件並發送給相應的請求, 硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載 web 程序(php 等),一個請求甚至要讀 取十幾個文件才能處理完成,因此盡可能的提高硬盤速度和質量對提高 apache 的性能是有 積極意義的。

最後是 cpu 和網絡,cpu 影響的是 web 程序執行速度,網絡影響流量大小。

1、apache 的工作模式:

Apache HTTP 服務器被設計為一個強大的、靈活的能夠在多種平臺以及不同環境下工作的服 務器。這種模塊化的設計就叫做“多進程處理模塊”(Multi-Processing Module,MPM),也叫 做工作模式。 Prefork 模式(一個非線程型的) : 其主要工作方式是:當 Apache 服務器啟動後,mpm_prefork 模塊會預先創建多個子進程(默 認為 5 個),每個子進程只有一個線程,當接收到客戶端的請求後,mpm_prefork 模塊再將 請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將 超過預先創建的子進程數時,mpm_prefork 模塊就會創建新的子進程來處理額外的請求。 Apache 總是試圖保持一些備用的或者是空閑的子進程用於迎接即將到來的請求。這樣客戶 端的請求就不需要在接收後等候子進程的產生。 由於在 mpm_prefork 模塊中,每個請求對應一個子進程,因此其占用的系統資源相對其他 兩種模塊而言較多。不過 mpm_prefork 模塊的優點在於它的每個子進程都會獨立處理對應 的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。Prefork 在效率上 要比 Worker 要高,但是內存使用大得多不擅長處理高並發的場景。 Apache 在 prefork 工作模式下影響性能的重要參數說明

Apache 在 prefork 工作模式下影響性能的重要參數說明

# prefork MPM

<IfModule mpm_prefork_module> StartServers 5

#apache 啟動時候默認開始的子進程數 MinSpareServers 5

#最小的閑置子進程數 MaxSpareServers 10

#最大的閑置子進程數 MaxRequestWorkers 250

#MaxRequestWorkers 設置了允許同時的最大接入請求數量。任何超過

MaxRequestWorkers 限制的請求將進入等候隊列,在 apache2.3.1 以前的版本

MaxRequestWorkers 被稱為 MaxClients,舊的名字仍舊被支持。

MaxConnectionsPerChild 500

註 4:查看 Apache 加載的模塊

[root@www ~]#apachectl -t -D DUMP_MODULES

[root@www ~]# apachectl -M

[root@www ~]# apachectl –l (小寫 L,只顯示靜態模塊)

3.重啟 httpd 服務

Worker 模式(多線程多進程):

和 prefork 模式相比,worker 使用了多進程和多線程的混合模式,worker 模式也同樣會先預 派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會 被分配到一個線程來服務。線程比起進程會更輕量,因為線程是通過共享父進程的內存空間, 因此,內存的占用會減少一些,在高並發的場景下會比 prefork 有更多可用的線程,表現會 更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是 多個線程出現問題,也只是影響 Apache 的一部分,而不是全部。由於用到多進程多線程, 需要考慮到線程的安全了,在使用 keep-alive 長連接的時候,某個線程會一直被占用,即使 中間沒有請求,需要等待到超時才會被釋放(該問題在 prefork 模式下也存在) 總的來說,prefork 方式速度要稍高於 worker,然而它需要的 cpu 和 memory 資源也稍多於 woker。

Apache 在 worker 工作模式下影響性能的重要參數說明

# worker MPM

<IfModule mpm_worker_module>

StartServers 3

#apache 啟動時候默認開始的子進程數

MinSpareThreads 75

#最小空閑數量的工作線程

MaxSpareThreads 250
#最大空閑數量的工作線程

ThreadsPerChild 25

#每個子進程產生的線程數量

MaxRequestWorkers 400

#與 prefork 模式相同

MaxConnectionsPerChild 0

#與 prefork 模式相同

註 4:進程與線程的區別

線程是指進程內的一個執行單元,也是進程內的可調度實體. 與進程的區別:

(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程 有自己獨立的地址空間;

(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源

(3)線程是處理器調度的基本單位,但進程不是.

(4)二者均可並發執行.

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對 應用的並發性。

進程和線程的區別在於:

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 線程的劃分尺度小於進程,使得多線程程序的並發性高。 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程 序的運行效率。

Event 模式:

這是 Apache 最新的工作模式,是 worker 模式的變種,它把服務進程從連接中分離出來,一 worker 模式不同的是在於它解決了 keep-alive 長連接的時候占用線程資源被浪費的問題,在 event 工作模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請
求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又允許它釋放。這增強了在高並 發場景下的請求處理。event 模式不能很好的支持 https 的訪問(HTTP 認證相關的問題)。

3、開啟 apache 的 Gzip(deflate)功能

gzip 可以極大的加速網站,有時壓縮比率高到 80%,最少都有 40%以上,還是相當不錯的。

在 Apache2 之後的版本,模塊名不叫 gzip,而叫 mod_deflate

未使用 Gzip

技術分享圖片

如果要開啟 deflate 的話,一定要打開下面二個模塊 (進主配:vim /etc/http/conf/httpd.conf)

LoadModule deflate_module modules/mod_deflate.so

LoadModule headers_module modules/mod_headers.so

設置壓縮比率,取值範圍在 1(最低) 到 9(最高)之間,不建議設置太高,雖然有很高的壓縮率, 但是占用更多的 CPU 資源.

mod_deflate 模塊檢查及安裝

[root@www ~]# /usr/local/http-2.4.23/bin/apachectl -M | grep deflate

deflate_module (shared)

如果沒有安裝:

a.編譯時安裝方法

編譯的時候跟上--enable-deflate即可實現安裝

b.DSO 方式安裝

[root@www ~]# cd /root/httpd-2.4.23/modules/filters/ #切到 apache 源碼包 mod_deflate 所在 的目錄下

# /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c #以 dso 的方式編譯安裝到 apache 中 # /usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_headers.c#以 dso 的方式編譯安裝到 apache 中 如果報錯:

技術分享圖片

原因是缺少 zlib-devel 的安裝包,裝上就可以了。

[root@www filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so

#檢查 mod_deflate 是 否安裝,成功安裝這裏會顯示出該文件

-rwxr-xr-x. 1 root root 98144 Oct 22 23:14 /usr/local/http-2.4.23/modules/mod_deflate.so

apxs 命令參數說明

-i 此選項表示需要執行安裝操作,以安裝一個或多個動態共享對象到服務器的 modules 目 錄中。

-a 此選項自動增加一個 LoadModule 行到 httpd.conf 文件中,以啟用此模塊,或者,如果 此行已經存在,則啟用之。

-c 此選項表示需要執行編譯操作。 如果重啟的時候出現錯誤

技術分享圖片

技術分享圖片

需要在 LoadModule deflate_module modules/mod_deflate.so 的前面加載 zlib.so

這裏需要註意的是 LoadModule deflate_module 需要放在 LoadModule php5_module 之後

LoadFile /usr/lib/libz.so(x64 系統中該庫文件位於/usr/lib64 目錄下,可以軟鏈接到/usr/lib 下 或者就在 LoadModule deflate_module modules/mod_deflate.so 這行的上一行添加 LoadFile /usr/lib64/libz.so 即可

重新啟動 httpd:

# /usr/local/http2.4.23/bin/apachectl graceful #優雅啟動 httpd 服務

修改 Apache 配置文件開啟 gzip 壓縮傳輸:()

http.conf 修改、增加配置參數

LoadModule deflate_module modules/mod_deflate.so

LoadModule headers_module modules/mod_headers.so

打開 httpd.conf 後,先將上面兩行配置前面的#號去掉,這樣 apache 就會啟用這兩個模塊, 其中 mod_deflate 是壓縮模塊,就是對要傳輸到客戶端的代碼進行 gzip 壓縮;mod_headers 模塊的作用是告訴瀏覽器頁面使用了 gzip 壓縮,如果不開啟 mod_headers 那麽瀏覽器就會 對 gzip 壓縮過的頁面進行下載,而無法正常顯示。 在 httpd.conf 中加入以下代碼,可以加到任何空白地方,不了解 apache 的話,如果擔心加 錯地方,就放到 http.conf 文件的最後一行

<IfModule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
#AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x- httpd- php
#AddOutputFilterByType DEFLATE image/*
AddOutputFilterByType DEFLATE text/*
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript
application/javascript application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary

SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary

SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary

</IfModule>

技術分享圖片

修改完成後保存退出並重啟 httpd 服務 使用谷歌瀏覽器測試訪問,

如下圖顯示結果:(提示:在訪問測試頁之前按 F12 鍵)

技術分享圖片

4、配置 mod_expires 模塊

這個非常有用的優化,mod_expires 可以減少 20-30%左右的重復請求,讓重復的用戶對指定 的頁面請求結果都 CACHE 在本地,根本不向服務器發出請求。但要註意更新快的文件不要 這麽做。

這個模塊控制服務器應答時的 Expires 頭內容和 Cache-Control 頭的 max-age 指令。有效期 (expiration date)可以設置為相對於源文件的最後修改時刻或者客戶端的訪問時刻。 未啟用 expire 的效果:

[root@www htdocs]# curl -I 192.168.31.83

HTTP/1.1 200 OK

Date: Tue, 25 Oct 2016 15:52:37 GMT

Server: Apache/2.4.23 (Unix)

Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT

ETag: "8c9f-53f8a01b18080"

Accept-Ranges: bytes

Content-Length: 35999
Vary: Accept-Encoding

Content-Type: image/png

啟用 expire 緩存:

mod_expires 的安裝配置:

啟用 expires_module

LoadModule expires_module modules/mod_expires.so

然後添加 Expires 配置規則

<IfModule mod_expires.c>

ExpiresActive On

ExpiresByType text/css "now plus 1 month"

ExpiresByType application/x-javascript "now plus 5 day"

ExpiresByType image/jpeg "access plus 1 month"

ExpiresByType image/gif "access plus 1 month"

ExpiresByType image/bmp "access plus 1 month"

ExpiresByType image/x-icon "access plus 1 month"

ExpiresByType image/png "access plus 1 minute"

ExpiresByType application/x-shockwave-flash "access plus 1 month"

ExpiresDefault "now plus 0 minute"

</IfModule

驗證:

[root@www htdocs]# curl -I 192.168.31.83

HTTP/1.1 200 OK

Date: Tue, 25 Oct 2016 16:00:57 GMT

Server: Apache/2.4.23 (Unix)

Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT

ETag: "8c9f-53f8a01b18080"

Accept-Ranges: bytes

Content-Length: 35999

Cache-Control: max-age=60

Expires: Tue, 25 Oct 2016 16:01:57 GMT

Vary: Accept-Encoding

Content-Type: image/png

4、Apache 禁止目錄遍歷

將 Options Indexes FollowSymLinks 中的 Indexes 去掉,就可以禁止 Apache 顯示該目錄結構。
Indexes 的作用就是當該目錄下沒有 index.html 文件時,就顯示目錄結構。

技術分享圖片

1、主配置中啟用 httpd-default.conf

Include conf/extra/httpd-default.conf

2、修改 httpd-default.conf

文件:/usr/local/http-2.4.23/conf/extra/httpd-default.conf

找到

ServerTokens Full

ServerSignature On

改成

ServerTokens Prod

ServerSignature off

重啟 apache 測試

技術分享圖片

6、Apache 日誌切割

為什麽要分割日誌 隨著網站的訪問越來越大,WebServer 產生的日誌文件也會越來越大,如果不對日誌進行分 割,那麽只能一次將大的日誌(如 Apache 的日誌)整個刪除,這樣也丟失了很多對網站比較 寶貴的信息,因為這些日誌可以用來進行訪問分析、網絡安全監察、網絡運行狀況監控等, 因此管理好這些海量的日誌對網站的意義是很大的。

方法 1:使用 rotatelogs(apache 自帶的工具)每隔一天記錄一個日誌

輯 Apache 的主配置文件,更改內容如下:

註釋掉如下兩行

ErrorLog logs/error_log

CustomLog logs/access_log common

然後添加如下兩行

ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"

CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

註:其中 86400 為輪轉的時間單位為秒

驗證:查看 logs 目錄下的日誌文件

[root@www ~]# ls /usr/local/http-2.4.23/logs/ (如果沒有的稍等,有緩存

access_20161026.log access_log deflate_log.log error_20161026.log error_log httpd.pid

由於 apache 自帶的日誌輪詢工具 rotatelogs,據說在進行日誌切割時容易丟日誌,因此我們 通常使用 cronolog 進行日誌輪詢。

方法 2、使用 cronolog 為每一天建立一個新的日誌

安裝 cronolog 程序

下載 cronolog

[root@www ~]# tar zxf cronolog-1.6.2.tar.gz

[root@www ~]# cd cronolog-1.6.2/

[root@www cronolog-1.6.2]# ./configure && make && make install

主配置文件中的使用方法

ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"

CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined

如果 Apache 中有多個虛擬主機,最好每個虛擬主機中放置一個這樣的代碼,並將日誌文件 名改成不同的名字。

擴展:

這個保證了每天一個文件夾文件夾下每個小時產生一個 log CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined

按天輪詢(生產環境常見用法,推薦使用): CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined

按小時輪詢(生產環境較常見用法): CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined

驗證:查看 logs 目錄下的日誌文件

[root@www ~]# ls /usr/local/http-2.4.23/logs/

access-20161026.log access_log deflate_log.log error-20161026.log error_log httpd.pid

註意:

這兩個管道日誌文件程序還有一點不同之處是使用 cronolog 時如果日誌是放在某個不存 在的路徑則會自動創建目錄,而使用 rotatelogs 時不能自動創建,這一點要特別註意

7、配置防盜鏈

有時候,你的網站莫名其妙的訪問量變大,不要高興的太早,有可能是被別人盜鏈了。 舉個例子:比如你搭了個 discuz 論壇,裏面有些熱點圖片、視頻;然後別人將他網站上訪問 圖片的地址重定向到你的 discuz 上,這樣他的服務器就可以空閑出來了;也就是說別人訪問 他網站的圖片視頻,消耗的確是你服務器的資源; 解決這個問題的方法是配置下防盜鏈,讓外來的盜不了鏈;

方法 1:Apache 防盜鏈的第一種實現方法,可以用 rewrite 實現。

首先要確認 Apache 的 rewrite module 可用:

[root@www ~]# apachectl -M | grep rewrite

rewrite_module (shared)

打開 httpd.conf,確保有這麽一行配置:

LoadModule rewrite_module modules/mod_rewrite.so

然後在找到自己網站對應的配置的地方(如在主配置文件中或虛擬主機中),

加入下列代碼: ServerName www.benet.com

#防盜鏈配置

RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://benet.com/.*$ [NC]

RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png[R,NC,L]

防盜鏈配置的說明:

如果訪問不了 把域名改為ip

先要在htdoce裏放入兩張圖片:

<img src="1.jpg">

<img src="2.jpg">

然後再打開一臺:安裝apache

技術分享圖片

技術分享圖片

第一臺:

技術分享圖片

三、fcgi 模式編譯安裝 LAMP+xcache

php 的工作模式:

php 在 lamp 環境下共有三種工作模式:CGI 模式、apache 模塊、FastCGI 模式。

CGI 模式下 運行 PHP,性能不是很好。作為 apache 的模塊方式運行,在以前的課程中編譯安裝 lamp 已 經介紹過了。

FastCGI 的方式和 apache 模塊的不同點在於:

FastCGI 方式 PHP 是一處獨立的 進程,所有 PHP 子進程都由 PHP 的一個叫作 php-fpm 的組件負責管理;而 apache 模塊化方 式運行的 PHP,則是 apache 負責調用 PHP 完成工作。PHP 的 FastCGI 方式性能要比 apache 模塊化方式強很多,今天我們以 FastCGI 方式編譯安裝 lamp。 FastCGI 工作機制: 首先客戶端發起請求,請求分為 2 種,一種是靜態請求它可以直接由 Apache 直接響應返回; 另一種是動態的請求,如其中包含中 php 或者 Perl 這種腳本解釋性語言,則由 Apache 服務 器通過fastcgi協議調用php服務器執行並返回給Apache由Apache返回解釋執行後的結果, 如果這個過程中涉及到對數據的操作,此時 php 服務器還會還會通過 mysql 協議調用 mysql 服務器。

技術分享圖片

編譯環境及各軟件版本:(三臺初始環境web、php、mysql

技術分享圖片

主機規劃

至少 3 臺主機,操作系統都是 centos7.2.網段在 192.168.197.0/24 網關 192.168.197.2

分配如下: 1 臺 httpd 服務器(192.168.31.83)

1 臺 php 服務器(192.168.31.141)

1 臺 mysql 服務器(192.168.31.225)

編譯安裝 LAMP

編譯安裝 apache(請參考前面 apache 的安裝)

編譯安裝 mysql(請參考 mysql 安裝)

FastCGI 方式安裝 php

1、解決依賴關系 [root@phpserver ~]# yum -y install libxml2-devel lzip2-devel libcurl-devel openssl-devel bzip2-devel

安裝 libmcrypt

[root@phpserver ~]# tar zxf libmcrypt-2.5.7.tar.gz

[root@phpserver ~]# cd libmcrypt-2.5.7/

[root@phpserver libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install

2、編譯安裝 php

[root@phpserver ~]# tar zxf php-5.6.27.tar.gz

[root@phpserver ~]# cd php-5.6.27/

[root@phpserver php-5.6.27]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2--enable-maintainer-zts

[root@phpserver php-5.6.27]# make && make install

技術分享圖片

3、提供 php 配置文件

[root@phpserver php-5.6.27]# cp php.ini-production /etc /php.ini

4、為 php-fpm 提供腳本

[root@phpserver php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

[root@phpserver php-5.6.27]# chmod +x /etc/init.d/php-fpm

[root@phpserver php-5.6.27]# chkconfig --add php-fpm

[root@phpserver php-5.6.27]# chkconfig php-fpm on

5、提供 php-fpm 配置文件並編輯:

# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf

[root@phpserver ~]# vi /usr/local/php5.6/etc/php-fpm.conf

修改內容如下:

pid = run/php-fpm.pid

listen = 192.168.31.141:9000(phpip)

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 5

pm.max_spare_servers = 35

啟動 php-fpm 服務:

[root@phpserver ~]# service php-fpm start

Starting php-fpm done

[root@phpserver ~]# netstat -anpt | grep php-fpm

tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN

25456/php-fpm: mast

[root@phpserver ~]# firewall-cmd --permanent --add-port=9000/tcp success

[root@phpserver ~]# firewall-cmd --reload Success

在該主機上新建虛擬主機目錄用於存放網頁文件

[root@phpserver ~]# mkdir -p /var/www/benet

至此 php 安裝配置完畢,下面配置 apache 通過 fastcgi 協議調用 php

6、配置 apache(切換到 apache 主機上操作)

在 Apache2.4 以後已經專門有一個模塊針對 FastCGI 的實現,此模塊為 mod_proxy_fcgi.so, 它其實是作為 mod_proxy.so 模塊的擴充,因此,這兩個模塊都要加載

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

[root@www ~]# apachectl -M | grep proxy

proxy_module (shared)

proxy_fcgi_module (shared)

建立一個目錄作為虛擬主機的家目錄

[root@www ~]# mkdir -p /var/www/benet

編輯主配置文件 httpd.conf,開啟虛擬主機

啟用 Include conf/extra/httpd-vhosts.conf

同時定位 AddType;添加下面兩行:讓 apache 能識別 php 格式的頁面

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

並且定位至 DirectoryIndex:支持 php 格式的主頁

DirectoryIndex index.php index.html #添加 index.php

配置虛擬主機支持使用 fcgi

[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/www/benet"
ServerName www.benet.com
ServerAlias benet.com
ErrorLog "logs/benet.com-error_log"
CustomLog "logs/benet.com-access_log" common
ProxyRequests Off
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.31.141:9000/var/www/benet/$1
<Directory "/var/www/benet">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

技術分享圖片

三方模塊支持 PHP-FPM 實現。

測試 LAMP 環境:

在 mysql 主機上創建用於 php 服務器連接的 mysql 賬戶

mysql> grant all on *.* to testuser@‘%‘ identified by ‘123456’;

註意防火墻要允許 mysql 連接。

在 php 服務器上的/var/www/benet 目錄下創建.php 的測試頁:

[root@phpserver ~]# cat /var/www/benet/index.php

<?php

phpinfo();

?>

[root@phpserver ~]# cat /var/www/benet/test1.php

<?php

$link=mysql_connect(‘192.168.31.225‘,‘testuser‘,‘123456‘);

if ($link)echo "connection success......";

mysql_close();

?>

測試訪問 php 測試頁:

技術分享圖片

看到上面兩個測試頁說明 apache、php、mysql 之間可以協同工作了。

7、壓力測試

網站性能壓力測試是服務器網站性能調優過程中必不可缺少的一環。只有讓服務器處在高壓 情況下,才能真正體現出軟件、硬件等各種設置不當所暴露出的問題。 性能測試工具目前最常見的有以下幾種:ab、http_load、webbench、siege。今天我們專門 來介紹 ab。

ab 是 apache 自帶的壓力測試工具。ab 非常實用,它不僅可以對 apache 服務器進行網站訪 問壓力測試,也可以對或其它類型的服務器進行壓力測試。比如 nginx、tomcat、IIS 等。 下面我們開始介紹有關 ab 命令的使用:

技術分享圖片

查看 ab 是否安裝成功,可以切換到上述目錄下,使用 ab –V 命令進行檢測。

如下: [root@www ~]# /usr/local/http-2.4.23/bin/ab -V

This is ApacheBench, Version 2.3 <$Revision: 1748469 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/

如果 ab –V 命令出錯,可以 exporexport LD_LIBRARY_PATH="/usr/local/openssl/lib/", 就可以了。

技術分享圖片

技術分享圖片

技術分享圖片

8、CentOS7.2 下安裝 php加速軟件 Xcache(在 php 主機上完成下面的操作

說明:

php 安裝目錄:/usr/local/php5.6

php.ini 配置文件路徑:/etc/php.ini

php 網頁根目錄:/var/www/benet

1)安裝 xcache

wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz #下載

[root@phpserver ~]# tar zxf xcache-3.2.0.tar.gz #解壓

[root@phpserver ~]# cd xcache-3.2.0/ #進入安裝目錄

[root@phpserver xcache-3.2.0]# /usr/local/php5.6/bin/phpize#用 phpize 生成 configure 配置文 件 [root@phpserver xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config #配置

[root@phpserver xcache-3.2.0]# make && make install #編譯、安裝

Installing shared extensions: /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/

安裝完成之後,出現下面的界面,記住以下路徑,後面會用到

/usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/

2)創建 xcache 緩存文件

# touch /tmp/xcache

# chmod 777 /tmp/xcache

3)拷貝 xcache 後臺管理程序到網站根目錄

[root@phpserver xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache

4)配置 php 支持 xcache

vi / etc/php.ini #編輯配置文件,在最後一行添加以下內容

[xcache-common]

extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so(這是上面的路徑

[xcache.admin]

xcache.admin.enable_auth = Off

[xcache]

xcache.shm_scheme ="mmap"

xcache.size=60M

xcache.count =1

xcache.slots =8K

xcache.ttl=0

xcache.gc_interval =0

xcache.var_size=64M
xcache.var_count =1

xcache.var_slots =8K

xcache.var_ttl=0

xcache.var_maxttl=0

xcache.var_gc_interval =300

xcache.test =Off

xcache.readonly_protection = Off

xcache.mmap_path ="/tmp/xcache"

xcache.coredump_directory =""

xcache.cacher =On

xcache.stat=On xcache.optimizer =Off

[xcache.coverager]

xcache.coverager =On

xcache.coveragedump_directory =""

將 xcache 目錄拷貝到 apache 主機的網頁文檔目錄下

[root@phpserver ~]# scp -r /var/www/benet/xcache/ [email protected]:/var/www/benet/

6)測試 service php-fpm restart #重啟 php-fpm

瀏覽器打開網站根目錄下面的 xcache

http://http://192.168.31.83/xcache 可以看到如下頁面: (httpdip

技術分享圖片

至此,Linux 下安裝 php 加速軟件 Xcache 教程完成

技術分享圖片

技術分享圖片

查看 xcache 的命中率:

技術分享圖片

9、部署 bbs 論壇

Discuz 的程序文件解壓,並且將 upload 中所有文件放置到網站目錄(php 服務器的操作)

#unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus

# mv Discuz/upload/ /var/www/benet/bbs

設置 php-fpm 的服務用戶為下面文件的屬主或者對其設置寫權限,否則安裝時會報錯

#cd /var/www/benet/bbs

#chown -R nobody config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/

#chmod -R 777 uc_server/data/

修改 php.ini 文件

short_open_tag = On

# service php-fpm restart

web 服務器也需要有靜態文件(apache 服務器上操作)

#unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus

# mv Discuz/upload/ /var/www/benet/bbs

設置 httpd 的服務用戶對指定文件也需要有寫權限

#cd /var/www/benet/bbs

#chown -R daemon config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/

在數據庫服務器上創建 bbs 數據庫及授權帳戶

mysql> create database bbsdb;

Query OK, 1 row affected (0.01 sec)

mysql> grant all on bbsdb.* to runbbs@‘%‘ identified by ‘123‘;

Query OK, 0 rows affected, 1 warning (0.03 sec)

置完成之後,輸入 httd://192.168.31.83/bbs/install 即可安裝

技術分享圖片

填寫數據庫的相關信息,添加數據庫服務器的地址和 MariaDB 創建的數據庫和用戶密碼,而 後在設置 bbs 的管理員帳號密碼就可以繼續安裝了。 剩下的根據提示安裝即可。

技術分享圖片

出現上面這種情況是由於 php 服務器安裝了 discuz 之後導致程序發生變化從而導致動態服 務器和靜態服務器的程序不一致,只需要手動把 bbs 服務器的文件和 web 服務器進行一次 同步即可,如果想實現自動同步,需要使用其他服務,如 initory+rsync、sersync 等工具。

#scp -r /var/www/benet/bbs/* [email protected]:/var/www/benet/bbs/

動態服務器和靜態服務器同步文件之後,再次訪問 bbs 的網址就正常了。

技術分享圖片

apache web服務器