LNMP架構 (Ⅲ)——nginx負載均衡、ssl、php-fpm、慢日誌

LNMP架構 (Ⅲ)

十4、Nginx負載均衡

負載均衡在服務端開發中算是一個比較重要的特性。由於Nginx除了做爲常規的Web服務器外,還會被大規模的用於反向代理前端,由於Nginx的異步框架能夠處理很大的併發請求,把這些併發請求hold住以後就能夠分發給後臺服務端(backend servers,也叫作服務池, 後面簡稱backend)來作複雜的計算、處理和響應,這種模式的好處是至關多的:隱藏業務主機更安全,節約了公網IP地址,而且在業務量增長的時候能夠方便地擴容後臺服務器。php

先建立簡單的負載平衡模塊,配置文件load.conf;html

[root@ying01 ~]# cd /usr/local/nginx/conf/vhost
[root@ying01 vhost]# vim load.conf

upstream qq_com                   //qq_com爲模塊名
{
    ip_hash;                      //負載均衡的算法
    server 61.135.157.156:80;     //默認端口爲80,所以此處80能夠省略          
    server 125.39.240.113:80;
}
server
{
    listen 80;
    server_name www.qq.com;       
    location /
    {
        proxy_pass      http://qq_com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

有個命名能夠查看 dig 域名; 沒有安裝能夠用yum安裝此包:yum install -y bind-utils前端

[root@ying01 vhost]# dig qq.com

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> qq.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56416
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;qq.com.				IN	A

;; ANSWER SECTION:
qq.com.			334	IN	A	111.161.64.40
qq.com.			334	IN	A	111.161.64.48

;; Query time: 70 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: 日 7月 08 22:52:14 CST 2018
;; MSG SIZE  rcvd: 67

如今用curl -x測試www.qq.com,此時任意域名都會轉到默認虛擬主機上;linux

[root@ying01 vhost]# curl -x127.0.0.1:80 www.qq.com
this is the default site.
[root@ying01 vhost]# curl -x127.0.0.1:80 www.q.com 
this is the default site.

檢查load.conf配置文件語法,並加載nginx

[root@ying01 vhost]# /usr/local/nginx/sbin/nginx -t
[root@ying01 vhost]# /usr/local/nginx/sbin/nginx -s reload

咱們再curl -x測試www.qq.com,此時能夠經過本身的機器能訪問騰訊網站。說明代理成功。web

[root@ying01 vhost]# curl -x127.0.0.1:80 www.qq.com -I
HTTP/1.1 200 OK
Server: nginx/1.4.7
Date: Sun, 08 Jul 2018 15:30:43 GMT
Content-Type: text/html; charset=GB2312
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
Expires: Sun, 08 Jul 2018 15:31:43 GMT
Cache-Control: max-age=60
Vary: Accept-Encoding
Vary: Accept-Encoding
X-Cache: HIT from tianjin.qq.com

負載均衡擴展:算法

Nginx負載均衡(工做在七層「應用層」)功能主要是經過upstream模塊實現,Nginx負載均衡默認對後端服務器有健康檢測的能力,僅限於端口檢測,在後端服務器比較少的狀況下負載均衡能力表現突出。vim

Nginx的幾種負載均衡算法:windows

一、輪詢(默認):每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,則自動剔除故障機器,使用戶訪問不受影響。後端

二、weight:指定輪詢權重,weight值越大,分配到的概率就越高,主要用於後端每臺服務器性能不均衡的狀況。

三、ip_hash:每一個請求按訪問IP的哈希結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠有效的解決動態網頁存在的session共享問題。

四、fair(第三方):更智能的一個負載均衡算法,此算法能夠根據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。若是想要使用此調度算法,須要Nginx的upstream_fair模塊。

五、url_hash(第三方):按訪問URL的哈希結果來分配請求,使每一個URL定向到同一臺後端服務器,能夠進一步提升後端緩存服務器的效率。若是想要使用此調度算法,須要Nginx的hash軟件包。

在upstream模塊中,能夠經過server命令指定後端服務器的IP地址和端口,同時還能夠設置每臺後端服務器在負載均衡調度中的狀態,經常使用的狀態有如下幾種:

一、down:表示當前server暫時不參與負載均衡。

二、backup:預留的備份機,當其餘全部非backup機器出現故障或者繁忙的時候,纔會請求backup機器,這臺機器的訪問壓力最輕。

三、max_fails:容許請求的失敗次數,默認爲1,配合fail_timeout一塊兒使用

四、fail_timeout:經歷max_fails次失敗後,暫停服務的時間,默認爲10s(某個server鏈接失敗了max_fails次,則nginx會認爲該server不工做了。同時,在接下來的 fail_timeout時間內,nginx再也不將請求分發給失效的server。)

一個負載均衡器的名稱爲whsirserver,這個名稱能夠本身定義,在後面proxy_pass直接調用便可。

proxy_next_upstream參數用來定義故障轉移策略,當後端服務器節點返回500、502和執行超時等錯誤時,自動將請求轉發到upstream負載均衡器中的另外一臺服務器,實現故障轉移。

十6、ssl原理

瀏覽器發送一個https的請求給服務器; 服務器要有一套數字證書,能夠本身製做,也能夠向組織申請,區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出>提示頁面,這套證書其實就是一對公鑰和私鑰; 服務器會把公鑰傳輸給客戶端; 客戶端(瀏覽器)收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,並用收到的公鑰加密; 客戶端把加密後的隨機字符串傳輸給服務器; 服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數後,再用這串隨機字符串加密傳輸的數據(該加密爲對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串>經過某種算法混合在一塊兒,這樣除非知道私鑰,不然沒法獲取數據內容); 服務器把加密後的數據傳輸給客戶端; 客戶端收到數據後,再用本身的私鑰也就是那個隨機字符串解密;

擴展:https協議詳解

十7、生產ssl密鑰對

生成key即「私鑰」:openssl genrsa

[root@ying01 ~]# cd /usr/local/nginx/conf/
[root@ying01 conf]# rpm -qf `which openssl`                     //查看openssl是哪一個安裝包,沒有此命令,則安裝
openssl-1.0.2k-12.el7.x86_64 
[root@ying01 conf]# openssl genrsa -des3 -out tmp.key 2048     //生成私鑰tmp.key,長度爲2048
Generating RSA private key, 2048 bit long modulus
............+++
...........................................+++
e is 65537 (0x10001)
Enter pass phrase for tmp.key:                                    //須要設置私鑰的密碼
Verifying - Enter pass phrase for tmp.key:
[root@ying01 conf]# openssl rsa -in tmp.key -out yinglinux.key    //把tmp.key改成yinglinux.key
Enter pass phrase for tmp.key:
writing RSA key
[root@ying01 conf]# rm -f tmp.key                                 //由於兩個同樣,則刪除tmp.key

本身設置一個證書;

[root@ying01 conf]# openssl req -new -key yinglinux.key -out yinglinux.csr   //生成證書的請求文件
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ZH                                   //定義國家名,如下能夠本身填寫
State or Province Name (full name) []:shenzhen    
Locality Name (eg, city) [Default City]:shenzhen 
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ying
Email Address []:txwd214@126.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:www123
An optional company name []:www123
[root@ying01 conf]# openssl x509 -req -days 365 -in yinglinux.csr -signkey yinglinux.key -out yinglinux.crt
Signature ok                             //用私鑰和剛纔生成的文件,一塊兒生成公鑰
subject=/C=ZH/ST=shenzhen/L=shenzhen/O=Default Company Ltd/CN=ying/emailAddress=txwd214@126.com
Getting Private key

查看生成的yinglinux的證書文件,其實購買SSL證書主要獲得下面兩個文件,有了這兩個文件就能夠配置nginx;

[root@ying01 conf]# ls |grep yinglinux
yinglinux.crt          //公鑰       
yinglinux.csr          
yinglinux.key          //私鑰

十8、Nginx配置ssl

[root@ying01 conf]# cd vhost/
[root@ying01 vhost]# vim /usr/local/nginx/conf/vhost/ssl.conf  

server
{
    listen 443;
    server_name ying.com;
    index index.html index.php;
    root /data/wwwroot/ying.com;
    ssl on;
    ssl_certificate yinglinux.crt;
    ssl_certificate_key yinglinux.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

編輯完ssl配置文件,此時檢查語法,發現當前Nginx並不支持SSL,由於當時輯Nginx編譯時並無配置支持SSL的參數;

[root@ying01 vhost]# mkdir /data/wwwroot/ying.com
[root@ying01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@ying01 vhost]# /usr/local/nginx/sbin/nginx -V       //查看nginx版本號
nginx version: nginx/1.4.7
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
configure arguments: --prefix=/usr/local/nginx
[root@ying01 vhost]# cd /usr/local/src/nginx-1.4.7/            
[root@ying01 nginx-1.4.7]# ./configure --help |grep -i ssl        //查找ssl
  --with-http_ssl_module             enable ngx_http_ssl_module
  --with-mail_ssl_module             enable ngx_mail_ssl_module
  --with-openssl=DIR                 set path to OpenSSL library sources
  --with-openssl-opt=OPTIONS         set additional build options for OpenSSL
[root@ying01 nginx-1.4.7]#

配置ssl模塊,而後編譯、安裝

[root@ying01 nginx-1.4.7]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module

[root@ying01 nginx-1.4.7]# make

[root@ying01 nginx-1.4.7]# make install

檢查語法、重啓服務,查看監聽端口,此時會出現443端口;

[root@ying01 nginx-1.4.7]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@ying01 nginx-1.4.7]# /etc/init.d/nginx start
Starting nginx (via systemctl):                            [  肯定  ]
[root@ying01 nginx-1.4.7]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      656/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      802/master          
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      3927/nginx: master  
tcp6       0      0 :::22                   :::*                    LISTEN      656/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      802/master

測試

[root@ying01 vhost]# cd /data/wwwroot/ying.com/
[root@ying01 ying.com]# vim index.html                                   //建立一個測試網頁
[root@ying01 ying.com]# curl -x127.0.0.1:443 https://ying.com/           //要是這樣,是訪問不到的;
curl: (56) Proxy CONNECT aborted
[root@ying01 ying.com]# vim /etc/hosts                                   //配置hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.112.136 www.qq.com www.baidu.com www.126.com
113.108.182.52  www.hao123.com www.baidu.com
127.0.0.1  ying.com                                    //添加此行

此時能夠直接:curl https://ying.com/ ;可是證書是我本身頒發的,有點不合法;

[root@ying01 ying.com]# curl https://ying.com/                          
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

此時在windows下瀏覽器測試;

假如在瀏覽器:https://ying.com 此時無反應,則須要清除規則;或者增長一個443的端口

[root@ying01 ying.com]# iptables -F

再看一個著名的,本身給本身頒發的網站

十9、php-fpm相關知識

19.1 php-fpm的pool

Nginx能夠配置多個虛擬主機,php-fpm配置文件php-fpm.conf能夠設置多個pool,每一個pool能夠監聽一個端口,在其中一個pool資源耗盡,會致使其餘站點沒法訪問資源,報502錯誤。有必要把站點進行分離,分別使用單獨的pool。

在php-fpm配置文件中添加一個ying.com的池子;

[root@ying01]# cd /usr/local/php-fpm/etc/
[root@ying01 etc]# vim php-fpm.conf

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

[ying.com]                         //增長一個池子
listen = /tmp/ying.sock
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

檢查語法,並重啓php-fpm

[root@ying01 etc]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jul-2018 11:15:08] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@ying01 etc]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

