Nginx調優詳解

6.21 Nginx調優
javascript

6.21.1 隱藏Nginx版本號php

1步:上傳源碼並解壓css

cd /root/softwareshtml

tar -xf nginx-1.14.1.tar.gz -C /usr/local/src前端

2步:修改跟版本信息有關源代碼文件java

1. 修改nginx軟件版本號node

[root@nginx src]# cd /usr/local/src/nginx-1.14.1linux

[root@nginx nginx-1.14.1]# vim src/core/nginx.hnginx

改:c++

13 #define NGINX_VERSION      "1.14.1"

14 #define NGINX_VER          "nginx/" NGINX_VERSION

爲:

13 #define NGINX_VERSION      "8.9.2"

14 #define NGINX_VER          "W_xruan/" NGINX_VERSION

 

2. 修改HTTP頭信息中的connection字段,防止回顯具體版本號

[root@nginx nginx-1.14.1]# vim src/http/ngx_http_header_filter_module.c

改:

49 static u_char ngx_http_server_string[] = "Server: nginx" CRLF;

爲:

49 static u_char ngx_http_server_string[] = "Server: Wxruan" CRLF;

 

3. 修改ngx_http_special_response.c文件,防止報404錯誤時回顯版本號

[root@nginx nginx-1.14.1]# vim src/http/ngx_http_special_response.c

改:

36 "<hr><center>nginx</center>" CRLF

爲:

36 "<hr><center>Wxruan</center>" CRLF

3步:編譯安裝nginx

先安裝依賴軟件包:

yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel

編譯安裝nginx

./configure --prefix=/usr/local/nginx \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_realip_module \

--with-http_gzip_static_module \

--with-http_stub_status_module \

--with-pcre

make -j 4 && make install

4. 測試

啓動nginx

[root@nginx nginx-1.14.1]# /usr/local/nginx/sbin/nginx

[root@nginx nginx-1.14.1]# netstat -tunpl | grep :80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4441/nginx: master

curl訪問nginx

[root@redis01 ~]# curl -I 172.16.1.84

HTTP/1.1 200 OK

Server: W_xruan/8.9.2

Date: Fri, 09 Aug 2019 01:48:10 GMT

Content-Type: text/html

Content-Length: 612

Last-Modified: Fri, 09 Aug 2019 01:47:18 GMT

Connection: keep-alive

ETag: "5d4cd0a6-264"

Accept-Ranges: bytes

說明:nginx服務器的類型和版本號都隱藏了。

 

測試404報錯頁面:

spacer.gif

說明:nginx服務器的類型和版本號都修改了。

5)軟件包和編譯參數說明

軟件包說明:

軟件包

說明

gcc

c語言編譯器。

gcc-c++

c++語言編譯器。

autoconf automake

用於configure make編譯的工具。

zlib

nginx提供gzip模塊,須要zlib庫支持。

openssl

nginx提供ssl功能。

pcre

支持地址重寫rewrite功能。

 

編譯參數說明:

參數

說明

--with-http_dav_module

啓用支持(增長PUTDELETEMKCOL:建立集合,COPYMOVE方法)。

--with-http_stub_status_module

啓用支持(獲取Nginx上次啓動以來的工做狀態)。

--with-http_addition_module

啓用支持(做爲一個輸出過濾器,支持不徹底緩衝,分部分相應請求)。

--with-http_sub_module

啓用支持(容許一些其餘文本替換Nginx相應中的一些文本)。

--with-http_flv_module

啓用支持(提供支持flv視頻文件支持)。

--with-http_mp4_module

啓用支持(提供支持mp4視頻文件支持,提供僞流媒體服務端支持)。

--with-pcre

須要注意,這裏指的是源碼,用#./configure --help |grep pcre查看幫助。

6.21.2 修改環境變量和nginx運行用戶

cat >> /etc/profile.d/nginx.sh << EOF

PATH=/usr/local/nginx/sbin/:\$PATH

export PATH

EOF

source /etc/profile.d/nginx.sh

添加nginx運行用戶:

useradd -r -M -s /sbin/nologin nginx

修改nginx主配置文件:

sed -i 's/#user  nobody;/user  nginx;/g' /usr/local/nginx/conf/nginx.conf

啓動nginx生效:

[root@nginx conf]# nginx

[root@nginx conf]# netstat -tunpl | grep nginx

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5200/nginx: master

 

6.21.3 設置nginxcpu親和力

1)配置nginx進程數

3 worker_processes  4;

12 events {

13     worker_connections  15000;

14 }

重載ngxin配置生效:

nginx -s reload

參數說明:

worker_processes:設置nginx進程數,改參數值通常是等於CPU物理核心數或物理核心數乘以1.5-2之間的值(經驗數據)。

worker_connections:一個進程容許的併發鏈接數。不管這個鏈接是外部主動創建的,仍是內部創建的。一個工做進程創建一個鏈接後,進程將打開一個文件副本。因此這個數量還受限於,操做系統ulimit -n設定的值和nginxworker_connections的值。通常狀況下系統ulimit -nworker_rlimit_nofile worker_connections三者的值是同樣的。

worker_processes* worker_connections就是nginx可以處理的併發鏈接數,如:nginx須要處理60000的併發請求,能夠設置worker_processes=4worker_connections=15000;或worker_processes=8orker_connections=7500

查看每一個nginx進程使用的內存數:

[root@nginx ~]# top -u nginx

spacer.gif

每一個nginx使用的內存爲2M左右。

2)設置Nginx運行CPU的親和力:

CPU的親和力,就是把nginx每一個進程綁定到固定的cpu上,從而減小cpu上下文切換致使的額外的開銷。

好比服務器是44線程的cpunginx.conf文件應該配置爲以下:

3 worker_processes  4;

4 worker_cpu_affinity 0001 0010 0100 1000;

8核服務器8核心8線程的CPUnginx.conf文件應該設置爲以下:

3 worker_processes  8;

4 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

說明:

1. worker_cpu_affinity配置項只能對應用二進制表示的CPU編號。

2. worker_cpu_affinity項的配置必須與worker_processes項配合,如:

worker_processes 2

worker_cpu_affinit 01 10;

3. worker_cpu_affinity配置項在實際工做中不多場景用獲得,一般用在一些極端應用,須要壓榨CPU性能的應用,大部分狀況配置worker_processes項爲auto或是CPU核心數 CPU核心數*1-2)便可。

 

查看CPU親和力設置效果:假設nginx.conf配置以下

worker_processes  2;

worker_cpu_affinity 001 100;

查看nginx進程和號:

