負載均衡在服務端開發中算是一個比較重要的特性。由於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負載均衡器中的另外一臺服務器,實現故障轉移。
瀏覽器發送一個https的請求給服務器; 服務器要有一套數字證書,能夠本身製做,也能夠向組織申請,區別就是本身頒發的證書須要客戶端驗證經過,才能夠繼續訪問,而使用受信任的公司申請的證書則不會彈出>提示頁面,這套證書其實就是一對公鑰和私鑰; 服務器會把公鑰傳輸給客戶端; 客戶端(瀏覽器)收到公鑰後,會驗證其是否合法有效,無效會有警告提醒,有效則會生成一串隨機數,並用收到的公鑰加密; 客戶端把加密後的隨機字符串傳輸給服務器; 服務器收到加密隨機字符串後,先用私鑰解密(公鑰加密,私鑰解密),獲取到這一串隨機數後,再用這串隨機字符串加密傳輸的數據(該加密爲對稱加密,所謂對稱加密,就是將數據和私鑰也就是這個隨機字符串>經過某種算法混合在一塊兒,這樣除非知道私鑰,不然沒法獲取數據內容); 服務器把加密後的數據傳輸給客戶端; 客戶端收到數據後,再用本身的私鑰也就是那個隨機字符串解密;
擴展:https協議詳解
生成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 //私鑰
[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
再看一個著名的,本身給本身頒發的網站
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
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"; ?>
若是一個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的使用與性能詳解
[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修改(臨時修改)。