查看進程,此時 有兩個池子,其中一個就是ying.com

[root@ying01 etc]# ps aux |grep php-fpm
root      4529  0.1  0.2 227304  4968 ?        Ss   11:15   0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm   4530  0.0  0.2 227244  4716 ?        S    11:15   0:00 php-fpm: pool www
php-fpm   4531  0.0  0.2 227244  4716 ?        S    11:15   0:00 php-fpm: pool www
php-fpm   4532  0.0  0.2 227244  4716 ?        S    11:15   0:00 php-fpm: pool www
php-fpm   4533  0.0  0.2 227244  4716 ?        S    11:15   0:00 php-fpm: pool www
php-fpm   4534  0.0  0.2 227244  4720 ?        S    11:15   0:00 php-fpm: pool www
php-fpm   4565  0.0  0.2 227244  4728 ?        S    11:15   0:00 php-fpm: pool ying.com
php-fpm   4566  0.0  0.2 227244  4728 ?        S    11:15   0:00 php-fpm: pool ying.com
php-fpm   4567  0.0  0.2 227244  4728 ?        S    11:15   0:00 php-fpm: pool ying.com
php-fpm   4568  0.0  0.2 227244  4728 ?        S    11:15   0:00 php-fpm: pool ying.com
php-fpm   4569  0.0  0.2 227244  4732 ?        S    11:15   0:00 php-fpm: pool ying.com
root      4573  0.0  0.0 112720   984 pts/0    S+   11:15   0:00 grep --color=auto php-fpm

