WEB架構深度優化之PHP

1、PHP引擎緩存加速優化(4種)

1eAccelerator
2XCache
三、APC
四、Zend

2、使用tmpfs做爲緩存加速緩存的目錄(可用rc.local或fstab來自動掛載)

mount -t tmpfs -o size=16G tmpfs /dev/shmphp

mount –t tmps /dev/shm /tmp/eacceleratorhtml

只要是臨時目錄,均可以用tmpfs,如上傳圖片縮略圖臨時處理目錄和其它加速器的臨時目錄nginx

3、php.ini參數調優

不管Apache仍是Nginx,針對php.ini都是適合的。而php-fpm.conf適合nginx+fcgi的配置。必定是先選擇產品環境的php.ini(php.ini-production),再此基礎上進行下面的調優。redis

一、打開php的安全模式

PHP的安全模式是PHP很是重要的內嵌的安全機制,可以控制一些PHP中的函數的執行,如system()等,同時把不少文件操做的函數進行了權限控制。默認是沒有打開的算法

該參數配置以下:shell

#第338行數據庫

safe_mode = Offapache

#修改成:緩存

safe_mode= On安全

二、用戶組安全

當safe_mode打開後,若是safe_mode_gid沒是被關閉,那麼php腳本可以對文件進行訪問,並且相同組的用戶也可以對文件進行訪問,因此建議設置爲:safe_mode_gid = off。PHP5.3.27默認爲關閉,可能不用設置。

三、關閉危險函數
(1)如查打開了安全模式,那麼函數禁止是能夠不須要的,可是爲了安全考慮,仍是關閉危險函數。方法以下:

disable_functions= system,passthru,exec,shell_exec,popen,phpinfo

(2)若是要禁止任何文件和目錄的操做,那麼說須要關閉不少文件操做(必定要確認應用程序是否調用了這些操做)

disable_functions=chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink, 

                     delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,

                     fwrite,chgrp,chmod,chown

四、關閉PHP版本信息在Http頭中的泄漏

爲了防止黑客獲取服務器中PHP版本的信息,應當關閉PHP版本信息在Http頭的顯示。curl和telnet都不會顯示PHP版本信息了。

該參數配置以下:

#第435行

expose_php = On

#修改成:

expose_php= Off

五、關閉註冊全局變量

在PHP中提交的變量,包括使做POST或GET提交的變量,都將自動注爲全局變量,可以直接訪問,這對程序開發很是方便,但對服務器很是不安全,因此應當關閉註冊全局變量。如查打開這個參數,入侵者能夠經過提交一些特殊請求來繞過驗證。參數register_globals默認爲關閉狀態,打開會很是危險

該參數配置以下:

#第435行

register_globals= Off

六、打開magic_quotes_gpc防止SQL注入

SQL注入是很是危險的問題,輕則網站後臺被入侵,重則整個服務器淪陷。php.ini中的參數magic_quotes_gpc如查打開後會自動把用戶提交的SQL查詢進行轉換,好比把單引號"'"轉化爲"\'"等,對防止SQL注入有重大做用。因此推薦把magic_quotes_gpc參數打開,默認是Off關閉的。

該參數配置以下:

#第756行

magic_quotes_gpc = Off

#修改成:

magic_quotes_gpc= On

七、錯誤信息控制
(1)關閉錯誤顯示

通常狀況下,PHP在沒有鏈接到數據庫或其它狀況會提示錯誤,提示中會包含PHP腳本當前的路徑信息或查詢的SQL語句等信息,是不安全的,因此須要設置相關參數禁止錯誤提示。在服務器端使用錯誤日誌代替。因此推薦把display_errors參數關閉,PHP5.3.27默認是Off關閉的。

該參數配置以下:

#第538行

display_errors= Off

(2)控制錯誤顯示級別

若是必定要向客戶端顯示錯誤信息,則必定要設置好顯示錯誤的級別,通常是隻顯示警告以上的信息。對應參數爲error_reporting

該參數配置以下:

#第521行

  error_reporting = E_ALL& ~E_DEPRECATED

#修改成:

error_reporting= E_WARNING & E_ERROR

(3)啓用錯誤日誌記錄

建議在關閉display_errors參數後,可以把錯誤信息記錄下來,便於查找服務器錯誤的緣由,須要將錯誤記錄在錯誤日誌文件中。能夠打開log_errors參數,PHP5.3.27默認是On打開的。

