LNMP(三)Nginx負載均衡、ssl、php-fpm的pool及慢執行日誌、open_basedir、php-fpm進程管理

 

任務列表:
12.17 Nginx負載均衡
12.18 ssl原理
12.19 生成ssl密鑰對
12.20 Nginx配置ssl
12.21 php-fpm的pool
12.22 php-fpm慢執行日誌
12.23 open_basedir
12.24 php-fpm進程管理

擴展
ssl相關php

http://www.javashuo.com/article/p-razjcjww-hu.html
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ca.md
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ssl.md
負載均衡
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/lb.md
nginx算法分析https://blog.whsir.com/post-1482.html
root和alias
http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/html

 

1 負載均衡:https://github.com/aminglinux/nginx/blob/master/proxy/lb.md前端

2 反向代理:相關緩存設置 https://github.com/aminglinux/nginx/blob/master/proxy/bu_ca.mdlinux

3.正向代理:https://github.com/aminglinux/nginx/blob/master/proxy/z_proxy.mdnginx

對於LNMP中的php-fom,掌握:

1 查php-fpm的slow log

2 配置php的錯誤日誌(error_log log_error display_error error_reporting)

 

 

1、Nginx負載均衡git

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

使用 dig 查看域名; 沒有安裝能夠用yum安裝此包:yum install -y bind-utilsweb

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

cd /usr/local/nginx/conf/vhostvim

vim /usr/local/nginx/conf/vhost/load.conf

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

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

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

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

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

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

負載均衡擴展:
Nginx負載均衡(工做在七層「應用層」)功能主要是經過upstream模塊實現,Nginx負載均衡默認對後端服務器有健康檢測的能力,僅限於端口檢測,在後端服務器比較少的狀況下負載均衡能力表現突出。
Nginx的幾種負載均衡算法:
一、輪詢(默認):每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,則自動剔除故障機器,使用戶訪問不受影響。
二、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負載均衡器中的另外一臺服務器,實現故障轉移。

2、ssl原理

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

3、生成SSL密鑰對

cd /usr/local/nginx/conf/      公鑰和私鑰放到該目錄下

生成key即「私鑰」:openssl genrsa

rpm -qf `which openssl`     //查看openssl是哪一個安裝包,沒有此命令,則安裝

openssl genrsa -des3 -out tmp.key 2048 //生成私鑰tmp.key,長度爲2048

openssl rsa -in tmp.key -out tobe.key     //轉換key,取消密碼,in指定哪一個密鑰轉換,指定輸出

rm -f tmp.key //由於兩個同樣,則刪除tmp.key

本身設置一個證書;

openssl req -new -key tobe.key -out tobe.csr        //生成證書請求文件,須要拿這個文件和私鑰一塊兒生產公鑰文件

openssl x509 -req -days 365 -in tobe.csr -signkey tobe.key -out tobe.crt        //用私鑰和剛纔生成的文件,一塊兒生成公鑰

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

tobe.crt //公鑰

tobe.csr

tobe.key //私鑰

4、Nginx配置ssl

mkdir /data/wwwroot/tobe.com  建立目錄

vim /usr/local/nginx/conf/vhost/ssl.conf        //加入以下內容

server

{

listen 443;    

server_name tobe.com;

index index.html index.php;

root /data/wwwroot/tobe.com;

ssl on;        開啓ssl,支持https

ssl_certificate tobe.crt;    指定公鑰
    
ssl_certificate_key tobe.key;        指定私鑰

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    協議,三種都配置

}

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

/usr/local/nginx/sbin/nginx -V         //查看nginx版本號

./configure --help |grep -i ssl //查找ssl

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

./configure --prefix=/usr/local/nginx --with-http_ssl_module
make & make install

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

測試

cd /data/wwwroot/tobe.com/

vim index.html //建立一個測試網頁

curl -x127.0.0.1:443 https://tobe.com/ //要是這樣,是訪問不到的;

vim /etc/hosts //配置hosts

此時能夠直接:curl https://tobe.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://tobe.com 此時無反應,則須要清除規則;或者增長一個443的規則

iptables -F

5、php-fpm的pool

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

/usr/local/php-fpm/etc/

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

vim php-fpm.conf

[tobe.com]
listen = /tmp/tobe.sock
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

/usr/local/nginx/sbin/nginx -t
/etc/init.d/php-fpm reload

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

虛擬主機裏面設置

cd /usr/local/nginx/conf/vhost

vim aaa.com.conf

location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/tobe.sock; //定義池子
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}

cd /usr/local/php-fpm/etc/

vim php-fpm.conf //編輯php-fpm主配置文件

global中增長此行,刪除後面的池子,至關於一個模塊名,並把以前的內容保存

include = etc/php-fpm.d/*.conf

mkdir php-fpm.d     //根據php-fpm配置文件建立相應目錄

進入目錄,建立vim www.conf,把以前刪除的www粘貼進來

建立tobe.com.conf,粘貼以前的tobe.com內容

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

檢查語法,並重啓服務

/usr/local/nginx/sbin/nginx -t

 /etc/init.d/php-fpm reload

在查看進程,一樣有兩個池子,順序改變

6、php-fpm慢執行日誌

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

針對www.conf

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

request_slowlog_timeout = 1         超過1秒就記錄,能夠寫成2秒,1-2之間

slowlog = /usr/local/php-fpm/var/log/www-slow.log        //定義日誌內容的目錄

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

/usr/local/php-fpm/sbin/php-fpm -t

/etc/init.d/php-fpm reload

 ls /usr/local/php-fpm/var/log/

模擬一個慢執行的php

vim /data/wwwroot/test.com/sleep.php  建立一個sleep.php

<?php 
echo "test slow log";
sleep(2);
echo 「done」;
?>

curl -x127.0.0.1:80 test.com/sleep.php         //執行成功,返回test slow log

cat /usr/local/php-fpm/var/log/www-slow.log //查看慢日誌

 

提示第三行報錯,超過1秒

7、open_basedir

若是一個server有不少個web服務,那麼不建議直接把open_basedir直接配置在php.ini中了。Apache能夠針對每一個虛擬主機設置一個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配置文件

[www]    
listen = /tmp/php-fcgi.sock        //注意:此處與虛擬主機對應
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 = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log
php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/        //添加此行,限制在test.com和、tmp目錄下

重啓服務後,測試成功

 curl -x127.0.0.1:80 test.com/3.php -I

參考筆記:https://www.jb51.net/article/110264.htm

8、php-fpm進程管理

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

pm.max_children = 50 //最大子進程數,ps aux能夠查看

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

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

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

pm.max_requests = 500 //定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程最多能夠處理這麼多請求,當達到這個數值時,它會自動退出。

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