第二十五章 Nginx效能優化
阿新 • • 發佈:2022-01-11
一、效能優化概述
1.我們需要了解
1、首先需要了解我們當前系統的結構和瓶頸,瞭解當前使用的是什麼,執行的是什麼業務,都有哪些服務,瞭解每個服務最大能支撐多少併發。比如nginx作為靜態資源服務併發是多少,最高瓶頸在哪裡,能支援多少qps(每秒查詢率)的訪問請求,那我們怎麼得出這組系統結構瓶頸呢,比如top檢視系統的CPU負載、記憶體使用率、總得執行程序等,也可以通過日誌去分析請求的情況,當然也可以通過我們前面介紹到的stub_status模組檢視當前的連線情況,也可以對線上的業務進行壓力測試(低峰期),去了解當前這套系統能承擔多少的請求和併發,已做好響應的評估。這個是我們做效能優化最先考慮的地方。 2、其次我們需要了解業務模式,雖然我們是做效能優化,但每一個性能的優化都是為業務所提供的服務的,我們需要了解每個業務介面的型別,比如:電商網站中的搶購模式,這種情況下面,平時沒什麼流量,但到了搶購時間流量會突增。 我們還需要了解系統層次化的結構,比如:我們使用nginx做的是代理、還是動靜分離、還是後端直接服務使用者,那麼這個就需要我們對每一層做好相應的梳理。以便更好的服務業務。 3、最後我們需要考慮效能與安全,往往注重了效能,但是忽略了安全。往往過於注重安全,對效能又會產生影響。比如:我們在設計防火牆功能時,檢測過於嚴密,這樣就會給效能帶來影響。那麼如果對於效能完全追求,卻不顧服務的安全,這個也會造成很大的隱患,所以需要評估好兩者的關係,把握好兩者的孰重孰輕。以及整體的相關性,權衡好對應的點。 1.需要了解我們當前系統的結構和瓶頸 2.我們需要了解業務模式 3.我們還需要了解系統層次化的結構 4.需要考慮效能與安全
2.從那些方面入手
OSI七層模型:物理層,資料鏈路層,網路層,傳輸層,會話層,表示層,應用層
1.硬體:磁碟,記憶體,CPU
2.網路:頻寬,網速,丟包,延遲
3.系統:檔案描述符(檔案控制代碼數)
4.應用:服務與服務之間保持長連線
5.服務:nginx、MySQL、php
3.影響效能的指標
1.網路
1)網路的流量
2)是否有丟包
3)http請求速度
2.系統、硬體
1)硬體損壞
2)cpu、記憶體、硬碟 壓力
3.服務
1)連線優化
4.程式
1)介面
2)處理速度
3)執行效率
5.資料庫
二、壓力測試工具 ab
1.安裝ab工具
#檢視命令所在包 [root@web02 /server]# yum provides ab #安裝ab [root@web02 /server]# yum install -y httpd-tools
2.工具使用
[root@web01 ~]# ab -n 200 -c 2 http://linux.try.com/
-n 請求次數
-c 請求的併發數
-k 保持長連線
#語法
Usage: ab [options] [http[s]://]hostname[:port]/path
3.配置網站
[root@web01 ~]# vim /etc/nginx/conf.d/t_file.conf server { listen 80; server_name linux.try.com; location / { root /code/try; #index index.html index.htm; try_files $uri $uri/ @java; } location @java { proxy_pass http://172.16.1.8:8080; } } #配置 hosts [root@web01 ~]# vim /etc/hosts 10.0.0.7 linux.try.com
4.ab測試nginx請求靜態頁
[root@web01 ~]# ab -n 20000 -c 20 http://linux.try.com/
Concurrency Level: 20
Time taken for tests: 1.639 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Total transferred: 5120000 bytes
HTML transferred: 220000 bytes
Requests per second: 12200.40 [#/sec] (mean)
Time per request: 1.639 [ms] (mean)
Time per request: 0.082 [ms] (mean, across all concurrent requests)
Transfer rate: 3050.10 [Kbytes/sec] received
5.安裝tomcat
#1.下載或上傳tomcat包
[root@web01 ~]# mkdir /server
[root@web01 ~]# cd /server
[root@web01 server]# rz apache-tomcat-9.0.30.tar.gz
#2.解壓程式碼包
[root@web01 server]# tar xf apache-tomcat-9.0.30.tar.gz
#3.配置java環境
1.上傳並解壓至指定資料夾
[root@web01 server]# tar xf jdk-8u40-linux-x64.gz -C /server/
[root@web01 server]# mv jdk1.8.0_40 java1.8
2.修改新增環境變數
[root@web01 server]# vim /etc/profile.d/java.sh
export JAVA_HOME=/server/java1.8
export JRE_HOME=/server/java1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin
[root@web01 server]# source /etc/profile
#4.配置tomcat頁面
[root@web01 server]# echo "tomcat" > apache-tomcat-9.0.30/webapps/ROOT/index.html
#5.啟動tomcat,啟動的時候最好看著日誌
[root@web01 server]# /server/apache-tomcat-8.5.51/bin/startup.sh && tail -f /server/apache-tomcat-8.5.51/logs/catalina.out
6.ab測試tomcat請求靜態頁
[root@web01 ~]# rm -rf /code/try
Concurrency Level: 20
Time taken for tests: 11.736 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Total transferred: 5120000 bytes
HTML transferred: 140000 bytes
Requests per second: 1704.10 [#/sec] (mean)
Time per request: 11.736 [ms] (mean)
Time per request: 0.587 [ms] (mean, across all concurrent requests)
Transfer rate: 426.03 [Kbytes/sec] received
7.測試結果
nginx處理靜態檔案的速度比tomcat服務快
三、系統優化
檔案控制代碼,檔案描述符,會隨著程序數增加而增加
1.檢視檔案控制代碼命令
#檢視檔案控制代碼數設定
[root@web01 ~]# ulimit -n
65535
#檢視總共開啟的檔案控制代碼數
[root@web01 ~]# lsof | wc -l
#檢視程序開啟的檔案控制代碼數
[root@web01 ~]# lsof -p 71336 | wc -l
32
2.設定檔案控制代碼數
1)系統全域性設定
[root@web01 ~]# vim /etc/security/limits.conf
* - nofile 65535
* soft nofile 65535
* hard nofile 65535
* #代表所有使用者
- #超過檔案控制代碼數時,什麼都不幹
soft #超過檔案控制代碼數時,僅提示
hard #超過檔案控制代碼數時,直接限制
2)使用者區域性設定
[root@web01 ~]# vim /etc/security/limits.conf
root - nofile 65535
root soft nofile 65535
root hard nofile 65535
3)針對nginx服務
[root@web01 ~]# vim /etc/nginx/nginx.conf
user www;
worker_processes 1;
worker_rlimit_nofile 65535;
3.系統優化
[root@web01 ~]# vim /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.ipv4.ip_forward = 1
[root@web01 ~]# sysctl -p
四、Nginx做代理的優化
nginx作為代理,負責轉發使用者的請求,如果不配置預設是短連結,需要手動配置
1.配置nginx代理開啟長連線
[root@lb01 ~]# vim /etc/nginx/conf.d/proxy.conf
upstream web {
server 172.16.1.7:80;
keepalive 16; #開啟長連線
}
server {
listen 80;
server_name linux.node.com;
location / {
proxy_pass http://web;
proxy_http_version 1.1; #指定長連線版本
include /etc/nginx/proxy_params;
}
}
2.配置nginx代理PHP開啟長連線
[root@web01 ~]# cat /etc/nginx/conf.d/linux.blog.com.conf
server {
listen 80;
server_name linux.blog.com;
root /code/wordpress;
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_keep_conn on; #配置代理http開啟長連線
include fastcgi_params;
}
}
五、Nginx處理靜態資源優化
nginx作為靜態資源伺服器,用於處理靜態資源非常的高效
靜態資源型別 | 字尾 |
---|---|
html資源 | html、css、js |
圖片檔案 | jpg、png、gif、jpeg |
視訊檔案 | mp3、mp4、avi |
文字檔案 | txt、doc、xml |
其他檔案 |
1.靜態資源快取
1)瀏覽器快取
#響應頭部
cache-control: max-age=2592000
expires: Thu, 19 Nov 1981 08:52:00 GMT
ETag: "5f3fefc8-2d03"
Last-Modified: Fri, 21 Aug 2020 16:01:12 GMT
#請求頭部
If-Modified-Since: Fri, 21 Aug 2020 16:01:12 GMT
If-None-Match: "5f3fefc8-2d03"
2)瀏覽器讀取快取流程
1.瀏覽器會先去檢視響應頭部的cache-control(快取控制)
2.如果沒有到達過期時間,會直接返回快取中的內容,不需要重新讀取伺服器
3.如果cache-control設定為 no-cache,瀏覽器會去讀取expires(快取過期時間)
4.如果沒有到達expires過期時間,會直接返回快取中的內容,不需要重新讀取伺服器
5.如果cache-control和expires都沒有設定
6.瀏覽器會去檢視伺服器上面ETag值,如果有瀏覽器會拿著 If-None-Match 去跟他對比
7.如果ETag與瀏覽器的 If-None-Match 相同,則走快取
8.如果ETag與瀏覽器的 If-None-Match 不相同,瀏覽器會去檢視伺服器上面 Last-Modified值
9.如果伺服器上有 Last-Modified值,瀏覽器會拿著If-Modified-Since去跟他對比
10.如果Last-Modified值與瀏覽器的 If-Modified-Since 相同,則走快取
11.如果Last-Modified值與瀏覽器的 If-Modified-Since 不相同,重新去伺服器讀取資料
#含義
1.cache-control:快取控制,記錄的時檔案保留時間
2.expires:快取時間,記錄的是檔案的過期時間
3.ETag:伺服器上保留的檔案唯一識別符號
4.If-None-Match:瀏覽器上保留的檔案唯一識別符號
5.Last-Modified:伺服器上保留的檔案最後修改時間
6.If-Modified-Since:瀏覽器上保留的檔案最後修改時間
3)配置快取過期時間
#語法
Syntax: expires [modified] time;
expires epoch | max | off;
Default: expires off;
Context: http, server, location, if in location
#配置過期時間
[root@web01 ~]# vim /etc/nginx/conf.d/cacha.conf
server {
listen 80;
server_name linux.cache.com;
root /code/cache;
location ~* \.(jpg|png|gif)$ {
root /code/cache;
expires 7d;
}
}
4)配置不走快取
#公司測試化境經常更新前端程式碼,需要關閉快取
1.使用無痕模式
2.開啟瀏覽器 Disable cache
3.配置nginx
location ~* \.(jpg|png|gif)$ {
root /code/cache;
add_header Cache-Control no-cache;
etag off;
if_modified_since off;
}
2.靜態資源讀取
1)檔案高速讀取
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location
2)高效傳輸(開啟了sendfile)
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
3)長連線傳輸(必須開啟長連線)
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
4)注意
tcp_nodelay和tcp_nopush只能配置一個,不能同時配置
3.靜態資源壓縮
1)靜態資源壓縮語法
#開啟壓縮
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
#指定壓縮型別
Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location
#指定壓縮比例
Syntax: gzip_comp_level level;
Default: gzip_comp_level 3-5; #1-9個級別
Context: http, server, location
#指定傳輸協議
Syntax: gzip_http_version 1.0 | 1.1;
Default: gzip_http_version 1.1;
Context: http, server, location
2)壓縮配置
[root@web01 /code/cache]# vim /etc/nginx/conf.d/gzip.conf
server {
listen 80;
server_name linux.gzip.com;
root /code/cache;
location ~* \.(jpg|png|gif)$ {
gzip on;
gzip_types image/jpeg image/gif image/png;
gzip_comp_level 9;
}
location ~* \.(txt|css)$ {
gzip on;
gzip_types text/css text/plain;
gzip_comp_level 5;
}
}
4.防資源盜鏈
1)配置被盜鏈的網站
[root@web02 /etc/nginx/conf.d]# vim beidaolian.conf
server {
listen 80;
server_name linux.beidaolian.com;
location / {
root /code/beidaolian;
index index.html;
}
}
[root@web02 /etc/nginx/conf.d]# mkdir /code/beidaolian
[root@web02 /etc/nginx/conf.d]# cd /code/beidaolian/
[root@web02 /code/beidaolian]# rz
[root@web02 /code/beidaolian]# ll
total 13444
-rw-r--r-- 1 root root 18632 2020-09-11 15:57 1.jpg
-rw-r--r-- 1 root root 471421 2020-09-11 15:57 3.jpg
2)配置盜鏈的網站
[root@web01 /]# vim /etc/nginx/conf.d/daolian.conf
server {
listen 80;
server_name linux.daolian.com;
root /code/cache;
}
[root@web01 /]# vim /code/cache/index.html
<img src="http://linux.beidaolian.com/1.jpg" />
#配置hosts
[root@web01 /]# vim /etc/hosts
10.0.0.8 linux.beidaolian.com
#windows配置訪問頁面
10.0.0.7 linux.daolian.com
訪問http://linux.daolian.com/
3)配置防盜鏈語法
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
none #nginx日誌中referer部分為空
blocked #nginx日誌中referer部分沒有攜帶協議,沒有http或者https
server_names #nginx日誌中referer部分為指定的域名
4)防盜鏈配置
[root@web02 /code/beidaolian]# cat /etc/nginx/conf.d/beidaolian.conf
server {
listen 80;
server_name linux.beidaolian.com;
location / {
root /code/beidaolian;
index index.html;
}
location ~* \.jpg$ {
root /code/beidaolian;
#valid_referers none blocked server_name linux.beidaolian.com *.baidu.com;
valid_referers none blocked linux.beidaolian.com;
if ($invalid_referer) {
return 403;
}
}
}
5)偽造referer請求頭
[root@web01 ~]# curl -e "http://linux.daolian.com" -I linux.beidaolian.com/1.jpg
HTTP/1.1 500 Internal Server Error
Server: nginx/1.18.0
Date: Fri, 11 Sep 2020 08:23:52 GMT
Content-Type: text/html
Content-Length: 177
Connection: close
[root@web01 ~]# curl -e "http://linux.beidaolian.com" -I linux.beidaolian.com/1.jpg
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Fri, 11 Sep 2020 08:24:19 GMT
Content-Type: image/jpeg
Content-Length: 18632
Last-Modified: Fri, 11 Sep 2020 07:57:48 GMT
Connection: keep-alive
ETag: "5f5b2dfc-48c8"
Accept-Ranges: bytes
5.允許跨域訪問
#盜鏈就是由我的網站向你的網站發起get獲取資源的請求
#跨域訪問由我的網站向你的網站發起http的連結請求
1)配置被跨域的網站
[root@web02 /etc/nginx/conf.d]# vim beikuayu.conf
server {
listen 80;
server_name linux.beikuayu.com;
location / {
root /code/beikuayu;
index index.html;
}
}
#建立站點
[root@web02 ~]# echo "bei kua yu de wang zhan" > /code/beikuayu/index.html
2)配置跨域的網站
[root@web01 ~]# vim /etc/nginx/conf.d/kuayu.conf
server {
listen 80;
server_name linux.kuayu.com;
location / {
root /code/kuayu;
index index.html;
}
}
#配置站點
[root@web01 ~]# mkdir /code/kuayu
[root@web01 ~]# vim /code/kuayu/index.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>測試ajax和跨域訪問</title>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://linux.beikuayu.com",
success: function(data) {
alert("sucess 臥槽 臥槽 臥槽 成功了!!!");
},
error: function() {
alert("fail!!,跨不過去啊,不讓進去啊,只能蹭蹭!");
}
});
});
</script>
<body>
<h1>測試跨域訪問</h1>
</body>
</html>
3)配置hosts
[root@web01 ~]# vim /etc/hosts
10.0.0.7 linux.beikuayu.com
10.0.0.8 linux.beikuayu.com
[root@web02 ~]# vim /etc/hosts
10.0.0.7 linux.beikuayu.com
10.0.0.8 linux.beikuayu.com
#配置windows的hosts
10.0.0.7 linux.kuayu.com
4)配置允許跨域訪問
[root@web02 /etc/nginx/conf.d]# vim beikuayu.conf
server {
listen 80;
server_name linux.beikuayu.com;
root /code/beikuayu;
index index.html;
location ~* \.html$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
}
}
六、配置cpu親和
1.方式一
worker_processes 16;
worker_cpu_affinity 0000000000000001 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000
0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000;
2.方式二
worker_processes 2;
#worker_cpu_affinity 01 10;
#worker_cpu_affinity 0101 1010;
worker_cpu_affinity 010101 101010;
3.方式三
worker_processes auto;
worker_cpu_affinity auto;
4.配置完cpu親和檢視程序繫結
[root@web02 ~]# ps -eo pid,args,psr | grep [n]ginx
7024 nginx: master process /usr/ 1
7025 nginx: worker process 0
7026 nginx: worker process 1
7027 nginx: worker process 2
7028 nginx: worker process 3
七、nginx優化部分完整配置檔案
1.nginx企業配置檔案
[root@nginx ~]# cat nginx.conf
user www; #nginx啟動使用者
worker_processes auto; #worker程序數
worker_cpu_affinity auto; #開啟親和
error_log /var/log/nginx/error.log warn; #錯誤日誌 存放位置 日誌級別
pid /run/nginx.pid; #指定pid檔案存放路徑
worker_rlimit_nofile 35535; #nginx的最大檔案描述
events {
use epoll; #使用epoll網路模型
worker_connections 10240; #worker程序最大連線數
}
http {
include mime.types; #nginx識別的檔案型別
default_type application/octet-stream; #如果不識別,預設下載
charset utf-8; #字符集
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #定義日誌格式
access_log /var/log/nginx/access.log main; #指定訪問日誌路徑 日誌格式
server_tokens off; #隱藏nginx版本號
client_max_body_size 200m; #上傳檔案大小
sendfile on; #高效讀取
tcp_nopush on; #高效傳輸
#tcp_nodelay on; #實時傳輸
keepalive_timeout 65; #開啟長連線
gzip on; #開啟壓縮
gzip_disable "MSIE [1-6]\."; #IE瀏覽器不壓縮
gzip_http_version 1.1; #gzip傳輸協議
gzip_comp_level 4; #壓縮級別
gzip_buffers 16 8k; #壓縮快取
gzip_min_length 1024; #最小壓縮的檔案大小
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg; #需要壓縮的檔案
include /etc/nginx/conf.d/*.conf; #包含的配置檔案
}
[root@nginx ~]# cat nginx.conf
user www;
worker_processes auto;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
worker_rlimit_nofile 35535;
events {
use epoll;
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
server_tokens off;
client_max_body_size 200m;
sendfile on;
tcp_nopush on;
#tcp_nodelay on;
keepalive_timeout 65;
gzip on;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_buffers 16 8k;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;
include /etc/nginx/conf.d/*.conf;
}
2.nginx優化總結
1、CPU親和、worker程序數、調整nginx程序開啟的檔案控制代碼數
2、使用Epool網路模型、調整每個worker程序的最大連線數
3、檔案的高效讀取sendfile、nopush
4、檔案的傳輸實時性、nodealy
5、開啟tcp長連線,以及長連線超時時間keepalive_timeout
6、開啟檔案傳輸壓縮gzip
7、開啟靜態檔案expires快取
8、隱藏nginx版本號
9、禁止通過ip地址訪問,禁止惡意域名解析,只允許域名訪問
10、配置防盜鏈、以及跨域訪問
11、防DDOS、cc攻擊,限制單IP併發連線,以及http請求
12、優雅顯示nginx錯誤頁面
13、nginx加密傳輸https優化
14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 代理快取,第三方工具(squid、varnish)
八、PHP優化
1.配置PHP頁面
[root@web02 ~]# vim /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name linux.php.com;
root /code/php;
index index.php;
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
#配置站點
[root@web02 ~]# vim /code/php/index.php
<?php
phpinfo();
2.php.ini配置檔案優化
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#; Error handling and logging ;
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
expose_php = Off # 關閉php版本資訊
display_error = Off # 螢幕不顯示錯誤日誌(開發環境可以開啟 on)
error_reporting = E_ALL # 記錄PHP的每個錯誤
log_errors = On # 開啟錯誤日誌
error_log = /var/log/php_error.log # 錯誤日誌寫入的位置(程式處理程式碼時的錯誤)
date.timezone = Asia/Shanghai # 調整時區,預設PRC
#;;;;;;;;;;;;;;;;
#; File Uploads ;
#;;;;;;;;;;;;;;;;
file_uploads = On # 允許檔案上傳
upload_max_filesize = 300M # 允許上傳檔案的最大大小
post_max_size = 300M # 允許客戶端單個POST請求傳送的最大資料
max_file_uploads = 20 # 允許同時上傳的檔案的最大數量
memory_limit = 128M # 每個指令碼執行最大記憶體
3.PHP危險函式
有時候為了安全我們需要禁掉一些PHP危險函式,整理如下需要的朋友可以參考下
phpinfo()
功能描述:輸出 PHP 環境資訊以及相關的模組、WEB 環境等資訊。
危險等級:中
passthru()
功能描述:允許執行一個外部程式並回顯輸出,類似於 exec()。
危險等級:高
exec()
功能描述:允許執行一個外部程式(如 UNIX Shell 或 CMD 命令等)。
危險等級:高
system()
功能描述:允許執行一個外部程式並回顯輸出,類似於 passthru()。
危險等級:高
chroot()
功能描述:可改變當前 PHP 程序的工作根目錄,僅當系統支援 CLI 模式
PHP 時才能工作,且該函式不適用於 Windows 系統。
危險等級:高
scandir()
功能描述:列出指定路徑中的檔案和目錄。
危險等級:中
chgrp()
功能描述:改變檔案或目錄所屬的使用者組。
危險等級:高
chown()
功能描述:改變檔案或目錄的所有者。
危險等級:高
shell_exec()
功能描述:通過 Shell 執行命令,並將執行結果作為字串返回。
危險等級:高
proc_open()
功能描述:執行一個命令並開啟檔案指標用於讀取以及寫入。
危險等級:高
proc_get_status()
功能描述:獲取使用 proc_open() 所開啟程序的資訊。
危險等級:高
error_log()
功能描述:將錯誤資訊傳送到指定位置(檔案)。
安全備註:在某些版本的 PHP 中,可使用 error_log() 繞過 PHP safe mode,
執行任意命令。
危險等級:低
ini_alter()
功能描述:是 ini_set() 函式的一個別名函式,功能與 ini_set() 相同。
具體參見 ini_set()。
危險等級:高
ini_set()
功能描述:可用於修改、設定 PHP 環境配置引數。
危險等級:高
ini_restore()
功能描述:可用於恢復 PHP 環境配置引數到其初始值。
危險等級:高
dl()
功能描述:在 PHP 進行執行過程當中(而非啟動時)載入一個 PHP 外部模組。
危險等級:高
pfsockopen()
功能描述:建立一個 Internet 或 UNIX 域的 socket 持久連線。
危險等級:高
syslog()
功能描述:可呼叫 UNIX 系統的系統層 syslog() 函式。
危險等級:中
readlink()
功能描述:返回符號連線指向的目標檔案內容。
危險等級:中
symlink()
功能描述:在 UNIX 系統中建立一個符號連結。
危險等級:高
popen()
功能描述:可通過 popen() 的引數傳遞一條命令,並對 popen() 所開啟的檔案進行執行。
危險等級:高
stream_socket_server()
功能描述:建立一個 Internet 或 UNIX 伺服器連線。
危險等級:中
putenv()
功能描述:用於在 PHP 執行時改變系統字符集環境。在低於 5.2.6 版本的 PHP 中,可利用該函式
修改系統字符集環境後,利用 sendmail 指令傳送特殊引數執行系統 SHELL 命令。
危險等級:高
禁用方法如下:
開啟/etc/php.ini檔案,
查詢到 disable_functions ,新增需禁用的函式名,如下:
phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,p
4.php-fpm服務配置
1)php-fpm.conf配置優化
[root@web02 ~]# vim /etc/php-fpm.conf
[global]
;pid = /var/log/php-fpm/php-fpm.pid #pid檔案存放的位置
;error_log = /var/log/php-fpm/php-fpm.log #錯誤日誌存放的位置(啟動時的日誌)
;log_level = error #日誌級別, alert, error, warning, notice, debug
rlimit_files = 65535 #php-fpm程序能開啟的檔案控制代碼數
;events.mechanism = epoll #使用epoll事件模型處理請求
include=/etc/php-fpm.d/*.conf
2)包含配置檔案優化
[root@web02 ~]# vim /etc/php-fpm.d/www.conf
[www] #池名稱
user = www #程序執行的使用者
group = www #程序執行的組
;listen = /dev/shm/php-fpm.sock #監聽在本地socket檔案
listen = 127.0.0.1:9000 #監聽在本地tcp的9000埠
;listen.allowed_clients = 127.0.0.1 #允許訪問FastCGI程序的IP,any不限制
pm = dynamic #管理方式(dynamic為動態,static為靜態)
pm.max_children = 512 #最大啟動的php-fpm程序數(靜態管理,配置dynamic時失效)
pm.start_servers = 32 #動態方式下的起始php-fpm程序數量。
pm.min_spare_servers = 32 #動態方式下的最小php-fpm程序數量。
pm.max_spare_servers = 64 #動態方式下的最大php-fpm程序數量。
pm.max_requests = 1500 #達到這個請求數,子程序會重啟,如果是0那就一直接受請求
pm.process_idle_timeout = 15s; #沒有請求時多久釋放一個程序
pm.status_path = /phpfpm_status #開啟php的狀態頁面
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/phpfpm_error.log
php_admin_flag[log_errors] = on
request_slowlog_timeout = 5s #php指令碼執行超過5s的檔案
slowlog = /var/log/php_slow.log #記錄至該檔案中
5.php狀態頁
1)配置php
[root@web02 ~]# vim /etc/php-fpm.d/www.conf
pm.status_path = /phpfpm_status #開啟php的狀態頁面
[root@web02 ~]# systemctl restart php-fpm
2)配置nginx
[root@web02 ~]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name linux.php.com;
root /code/php;
index index.php;
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location /status {
stub_status;
}
location /php_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3)訪問頁面
#訪問 http://linux.php.com/php_status
pool: www #池名稱
process manager: dynamic #動態管理
start time: 14/Sep/2020:18:52:12 +0800 #啟動時間
start since: 14 #啟動了多久
accepted conn: 1 #連線數
listen queue: 0 #等待佇列
max listen queue: 0 #最大等待佇列
listen queue len: 511 #等待佇列長度
idle processes: 4 #空閒的程序數
active processes: 1 #活躍的程序數
total processes: 5 #總的程序數
max active processes: 1 #最大的活躍程序數
max children reached: 0 #程序最大的限制連線數
slow requests: 0 #慢查詢
九、優化總結
1.nginx
1)硬體 nginx做代理比較消耗CPU,如果做靜態資源處理要考慮磁碟和IO
2)網路
3)系統
4)應用 nginx做代理,開啟長連線
5)服務 nginx處理靜態資源做快取,做壓縮,防盜鏈,跨域訪問
2.php
1)php.ini 檔案上傳,訪問日誌
2)php-fpm.conf php狀態頁面,PHP慢查詢