之前寫過一篇 Ubuntu 16.04 在 Apache2.4 跑 PHP7.0 是用 mod_php 跑來的,而 mod_php 是使用 mpm_prefork 來跑,這篇主要要說的是 mpm_worker,因為 mpm_worker 比起 mpm_prefork 用了多進程、線程的混合模式,預先 fork 了一些子進程去製造線程,mpm_worker 對於大量的存取會比 prefork 有更多可用的線程
*** 如果你會用到 chunked mode 會遇到 HTTP 411,建議使用 mod_fcgid + mpm_worker + php
直接進入安裝的方式
Ubuntu 16.04 安裝 Apache2.4 + mpm_worker + fastcgi + php7.0
Step 1. 安裝 apache2 和 php7.0
$ sudo add-apt-repository ppa:ondrej/php -y $ sudo apt-get update $ sudo apt-get install apache2 libapache2-mod-fastcgi php7.0 php7.0-fpm php7.1-mysql
Step 2. 停用 mod_php 和 mpm_prefork
$ sudo a2dismod php7.0 mpm_prefork
Step 3. 啟動 action、mpm_worker、rewrite
$ sudo a2enmod mpm_worker actions rewrite
Step 4. 建立 fcgi socket
$ sudo touch /usr/lib/cgi-bin/php7.fcgi $ sudo chown www-data:www-data /usr/lib/cgi-bin/php7.fcgi
Step 5. 修改 fastcgi 支援 php-fpm socket
$ sudo tee /etc/apache2/mods-available/fastcgi.conf <<EOF <IfModule mod_fastcgi.c> AddHandler php7.fcgi .php Action php7.fcgi /php7.fcgi Alias /php7.fcgi /usr/lib/cgi-bin/php7.0.fcgi FastCgiExternalServer /usr/lib/cgi-bin/php7.0.fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization -idle-timeout 360 <Directory /usr/lib/cgi-bin> Require all granted </Directory> </IfModule> EOF
Step 6. 建立 index.php 印出 phpinfo 確認。
$ sudo tee /var/www/html/index.php <<EOF <?php phpinfo(); ?> EOF
Step 7. 啟動服務
$ sudo systemctl enable {apache2,php7.0-fpm}
驗證一下 phpinfo 的資訊,搞定。