虛擬主機裏面設置

[root@ying01 vhost]# vim aaa.com.conf 

server
{
    listen 80 default_server;
    server_name aaa.com;
    index index.html index.htm index.php;
    root /data/wwwroot/default;

     location ~ \.php$
     {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/ying.sock;                 //定義池子
        fastcgi_index index.php;        
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
      }
}
[root@ying01 vhost]# cd /usr/local/php-fpm/etc/
[root@ying01 etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini
[root@ying01 etc]# vim php-fpm.conf                        //編輯php-fpm主配置文件


[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf                           //增長此行,刪除後面的池子,至關於一個模塊名

建立 www.conf 配置文件,就至關於以前的www池子

[root@ying01 etc]# mkdir php-fpm.d         //根據php-fpm配置文件建立相應目錄
[root@ying01 etc]# cd php-fpm.d/
[root@ying01 php-fpm.d]# vim www.conf

[www]
listen = /tmp/php-fcgi.sock
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

建立 ying.com.conf 配置文件,就至關於以前的一個池子

[root@ying01 php-fpm.d]# vim ying.com.conf 


[ying.com]
listen = /tmp/ying.sock
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

查看php-fpm.conf內容,只有三行,其他的兩個池子,被分紅兩個文件;

[root@ying01 php-fpm.d]# cat ../php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf
[root@ying01 php-fpm.d]# ls
www.conf  ying.com.conf

檢查語法,並重啓服務

[root@ying01 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jul-2018 12:05:08] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@ying01 php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

在查看進程,一樣有兩個池子;

[root@ying01 php-fpm.d]# ps aux |grep php-fpm
root      5048  0.4  0.2 227332  4984 ?        Ss   12:05   0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm   5049  0.0  0.2 227272  4724 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5050  0.0  0.2 227272  4724 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5051  0.0  0.2 227272  4724 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5052  0.0  0.2 227272  4724 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5053  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5054  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5055  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5056  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5057  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5058  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5059  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5060  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5061  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5062  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5063  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5064  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5065  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5066  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5067  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5068  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool www
php-fpm   5069  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5070  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5071  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5072  0.0  0.2 227272  4728 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5073  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5074  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5075  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5076  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5077  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5078  0.0  0.2 227272  4732 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5079  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5080  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5081  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5082  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5083  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5084  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5085  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5086  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5087  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
php-fpm   5088  0.0  0.2 227272  4736 ?        S    12:05   0:00 php-fpm: pool ying.com
root      5090  0.0  0.0 112720   984 pts/0    S+   12:05   0:00 grep --color=auto php-fpm

19.2 php-fpm慢執行日誌

php網站,建議使用lnmp架構的一個好處就是查看「慢日誌」,爲何這麼說呢?當咱們的客戶或者manager發現站點訪問速度點慢,若是所有的負載均不是很高,一切正常仍是慢,怎麼辦?那惟一的辦法就是檢查「慢日誌」,慢日誌會向咱們詳細的展現某個頁面的多少行代碼在執行過程當中超過了咱們設定的閥值!

在www.conf配置文件中,加上最後兩行內容;

[root@ying01 php-fpm.d]# vim www.conf 

[www]
listen = /tmp/php-fcgi.sock
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
request_slowlog_timeout = 2                            //超過2秒就記錄
slowlog = /usr/local/php-fpm/var/log/www_slow.log      //定義日誌內容的目錄

重啓服務後,查看指定的目錄是否是生成 www_slow.log 日誌

[root@ying01 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[08-Jul-2018 12:21:52] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@ying01 php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

[root@ying01 php-fpm.d]# ls  /usr/local/php-fpm/var/log
php-fpm.log  www_slow.log

如今模擬超過2秒的試驗

[root@ying01 php-fpm.d]# vim /data/wwwroot/test.com/sleep.php
[root@ying01 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php           //成功
slowlog test!done[root@ying01 php-fpm.d]# 
[root@ying01 php-fpm.d]# cat /usr/local/php-fpm/var/log/www_slow.log      //查看慢日誌

[08-Jul-2018 12:28:57]  [pool www] pid 5232                
script_filename = /data/wwwroot/test.com/sleep.php                        //這個文件慢
[0x00007f9461b2a270] sleep() /data/wwwroot/test.com/sleep.php:3           //這個文件的第三行
[root@ying01 php-fpm.d]# cat /data/wwwroot/test.com/sleep.php 
<?php 
echo "slowlog test!"; 
 sleep(3);                                                                //第三行,休眠3秒
echo "done";
?>

19.3 open_basedir

若是一個server有不少個web服務,那麼不建議直接把open_basedir直接配置在php.ini中了。Appache能夠針對每一個虛擬主機設置一個Open_basedir,php-fpm一樣也能夠針對不一樣的pool設置不一樣的Open_basedir.

再www.conf配置文件中,添加:php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

此處須要注意:目錄下對應的是test.com;由於www池子,也就是www.conf對應的是test.com這個虛擬主機

location ~ \.php$
      {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;             //注意:php-fcgi.sock
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
      }

編輯www.conf配置文件

[root@ying01 php-fpm.d]# vim www.conf   


[www]
listen = /tmp/php-fcgi.sock   //注意:此處與虛擬主機對應
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
request_slowlog_timeout = 2
slowlog = /usr/local/php-fpm/var/log/www_slow.log
php_admin_value[open_basedir]=/data/wwwroot/test.com/:/tmp/      //添加此行,限制在test.com和、tmp目錄下

重啓服務後,測試成功

[root@ying01 php-fpm.d]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@ying01 php-fpm.d]# !curl
curl -x127.0.0.1:80 test.com/sleep.php
slowlog test!done[root@ying01 php-fpm.d]# 

[root@ying01 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I
HTTP/1.1 200 OK
Server: nginx/1.4.7
Date: Mon, 08 Jul 2018 05:09:15 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.32

參考筆記php文件包含目錄配置open_basedir的使用與性能詳解

19.4 php-fpm進程管理

[www]
listen = /tmp/php-fcgi.sock   
#listen =127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
request_slowlog_timeout = 2

解釋:

  • pm = dynamic:動態進程管理,也能夠是static

  • pm.max_children = 50 : 最大子進程數

  • pm.start_servers = 20 : 啓動服務時會啓動的進程數

  • pm.min_spare_servers = 5 : 定義在空閒時段,子進程數的最少值,若是達到這個值,php-fpm服務會自動派生新的子進程

  • pm.max_spare_servers = 35 : 定義在空閒時段,子進程數的最大值,若是高於這個值,php-fpm服務會清理空閒的子進程

  • pm.max_requests = 500 :定義一個字進程最多能夠處理多少個進程,這裏設置成500,也就是說在一個php-fpm的子進程最多能夠處理500個,若達到這個數值時,它就會自動退出。

  • rlimit_files = 1024 :設置文件打開描述符的rlimit限制. 默認值: 系統定義值 系統默承認打開句柄是1024,可以使用 ulimit -n查看,ulimit -n 2048修改(臨時修改)。

相關文章
相關標籤/搜索