1. 程式人生 > 其它 >第二十五章 Nginx效能優化

第二十五章 Nginx效能優化

一、效能優化概述

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
其他檔案 pdf

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慢查詢