顯示廣告
隱藏 ✕
看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [Apache] 用 mod_fastcgi, php-fpm 來執行worker模組
時間 2013年03月25日 Mon. AM 07:22:16


Apache有兩種管理記憶體的方式: prefork 與 worker
預設為使用 prefork

如果想要改為 worker 的話,就不能使用 mod_php 了
必需另外裝 php-fpm 來執行 php
然後 Apache 要裝 mod_fastcgi 來設定讓 .php 檔用 php-fpm 來執行


注意使用 php-fpm 的話 $_SERVER['PHP_AUTH_USER'] 會無法使用


參考
http://www.pigo.idv.tw/archives/832 Apache + mod_fastcgi + php-fpm 設定
http://www.cyberciti.biz/tips/rhel-centos-fedora-apache2-fastcgi-php-configuration.html
http://blog.snowtec.org/2013/02/apache-mod-fastcgi-php-fpm-on-freebsd/

先安裝 httpd-devel 、 php-fpm
$ yum install httpd-devel
$ yum install php-fpm

(php是用remi版的話,這邊要用 yum --enablerepo=remi install php-fpm)


安裝 mod_fastcgi

http://www.fastcgi.com/dist/ 下載 mod_fastcgi-current.tar.gz 來安裝

$ cd /usr/local/src
$ wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
$ tar -zxvf mod_fastcgi-current.tar.gz
$ cd mod_fastcgi-2.4.6


產生 Makefile 檔,執行 make 時要自訂 top_dir 的位置
$ cp Makefile.AP2 Makefile
$ make top_dir=/usr/lib64/httpd
$ make install top_dir=/usr/lib64/httpd

(若是32bit系統的話 top_dir=/usr/lib/httpd)


$ vim /etc/httpd/conf.d/mod_fastcgi.conf
加上
LoadModule fastcgi_module modules/mod_fastcgi.so


將 apache 改為 worker 模式
$ vim /etc/sysconfig/httpd
將 #HTTPD=/usr/sbin/httpd.worker 的 # 拿掉即可


修改 php-fpm 設定檔
$ vim /etc/php-fpm.d/www.conf

將 listen = 127.0.0.1:9000 改為
;listen = 127.0.0.1:9000
listen = /tmp/php-fpm-www.sock


;listen.owner = nobody
;listen.group = nobody
改成
listen.owner = apache
listen.group = apache



修改 apache 設定檔
設定 prefork 時使用 mod_php,worker時使用 mod_fastcgi
$ vim /etc/httpd/conf.d/php.conf
原本為
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>
AddHandler php5-script .php
AddType text/html .php
DirectoryIndex index.php

修改為
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
  AddHandler php5-script .php
  AddType text/html .php
</IfModule>
<IfModule worker.c>
  FastCGIExternalServer /php-fpm-handler -socket /tmp/php-fpm-www.sock
  AddHandler php-fastcgi .php
  Action php-fastcgi /php-fpm-handler.fcgi
  ScriptAlias /php-fpm-handler.fcgi /php-fpm-handler
</IfModule>
DirectoryIndex index.php


如果是裝 php5.4 的話,要把下面這些註解掉
#<FilesMatch \.php$>
#    SetHandler application/x-httpd-php
#</FilesMatch>

#php_value session.save_handler "files"
#php_value session.save_path    "/var/lib/php/session"


開啟 php-fpm 並重啟 httpd

$ service php-fpm start
$ service httpd restart

將 php-fpm 設為開機即啟動
$ chkconfig php-fpm on


有裝成功的話打開 phpinfo() 的網頁會看到

Server API
	
FPM/FastCGI


====其他設定=====

如果有設定用 memcached 來記錄 session 的話,要修改
$ vim /etc/php-fpm.d/www.conf
將最下面的
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
改為
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

$ service php-fpm restart



====錯誤解決記錄=====

◎ 若在 make top_dir=/usr/lib64/httpd 出現
Makefile:12: /usr/lib64/httpd/build/special.mk: No such file or directory
make: *** No rule to make target `/usr/lib64/httpd/build/special.mk'.  Stop.
代表沒有裝 httpd-devel ,裝好後就會有 /usr/lib64/httpd/build/special.mk


◎ 瀏覽網頁出現 internal server error
apache的error_log出現
Permission denied: FastCGI: failed to connect to server "/php-fpm-handler": connect() failed
代表apache無法讀取php-fpm產生的socket檔
修改 /etc/php-fpm.d/www.conf 的 listen.owner, listen.group 為apache的user與group


==== 效能調整 ==========
參考 http://blog.haohtml.com/archives/11162 PHP-FPM高负载的解决办法


例如 web server 記憶體有 12G

$ vim /etc/php-fpm.d/www.conf

記憶體有2G的話,可將child process設定改為
預設是
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
;pm.max_requests = 500

改成
pm.max_children = 200
pm.start_servers = 30
pm.min_spare_servers = 30
pm.max_spare_servers = 100
pm.max_requests = 300

修改 rlimit_files = 1024
為 rlimit_files = 2048



修改 apache worker 的設定值
$ vim /etc/httpd/conf/httpd.conf

預設為
<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

修改為
<IfModule worker.c>
ServerLimit         32
StartServers       128
MaxClients        1024
MinSpareThreads    128
MaxSpareThreads    256
ThreadsPerChild     32
MaxRequestsPerChild  1000
</IfModule>

其中 MaxClients = ServerLimit * ThreadsPerChild


 
max_children 若設的太小容易出現 502 Bad gateway
request_terminate_timeout 可設為一個比php.ini的 max_execution_time 還大的值,比較不會出現 502 Bad gateway



--
※ 作者: Knuckles 時間: 2013-03-25 07:22:16
※ 編輯: Knuckles 時間: 2014-05-10 15:46:02
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 1624 
分享網址: 複製 已複製
e)編輯 d)刪除 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