建立PHP7-FPM與Nginx的高效能網站伺服器

Nginx網站伺服器功能強大, 加上PHP 7性能大幅躍進, 本文將實作如何在Linux上建立執行PHP應用程式的網站伺服器, 我們將採用Debian Linux, 流行的PHP-FPM (FastCGI Process Manager), 並且使用已編譯的deb包, 完全不需要再花時間編譯PHP 7與Nginx

建立PHP7-FPM與Nginx的高效能網站伺服器
首先需要一台Debian 8, 我這裡使用VMware建立虛擬機, 各位可在自己的主機或AWS, Google Cloud Platform的虛擬機上很容易的安裝好Debian

完成機器的作業系統安裝後, 接著就是將網路上提供的PHP 7 Package與Nginx官方提供最新版軟體加入到Debian軟體Source List
PHP 7可參考https://www.dotdeb.org/instructions/, 他們提供了PHP 7最新版已編譯好的軟體

執行
wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg


建立PHP7-FPM與Nginx的高效能網站伺服器
將dotdeb的金鑰加入

Nginx官方一樣有編譯好的軟體, 同樣需要加入金鑰, 請參考https://nginx.org/en/linux_packages.html#mainline

執行
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key


建立PHP7-FPM與Nginx的高效能網站伺服器
將nginx的金鑰加入

*其實dotdeb與Nginx都是提供HTTPS的金鑰URL, 用wget抓會出錯, 那就需要先裝上cURL
apt-get install curl


接著將PHP 7與Nginx加入Debian系統的軟體Sources List
執行
nano /etc/apt/sources.list


建立PHP7-FPM與Nginx的高效能網站伺服器
將兩者的軟體URL加入
# PHP 7
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

# Nginx
deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx


儲存Sources List後, 需要更新它
執行
apt-get update
apt-get upgrade


建立PHP7-FPM與Nginx的高效能網站伺服器
有些系統檔案可能會順便更新

建立PHP7-FPM與Nginx的高效能網站伺服器
通常apt-get會詢問是否確定更新, 按下"y"鍵繼續

安裝PHP 7, 我們採用PHP-FPM, 另外PHP MySQL模組也需要安裝, 絕大部分應用軟體都會用到MySQL資料庫伺服器(本文這裡就不再提怎麼安裝MySQL伺服器了)
執行
apt-get install php-fpm php-mysql


建立PHP7-FPM與Nginx的高效能網站伺服器
PHP CLI也會一起安裝, 方便你檢視PHP的一些資訊, Zend OPcache模組也已啟動, 這是加速PHP的好物! 目前是PHP 7.0.13

安裝Nginx網站伺服器
執行
apt-get install nginx

建立PHP7-FPM與Nginx的高效能網站伺服器
Nginx 1.11.6安裝完成, 日後Nginx推出新版, 版號會更新, Nginx支援最新的HTTP 2協定, 設定上也簡單!

系統先調整參數
執行
nano /etc/sysctl.conf


將以下的設定值貼入sysctl.conf

net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
fs.file-max = 8192000
kernel.shmall = 134217728
kernel.shmmax = 134217728
net.core.rmem_max = 2088290
net.core.wmem_max = 1048576
net.core.rmem_default = 262143
net.core.wmem_default = 262143
net.core.netdev_max_backlog = 819200
net.ipv4.tcp_max_syn_backlog = 819200
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_rmem = 4096 87380 524288
net.ipv4.tcp_wmem = 4096 65536 524288
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.forwarding = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.neigh.default.gc_thresh3 = 20480
net.ipv4.neigh.default.gc_thresh2 = 15360
net.ipv4.neigh.default.gc_thresh1 = 10240
net.unix.max_dgram_qlen = 512
vm.overcommit_memory = 1
net.ipv4.tcp_max_syn_backlog = 819200
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_syncookies = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 65535


接著執行以下命令讓設定生效
sysctl -p


接著來設定Nginx可以與PHP通訊
nano /etc/nginx/nginx.conf


修改Nginx的執行身分
user www-data;


使用epoll
events {
use epoll;
worker_connections 65535;
}


把Nginx版號隱藏, 並且使用gzip壓縮靜態檔案(像是HTML, CSS, JavaScript...檔案)
server_tokens  off;
gzip on;
gzip_disable "msie6";


接著修改PHP的FPM設定
執行
nano /etc/php/7.0/fpm/pool.d/www.conf


PHP-FPM可使用TCP/IP或Unix Socket方式通訊, PHP跟Nginx都在同一台機器, 那預設的Unix Socket路徑就不用去動它了
listen = /run/php/php7.0-fpm.sock


確認PHP-FPM的執行身分
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

預設的"listen.mode = 0660"是被關閉的, 把這項設定值打開(移除註解的分號即可)

修改Nginx的預設網站設定
nano /etc/nginx/conf.d/default.conf


如果已經準備好要跑HTTP 2, 需要有效的網站憑證與私鑰
編輯
listen       80;
listen 443 default_server ssl http2;
server_name localhost;

ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;

location ~ \.php$ {
root /usr/share/nginx/html;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}


Nginx的預設網站目錄是"/usr/share/nginx/html", 當然你也能修改為自己的目錄, 如果不需要跑HTTPS或HTTP 2, 那麼"litsen 443"與ssl的相關設定就不需要放上

寫個簡單小程式
nano /usr/share/nginx/html/index.php


輸入
<?php echo 'Hello World!'; ?>


建立PHP7-FPM與Nginx的高效能網站伺服器
稍後看看網站是不是能顯示"Hello World!", 確定PHP-FPM與Nginx動作正常

啟動PHP-FPM
/etc/init.d/php7.0-fpm start


重新啟動Nginx, 因為安裝Nginx時它預設就啟動了
/etc/init.d/nginx restart


如果有錯誤訊息, 可查看Nginx的Error Log (/var/log/nginx/error.log), 看哪裡出了問題

打開瀏覽器, 輸入網站域名或IP位址

建立PHP7-FPM與Nginx的高效能網站伺服器
PHP程式正確的執行了

建立PHP7-FPM與Nginx的高效能網站伺服器
或是可用phpinfo()查看系統裝了哪些模組, 不足的可以再補充安裝

建立PHP7-FPM與Nginx的高效能網站伺服器

建立PHP7-FPM與Nginx的高效能網站伺服器
PHP 7不再使用libmysqlclient, 所以只有mysqli與pdo_mysql的相關函數可用, 基本上大多的應用程式都支援, 像是WordPress在第4.4版後都能在PHP 7上正確執行

PHP-FPM其實有些細節效能調整, 網路上有許多資訊可參考, 在以上範例就是調整"/etc/php/7.0/fpm/pool.d/www.conf"內的設定值
2016-11-24 14:21 發佈
Ryan 只要嗆出 Mobile01就是使用PHP7+Nginx就可以了
這樣這篇就會爆了
https://medium.com/@ln1202
還沒改啦, 其實以前是計劃用HHVM
Ln wrote:
Ryan 只要嗆出 ...(恕刪)
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?