該參數配置以下:

#第559行

log_errors= On

(4)指定錯誤日誌記錄文件

指定error_log的路徑,PHP5.3.27默認是註釋掉的。指定的錯誤日誌記錄文件必須容許apache用戶和組具備寫權限。

該參數配置以下:

#第646行,新增一行

error_log= /app/logs/php_errors.log

八、對資源限制的參數優化
(1)設置每一個腳本運行的最長時間:max_execution_time

max_execution_time是設置每一個腳本運行的最長時間,能夠阻止劣質腳本無休止的佔用服務器資源,當沒法上傳較大的文件或後臺備份數據常常超時,則須要調整該設置。該參數隻影響腳本自己的運行時間。0表示不限制

該參數配置以下:

#第444行,默認就爲30秒

max_execution_time= 30

(2)設置每一個腳本使用的最大內存:memory_limit

使用memory_limit參數,必須在編譯時使用--enable-memory-limit配置選項。若是要取消內存限制,則必須設置爲-1。設置該參數後則memory_get_usage()函數將變爲可用。

該參數配置以下:

#第465行,默認就爲128M

memory_limit= 128M

(3)設置每一個腳本等待輸入數據的最長時間:max_input_time

max_input_time參數是指定每一個腳本解析輸入數據(POST、GET、upload)的最大容許時間。-1表示不限制。

該參數配置以下:

#第454行,默認60秒

max_input_time= 60

(4)設置上傳文件最大許可大小:upload_max_filesize

使用upload_max_filesize參數限制上傳文件的大小。可根據實際自行調整。

該參數配置以下:

#第891行,默認就爲2M

upload_max_filesize= 2M

九、安全方面的參數優化
(1)禁止打開遠程地址:allow_url_fopen

記得php include的那個漏洞嗎?就是在一個php程序中include了變量,那麼入侵者就能夠利用這個控制服務器在本地執行遠程的一個 php程序,例如phpshell,因此必定要關閉該參數。

該參數配置以下:

#第902行

allow_url_fopen = On

#修改成:

allow_url_fopen= Off

(2)防止Nginx文件類型錯誤解析漏洞:cgi.fix_pathinfo

該參數配置以下:

#第854行

;cgi.fix_pathinfo=1

#修改成:

cgi.fix_pathinfo=0

十、調整PHPSession信息存放類型和位置
(1)調整PHP Session信息存放類型和位置

PHP Session默認是以文件類型放在/tmp目錄下的。若是是負載均衡+WEB集羣的架構,則Session會話保持將會是一個問題,解決辦法一是在負載均衡端使用Hash算法,將會話始終發送到一臺Web服務器上;二是採用緩存服務器(Memcache、Redis)存放全部Session會話,訪問時到緩存服務器上調取Session會話,達到Session會話保持的做用

該參數配置以下:

#第1461行

session.save_handler =files

#修改成:

session.save_handler= memcache

#第1490行

;session.save_path ="/tmp"

#修改成:

session.save_path= "tcp://10.0.0.18:11211" #memcacheIP和端口,採用tcp協議

(2)採有Memcache存放PHPSession的優缺點

a、優勢

(i)讀寫速度會比普通files時快得多

(ii)能夠解析多個服務器共用session的難題

b、缺點

(i)session數據都保持在memory中,持久化方面有所欠缺,但對session數據來講不是問題

(ii)也可使用其它持久化系統存儲session。如redis,ttserver

(iii)高性能高併發場景時,cookies的效率比session要好不少,所以,不少大網站都會用cookies來解決會話共享問題。

4、php-fpm.conf參數調優

pm.max_children= 1024                        #子進程的最大數量

pm.start_servers= 16                             #啓動時的進程數量

pm.min_spare_servers= 5                          #最小空間進程數

pm.max_spare_servers= 20                         #最大空間進程數

pm.max_requests= 2048                        #擴大每一個子進程的最大請求數

slowlog= /application/php/logs/$pool.log.slow #指定慢查詢的記錄日誌

request_slowlog_timeout= 10                      #指定請求超時參數

詳細設置見第二十四章第3大點PHP的fpm配置的第2小點修改php-fpm配置文件

相關文章
相關標籤/搜索