[root@nginx ~]# pstree -p | grep nginx

           |-nginx(5200)-+-nginx(5603)

           |             `-nginx(5604)

查看進程分配的CPU編號:

[root@nginx ~]# taskset -cp 5603

pid 5603's current affinity list: 0   

[root@nginx ~]# taskset -cp 5604

pid 5604's current affinity list: 2

說明:

1. CPU編號從0開始,「worker_processes  2 表示使用2CPU(或核心)運行nginx進程,「worker_cpu_affinity 001 100 表示nginx的兩個進程分別分配到第「0」號和第「2」好CPU

2. 分配的nginx進程到哪一個CPU編號跟二進制數「001」與「100」對應,與1所在的位置有關:

從右往左看,1所在第幾位就分配給第幾個CPU

001:分配第1個(編號爲0CPU

010:分配第2個(編號爲1CPU

100:分配第3個(編號爲2CPU

1000:分配第4個(編號爲3CPU

3. worker_processes項配置值與worker_cpu_affinity項的二進制個數必須是一致的,如:

worker_processe 4;worker_cpu_affinity項就必須配置4個二進制數「0001 0010 0100 1000」。以此類推。

6.21.4 設置Nginx每一個進程最多能夠打開的文件數和事件處理模型

1)每一個進程最多打開文件數

nginx.conf配置全局設置中加入如下項:

worker_rlimit_nofile 102400;

說明:這個指令是指當一個Nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,即:(ulimit -n/ worker_processes ,可是nginx分配請求並非那麼均勻,因此最好與ulimit -n的值保持一致。修改ulimit -n的值,能夠參考linux系統調優的內容。

2Nginx的事件處理模型

selectpollepoll都是nginx下的IO多路複用的機制。I/O多路複用就經過一種機制,能夠監視多個描述符,一旦某個描述符就緒(通常是讀就緒或者寫就緒),可以通知程序進行相應的讀寫操做。

EpollLinux2.6內核中正式引入,和selectpoll類似,其實都是I/O多路複用技術。

 

epoll優點:

1. Epoll沒有最大併發鏈接的限制,上限是最大能夠打開文件的數目,這個數字通常遠大於2048,通常來講這個數目和系統內存關係很大,具體數目能夠cat /proc/sys/fs/file-max察看。

[root@nginx ~]# cat /proc/sys/fs/file-max

198351

2. 效率提高,Epoll最大的優勢就在於它只管你「活躍」的鏈接,而跟鏈接總數無關,所以在實際的網絡環境中,Epoll的效率就會遠遠高於selectpoll

3. Epoll在這點上使用了「共享內存」,更省內存,效率更高。

配置使用epoll

nginx.conf配置文件events段添加:默認也是epoll模式

13 events {

14     worker_connections  15000;

15     use epoll;

16 }

重載配置生效。

6.21.5 配置主機頭和字符集及高效傳輸模式-鏈接超時時間

1)修改主機頭

生產環境中都須要主機頭:

……………………………………………………..

36     server {

37         listen       80;

38         server_name www.xruan.com;

39

40         charset utf8;

……………………………………………………..

說明:ServerName匹配方式:支持正則匹配

1. 精確匹配:www.xruan.com:域名爲www.xruan.com

2. 左側通配符匹配:*.aa.com:域名前面爲任意0個或多個字符,後面爲「.aa.com

3. 右側通配符匹配:www.*:域名前面爲www.,後面爲0個或多個字符

4. 正則表達式:~ ^.*\.aa\.com$:域名已任意字符開頭,以「.a.com」結尾

5. default_server

6. 服務IP地址:域名能夠以IP地址代替

2)修改字符集

使用utf8做爲WEB服務器字符集,基本上不會遇到編碼問題:

40         charset utf8;

3)開啓高效傳輸模式

主配置文件設置:

19     include       mime.types;

20     default_type  application/octet-stream;

28     sendfile        on;

29     tcp_nopush     on;

說明:

1. sendfile on;表示開啓高效傳輸模式,此項默認開啓。高效傳輸模式意思是傳輸層收到數據包後不做任何停留,所有發給應用層處理,假定nginx處理能力足夠強, 多少數據包都能吞下。

2. 開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。注意:若是圖片顯示不正常把這個改爲off

3. tcp_nopush on; 必須在sendfile開啓模式纔有效,防止網絡阻塞,積極的減小網絡報文段的數量。

4)設置鏈接超時時間

主要目的是保護服務器資源,CPU,內存,控制鏈接數,由於創建鏈接也是須要消耗資源的,TCP的三次握手四次揮手等,咱們通常斷掉的是那些創建鏈接可是不作事兒,也就是我創建了連接開始,可是後續的握手過程沒有進行,那麼咱們的連接處於等待狀態的,所有斷掉!

同時咱們也但願php建議短連接,消耗資源少。

修改主配置文件nginx.conf,在http段內,server外以下設置:

19 http {

20     include       mime.types;

21     default_type  application/octet-stream;

22

23     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

24     #                  '$status $body_bytes_sent "$http_referer" '

25     #                  '"$http_user_agent" "$http_x_forwarded_for"';

26

27     #access_log  logs/access.log  main;

28

29     sendfile        on;

30     tcp_nopush     on;

31

32     #keepalive_timeout  0;

33     keepalive_timeout  65;

34     tcp_nodelay on;

35     client_header_timeout 15;

36     client_body_timeout 15;

37     send_timeout 15;

38

參數說明:

參數項

設置值

說明

keepalive_timeout

65

客戶端鏈接保持會話超時時間(單位:秒),超過這個時間,服務器斷開這個連接。

tcp_nodelay

on

也是防止網絡阻塞,不過要包涵在keepalived參數纔有效。

client_header_timeout

15

客戶端請求頭讀取超時時間(單位:秒),若是超過設個時間沒有發送任何數據,nginx將返回request time out的錯誤。

client_body_timeout

15

客戶端求主體超時時間(單位:秒),超過這個時間沒有發送任何數據,和上面同樣的錯誤提示。

send_timeout

15

響應客戶端超時時間(單位:秒),這個超時時間僅限於兩個活動之間的時間,若是超過這個時間,客戶端沒有任何活動,nginx關閉鏈接。

說明:tcp_nodelayclient_header_timeout;client_body_timeoutsend_timeout必須與keepalive_timeout項配合使用。

5)文件上傳大小限制

限制上傳文件大小能夠避免佔用過多服務器磁盤空間,也能夠較少在傳輸過程當中出錯的機會。文件PHP能夠修改上傳文件大小限制,nginx也能夠修改。

http段內,server段外添加:client_max_body_size 10m;

19 http {

……………………………………………….

39     client_max_body_size 10m;

……………………………………………….

6.21.6 location匹配

nginxlocation很是靈活,並且設置簡單。

root html:表示站點默認根目錄,這裏是nginx安裝目錄下的html目錄(/usr/local/nginx/html/

index:表示站點默認主頁索引文件,能夠有多個。

1)絕對匹配

以「=」匹配url,最嚴格的匹配,有一點不一樣都匹配不成功。

例:

location = /file.txt {

root   /opt/www;

index  index.html index.htm;

}

若是在客戶端訪問的url不是http://ServerName/file.txt,則nginx不會到目錄/opt/www下尋找文件file.txt,而是繼續嘗試能匹配的location

2)正則匹配

以「~」或「~*」匹配url,很靈活。

~:區分大小寫。

~*:不區分大小寫。utl通常都不區分大小寫。

例:

location ~ \.php$ {

root           html;

fastcgi_pass    127.0.0.1:9000;

fastcgi_index   index.php;

fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;

include        fastcgi_params;

}

匹配nginx安裝目錄下的html目錄下的全部以「.php」結尾的文件,執行相應操做。

3)否認匹配

以「!~」匹配url

!~:表示不匹配。

location !~ \.pnp$ {

root           html;

    …………………………..

}

若是客戶端訪問的url不是以「.pnp」結尾的,就執行該location下的相應操做。

4)正則匹配中的符號含義

基本上跟Linux支持的正則匹配同樣。

.:匹配任意一個字符。

$:以什麼什麼結尾。

^:以什麼什麼開頭。

*:匹配任意個字符。

6.21.7 優化Fastcgi配置

1Fastcgi相關概念

Fastcgi相關的個概念以下:

Cache:寫入緩存區

Buffer:讀取緩存區

Fastcgi是靜態服務和動態服務的一個接口

2)配置fastcgi優化參數

nginx.conf文件的httpd段加入如下內容:

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

#fastcgi_temp_path /data/ngx_fcgi_tmp;

fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=nginx:512m inactive=1d max_size=40g;

注意:fastcgi_cache_path項指定的目錄/data/ngx_fcgi_cache必須存在,且全部者爲php-fpm的運行用戶,這裏是nginx,沒有則須要手工建立:

[root@nginx ~]# mkdir -p /data/ngx_fcgi_cache

 

 

而後在location ~ \.php$ 段中加入如下內容:綠色字部分

        location ~ \.php$ {

            root          html;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;

            include       fastcgi_params;

            fastcgi_cache nginx;

            fastcgi_cache_valid 200 302 1h;

            fastcgi_cache_valid 301 1d;

            fastcgi_cache_valid any 1m;

            fastcgi_cache_min_uses 1;

            fastcgi_cache_use_stale error timeout invalid_header http_500;

            fastcgi_cache_key http://$host$request_uri;

        }

注意:其中nginxkeys_zone的名字,有上面的keys_zone=nginx語句定義。

 

檢查nginx配置文件語法:

[root@nginx ~]# 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

檢查配置成功。

 

名詞解析:

1. URLUniform Resource Locator,統一資源定位符

2. URNUniform Resource Name,統一資源名稱

3. URIUniform Resource Identifier,統一資源標識符)

fastcgi cache資料:

官方文檔:

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

 

3Fastcgi優化參數說明

配置項

配置值

說明

fastcgi_connect_timeout

300

指定連接到後端FastCGI的超時時間。

fastcgi_send_timeout

300

FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。

fastcgi_read_timeout

300

指定接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。

fastcgi_buffer_size

64k

指定讀取FastCGI應答第一部分須要用多大的緩衝區,這個值表示將使用164KB的緩衝區讀取應答的第一部分(應答頭),能夠設置爲gastcgi_buffers選項指定的緩衝區大小。

fastcgi_buffers

4 64k

指定本地須要用多少個和多大的緩衝區來緩衝FastCGI的應答請求,若是一個php腳本所產生的頁面大小爲256KB,那麼會分配464KB的緩衝區來緩存,若是頁面大小大於256KB,那麼大於256KB的部分會緩存到fastcgi_temp指定的路徑中,可是這並非好方法,由於內存中的數據處理速度要快於磁盤。通常這個值應該爲站點中php腳本所產生的頁面大小的中間值,若是站點大部分腳本所產生的頁面大小爲256KB,那麼能夠把這個值設置爲「8 16K」、「4 64k」等。

fastcgi_busy_buffers_size

128k

建議設置爲fastcgi_buffer的兩倍,繁忙時候的buffer

fastcgi_temp_file_write_size

128k

在寫入fastcgi_temp_path時將用多大的數據庫,默認值是fastcgi_buffers的兩倍,設置上述數值設置小時若負載上來時可能報502Bad Gateway

fastcgi_cache

nginx

表示開啓FastCGI緩存併爲其指定一個名稱。開啓緩存很是有用,能夠有效下降CPU的負載,而且防止502的錯誤發生,可是開啓緩存也可能會引發其餘問題,要很據具體狀況選擇。

fastcgi_cache_valid   200 302

1h

用來指定應答代碼的緩存時間,實例中的值表示將200302應答緩存一小時,要和fastcgi_cache配合使用。

fastcgi_cache_valid   301

1d

301應答緩存一天。

fastcgi_cache_valid

1m

將其餘應答緩存爲1分鐘。

fastcgi_cache_min_uses

1

請求的數量。

fastcgi_cache_path


定義緩存的路徑。

 

6.21.8 gzip壓縮網頁調優

1)爲何要壓縮

使用gzip壓縮功能,可能爲咱們節約帶寬,加快傳輸速度,有更好的體驗,也爲咱們節約成本,因此說這是一個重點。

Nginx啓用壓縮功能須要你來ngx_http_gzip_module模塊,apache使用的是mod_deflate

通常咱們須要壓縮的內容有:文本,jshtmlcss,對於圖片,視頻,flash什麼的不壓縮,同時也要注意,咱們使用gzip的功能是須要消耗CPU的。

2)配置nginx壓縮

修改主配置文件nginx.conf,按以下設置:

41     gzip  on;

42     gzip_min_length  1k;

43     gzip_buffers     4 32k;

44     gzip_http_version 1.1;

45     gzip_comp_level 9;

46     gzip_types  text/css text/xml application/javascript;

47     gzip_vary on;

nginx默認配置並無開啓壓縮。

3)壓縮配置參數說明

配置項

配置值

說明

gzip

on

啓用壓縮,nginx默認沒有開啓。

gzip_min_length

1k

設置容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length(內容長度)中獲取,默認值是0,表示無論頁面多大都進行壓縮,建議設置成大於1K,若是小於1K可能會越壓越大。

gzip_buffers

4 32k

壓縮緩衝區大小,表示申請4個單位爲32K的內存做爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。

gzip_http_version

1.1

壓縮版本(默認1.1,前端爲squid2.5時使用1.0)用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認便可。

gzip_comp_level

9

壓縮級別,也叫壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,可是處理慢,也比較消耗CPU資源。

gzip_types

text/css text/xml   application/javascript

用來指定壓縮的類型,‘text/html’類型老是會被壓縮。

gzip_vary

on

vary header支持,該選項可讓前端的緩存服務器緩存通過GZIP壓縮的頁面,例如用Squid緩存通過nginx壓縮的數據。

6.21.9 緩存優化

緩存,主要針對於圖片,cssjs等元素更改機會比較少的狀況下使用,特別是圖片,佔用帶寬大,咱們徹底能夠設置圖片在瀏覽器本地緩存365dcssjshtml能夠緩存個10來天,這樣用戶第一次打開加載慢一點,第二次,就很是快了!緩存的時候,咱們須要將須要緩存的擴展名列出來!

Expires緩存配置在server段裏面:

server {

……………………………………….

    location ~ .*\.(gif|jpe|jpeg|pnp|bmp|swf)$ {

        expires  365d;

 

}

location ~ .*\.(js|css)$ {

        expires  30d;

}

……………………………………….

}

 

也能夠緩存整個目錄:注意這裏可能會跟訪問 目錄下的php文件配置有衝突,正在查找緣由

location ~ ^/(images|javascript|js|css|flash|media|static)/ {

expires 360d;

}

 

expire功能優勢:

1. expires能夠下降網站購買的帶寬,節約成本。

2. 同時提高用戶訪問體驗。

3. 減輕服務的壓力,節約服務器成本,甚至能夠節約人力成本,是web服務很是重要的功能。

 

expire功能缺點:

被緩存的頁面或數據更新了,用戶看到的可能仍是舊的內容,反而影響用戶體驗。

 

解決辦法:

第一個 縮短緩存時間,例如:1天,不完全,除非更新頻率大於1天。

第二個 對緩存的對象更名。

a. 圖片,附件通常不會被用戶修改,若是用戶修改了,實際上也是更改文件名從新傳了而已。

b. 網站升級對於jscss元素,通常能夠更名,把cssjs,推送到CDN

 

網站不但願被緩存的內容:

1)廣告圖片

2)網站流量統計工具

3)更新頻繁的文件(googlelogo

6.21.10 日誌切割優化

1)日誌切割的重要性

服務器日誌須要定時歸檔或清除,由於有些服務器日誌是很瘋狂的,不清除很快會耗盡整個磁盤的空間。

日誌優化的目的,是爲了一天日誌一壓縮,按天存放,而且刪除超過10天的歸檔。

實現方式:使用shell編寫腳本,天天分割日誌,腳本統一保存在/server/scripts/目錄下。

編寫腳本/server/scripts/cut_nginx_log.sh,添加如下內容:

#!/bin/bash

LOGDATE=$(date +%F -d -1day)

cd /usr/local/nginx/logs

if [ ! -d cut ];then

    mkdir cut

fi

mv access.log cut/access_$LOGDATE.log

mv error.log cut/error_$LOGDATE.log

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

/usr/bin/tar jcvf cut/$LOGDATE.tar.bz2 cut/*

rm -f cut/access*

rm -f cut/error*

find cut -type f -mtime +10 | xargs rm -f

 

編寫計劃任務:

cat >> /var/spool/cron/root << EOF

# Cut Nginx log every day scripts by xruan 2019-02-03

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh > /dev/null 2>&1

EOF

2)排除記錄健康檢查日誌減小磁盤IO

健康檢查的日誌,不用輸入到log中,由於這些日誌沒有意義,咱們分析的話只須要分析訪問日誌,看看一些頁面連接,如200301404的狀態碼,在SEO中很重要,並且咱們統計PV是頁面計算,這些都沒有意義,反而消耗了磁盤IO,下降了服務器性能,能夠屏蔽這些如圖片,jscss這些不宜變化的內容。

server段下添加如下location

location ~ .*\.(js|jpe|jpeg|JPG|JPEG|gif|GIF)$ {

access_log  off;

}

3)日誌格式優化

nginx的日誌記錄格式默認沒有開啓,手工開啓就行:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                  '$status $body_bytes_sent "$http_referer" '

                  '"$http_user_agent" "$http_x_forwarded_for"';

其中,各個字段的含義以下:

main:表示日誌格式的名字,能夠自定義,如:access

1. $remote_addr                  $http_x_forwarded_for 用以記錄客戶端的ip地址;

2. $remote_user                   用來記錄客戶端用戶名稱;

3. $time_local                      用來記錄訪問時間與時區;

4. $request                           用來記錄請求的urlhttp協議;

5. $status                              用來記錄請求狀態,成功是200

6. $body_bytes_sent            記錄發送給客戶端文件主體內容大小;

7. $http_referer                    用來記錄從哪一個頁面連接訪問過來的;

8. $http_user_agent             記錄客戶端瀏覽器的相關信息;

6.21.10 目錄文件訪問控制

主要用在禁止目錄下指定文件被訪問,固然也能夠禁止全部文件被訪問!通常什麼狀況下用?好比是有存儲共享,這些文件原本都只是一些下載資源文件,那麼這些資源文件就不容許被執行,如shpyplphp等等。

1)配置限制訪問的文件

修改nginx主配置文件nginx.conf,在server段添加如下內容:

location ~ /images/.*\.(php|php5|js|sh|pl)$ {

deny all;

}

 

2)測試

注意:測試前先清空一下Chrome瀏覽的緩存,避免影響測試結果。

Windows端使用chrome瀏覽器訪問:

image.png

成功禁止訪問index.php文件。

再測試訪問文本文件:

image.png

訪問tt.txt文件沒有問題。

3)多目錄組合配置方法

location ~ ^/images/(attachment|avatar)/.*\.(php|php5|.sh|.py|.py)$ {

deny all;

}

4)使用條件規則配置禁止訪問文件

location ~* \.(txt|doc)$ {

if ( -f $request_filename ) {

root /usr/local/nginx/html;

break;

}

deny all;

}

 

測試:

1步:建立測試文件

 echo "Linux is a good system." > /usr/local/nginx/html/Linux.txt

2步:在客戶端上瀏覽器訪問:

image.png

6.21.11 來源訪問控制

這個須要ngx_http_access_module模塊支持,默認會安裝。

1)簡單案例

例:容許192.168.0.0/24網段主機訪問站點下的doc目錄,其它則不容許訪問。

server段中添加須要限制來源訪問的location匹配:

vim /usr/local/nginx/conf/nginx.conf

添加location匹配:

location ~ /doc {

allow 192.168.0.0/24;

    deny all;

}

說明:allowdeny後面能夠是IP地址或IP地址段。

重載nginx配置生效:

nginx -s reload

2)用條件規則實現

還能夠返回友好提示的404頁面:

if ( $remote_addr = 192.168.0.66 ) {

return 404;

}

6.21.x 測試中遇到的問題

1)訪問目錄下被禁止的文件類型時拋出下載對話框

image.png

緣由:兩個匹配的location(緩存目錄和禁止訪問指定類型文件)順序寫得不對。

image.png

緩存目錄的location放在了禁止訪問指定文件的location前面。

解決:調整兩個location位置:

image.png

原理解析:

1. 緣由是兩個配置都使用了萬能location匹配,優先級是同樣的,nginx從上而下讀取配置,優先級同樣的先讀到就先匹配。

2. 由於先匹配到了緩存目錄的location,目錄下的文件已經緩存到本地瀏覽器了,因此在去訪問被禁止的文件時,瀏覽器就直接到緩存取文件,但瀏覽器沒有nginx配置的deny all策略,所以不會禁止訪問,但.php這類文件瀏覽器沒法解析,就直接下載讓用戶本身處理。



文章還未完,請繼續關注!!!!!!!^_^

相關文章
相關標籤/搜索