http://blog.toright.com/posts/3890/%E7% ... BC%81.html
Nginx + PHP-FPM (FastCGI Process Manager)
太多人詬病於 Apache Server 的效能與承載數,紛紛投向 Event-based Server 的懷抱。而近年來 Nginx 蠻紅的 (Nginx 唸 Engine X),Nginx 主要是藉由 Non-blocking 與 epool (linux 2.6 支援) 這些特性,大幅提昇了連線服務量與速度。
但是 Nginx 本身只是單純的 HTTP Server,如果需要執行程式,還得藉助 CGI 的幫忙。我們今天要教學的架構就是將最常使用的 Apache + PHP 改為 Nginx + PHP-FPM,示範的作業系統為 Ubuntu Server。
安裝 Nginx 與 PHP-FPM (傳說中的 LNMP)
CentOS 6.5 沒有內建 Nginx,需透過 EPEL 進行安裝,命令如下:
sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/ ... noarch.rpm
sudo yum install nginx php php-fpm
Ubuntu Server 安裝起來就簡單多了,直接透過 apt 安裝套件,命令如下:
sudo apt-get update
sudo apt-get install nginx nginx-extras php5 php5-fpm
設定 Nginx
順利安裝完之後開始修改 Nginx Server 設定檔,如下:
sudo vim /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
user www-data;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 1024;
pid /run/nginx.pid;
events {
use epoll;
worker_connections 2048;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_names_hash_bucket_size 128;
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
open_file_cache max=102400 inactive=20s;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
介紹幾個重要的參數:
user:Nginx Server 啟動所使用的使用者 (ubuntu 預設用 www-data,CentOS 預設用 nginx)
pid:ProcessID 存放位置 (CentOS 預設在 /var/run/nginx.pid)
worker_processes:開啟的程序數量,請對應 CPU 核心數進行調整(多設無益)
worker_cpu_affinity:每個程序所使用的邏輯核心,所以四核可以這樣設「0001 0010 0100 1000」,當然也可以一次設定兩個核心給同一個程序
worker_rlimit_nofile:每個程序最高可以開啟的檔案數
use epoll:啟動 epoll 會快很多,效果不錯
worker_connections:每個程序最高可以開啟的連線數
access_log, error_log:HTTP Log 存放的位置
接下來設定 Nginx Virtual Host,Ubuntu 請編輯以下檔案:
sudo vim /etc/nginx/sites-available/default
CentOS 則是存放在以下路徑:
sudo vim /etc/nginx/conf.d/default.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
server_name example.toright.com;
root /usr/share/nginx/html;
index index.html index.php index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# set expiration of assets to MAX for caching
location ~* \.(ico|css|js|gif|jpe?g|png|ogg|ogv|svg|svgz|eot|otf|woff)(\?.+)?$ {
expires max;
log_not_found off;
}
server_tokens off;
# framework rewrite
location / {
try_files $uri $uri/ /index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
先說明幾個主要的參數設定:
server_name:同 Apache ServerName 可以用來指定 Virtual Host (虛擬主機)
root:網頁起始位置
server_tokens off:移除 Nginx 版本資訊
中間的「location /」Selection 用「try_files $uri $uri/ /index.php;」來嘗試讀取開啟,如果檔案不存在就轉為呼叫 index.php,做的事情與常用的 Apache Rewrite Module 差不多,這樣設計主要是為了將 Request 導給 Framework (例如 Codeigniter, Zend Framework 等等)。
最後的「location ~* \.php$」Selection 就是設定要將 .php 檔案直接交由 FPM 來處理,詳細的設定說明可以參考 Nginx WIKI。fastcgi_pass 所指向的位置是 PHP-FPM 所開啟的服務,接者我們繼續設定 PHP-FPM。
設定 PHP-FPM
Ubuntu 請編輯 /etc/php5/fpm/pool.d/www.conf 檔案
sudo vim /etc/php5/fpm/pool.d/www.conf
CentOS 則放在 /etc/php-fpm.d/www.conf
sudo vim /etc/php-fpm.d/www.conf
編輯內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.backlog = 65535
listen.owner = www-data
listen.group = www-data
request_terminate_timeout = 600s
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
上述的 listen 就是要讓前面 Nginx fastcgi_pass 來呼叫的服務,可以透過 TCP Socket 或者是 UNIX Kernel Socket,Kernel Socket 速度會比較快,但是經過壓力測試後 Kernel Socket 反而常常會掉包,穩定性不如 TCP Socket 來的優異。其中 request_terminate_timeout 設定也相當重要,表示 PHP 的執行時間,超過這個週期就會結束,設太短常常遇到檔案上傳時間比較久就 GG 了。
最後當然要啟動 Nginx 與 PHP-FPM 服務,如下:
sudo service php-fpm restart
sudo service nginx restart
成功後快開啟瀏覽器試看看吧,我在 CentOS 裝起來的 Nginx Welcome 畫面如下:
nginx-welcome
感想
Nginx 整體來說安裝是蠻容易的,但要調校的好又是另外一件事了,如果設定的不洽當,在高流量時 Nginx 常會送你 502 Bad Gateway。剛開始花蠻多時間嘗試調整參數,搭配效能測試工具來調整,讓伺服器發揮最大效用。
最前面 Ubuntu 有多裝了 nginx-extras 套件,其實是用來擴充 Nginx 功能,如同 Apache Module,例如可以透過 more_clear_headers 設定來移除一些不必要的 HTTP Header 資訊。像是透過以下參數就可以移除 HTTP Response Header 中 Nginx 與 PHP 的版本資訊。
1
2
more_clear_headers 'Server';
more_clear_headers 'X-Powered-By';
nginx configure
前往
- Software
- ↳ CodeCharge Studio
- ↳ CodeCharge
- ↳ DemoCharge
- ↳ SuperPDF
- ↳ 551einv
- ↳ E3進銷存
- 程式語言
- ↳ PHP
- ↳ CodeLobster PHP Edition
- ↳ Yii
- ↳ CodeIgniter
- ↳ Phalcon
- ↳ Symfony
- ↳ FuelPHP
- ↳ Zend Framework 2
- ↳ laravel
- ↳ WordPress
- ↳ ASP.NET/C#
- ↳ ASP/VBScript
- ↳ JSP
- ↳ Java Servlets
- ↳ ColdFusion
- ↳ Perl
- ↳ Java Script
- ↳ jQuery
- ↳ HTML + CSS
- ↳ jQuery
- ↳ nodejs
- ↳ VB6
- ↳ Git
- ↳ App Inventor 2
- ↳ bash
- ↳ C++/ VC/ OpenCV
- ↳ OpenCV
- ↳ go
- ↳ cordova
- ↳ python
- ↳ Xamarin
- ↳ Assembly
- 資料庫
- ↳ MySQL
- ↳ PostgreSQL
- ↳ ORACLE
- ↳ Access
- ↳ SQL Server
- ↳ SQLite
- ↳ MariaDB
- ↳ Mongodb
- 作業系統
- ↳ Linux
- ↳ Ubuntu
- ↳ CentOS
- ↳ Mint
- ↳ Mandriva
- ↳ Debian
- ↳ Red Hat Enterprise Linux
- ↳ Oracle Linux
- ↳ Fedora
- ↳ Kali Linux
- ↳ OpenSUSE
- ↳ Elementary OS
- ↳ Microsoft
- ↳ Server 2008 R2
- ↳ Server 2012 R2
- ↳ Server 2012
- ↳ 8
- ↳ 10
- ↳ System Center 2016
- ↳ NOVELL
- ↳ FreeBSD
- ↳ VMware
- ↳ VirtualBox
- ↳ Mac OS X
- ↳ Solaris
- ↳ iOS
- ↳ Android
- ↳ Cloud
- ↳ OpenStack
- ↳ Docker
- ↳ Proxmox VE
- ↳ CloudReady
- ↳ chrome
- 網頁伺服器
- ↳ apache
- ↳ tomcat
- ↳ nginx
- ↳ IIS
- ↳ JBoss
- ↳ weblogic
- ↳ WebHosting
- 硬體
- ↳ 硬體及週邊
- ↳ RouterOS
- ↳ LEGO NXT
- ↳ Arduino
- ↳ MSP430
- ↳ Raspberry Pi
- ↳ OpenERP
- ↳ Storage
- ↳ Server
- ↳ Brocade
- ↳ MODELS
- ↳ FortiGate
- 軟體
- ↳ sublime
- ↳ LibreNMS