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報錯頁面:
說明:nginx服務器的類型和版本號都修改了。
5)軟件包和編譯參數說明
軟件包說明:
軟件包 |
說明 |
gcc |
c語言編譯器。 |
gcc-c++ |
c++語言編譯器。 |
autoconf automake |
用於configure和 make編譯的工具。 |
zlib |
nginx提供gzip模塊,須要zlib庫支持。 |
openssl |
nginx提供ssl功能。 |
pcre |
支持地址重寫rewrite功能。 |
編譯參數說明:
參數 |
說明 |
--with-http_dav_module |
啓用支持(增長PUT,DELETE,MKCOL:建立集合,COPY和MOVE方法)。 |
--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 設置nginx的cpu親和力
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設定的值和nginx的worker_connections的值。通常狀況下系統ulimit -n、worker_rlimit_nofile 、worker_connections三者的值是同樣的。
worker_processes* worker_connections就是nginx可以處理的併發鏈接數,如:nginx須要處理60000的併發請求,能夠設置worker_processes=4,worker_connections=15000;或worker_processes=8,orker_connections=7500。
查看每一個nginx進程使用的內存數:
[root@nginx ~]# top -u nginx
每一個nginx使用的內存爲2M左右。
2)設置Nginx運行CPU的親和力:
CPU的親和力,就是把nginx每一個進程綁定到固定的cpu上,從而減小cpu上下文切換致使的額外的開銷。
好比服務器是4核4線程的cpu,nginx.conf文件應該配置爲以下:
3 worker_processes 4;
4 worker_cpu_affinity 0001 0010 0100 1000;
8核服務器8核心8線程的CPU,nginx.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「 表示使用2個CPU(或核心)運行nginx進程,「worker_cpu_affinity 001 100」 表示nginx的兩個進程分別分配到第「0」號和第「2」好CPU。
2. 分配的nginx進程到哪一個CPU編號跟二進制數「001」與「100」對應,與1所在的位置有關:
從右往左看,1所在第幾位就分配給第幾個CPU
001:分配第1個(編號爲0)CPU
010:分配第2個(編號爲1)CPU
100:分配第3個(編號爲2)CPU
1000:分配第4個(編號爲3)CPU
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系統調優的內容。
2)Nginx的事件處理模型
select,poll,epoll都是nginx下的IO多路複用的機制。I/O多路複用就經過一種機制,能夠監視多個描述符,一旦某個描述符就緒(通常是讀就緒或者寫就緒),可以通知程序進行相應的讀寫操做。
Epoll在Linux2.6內核中正式引入,和select和poll類似,其實都是I/O多路複用技術。
epoll優點:
1. Epoll沒有最大併發鏈接的限制,上限是最大能夠打開文件的數目,這個數字通常遠大於2048,通常來講這個數目和系統內存關係很大,具體數目能夠cat /proc/sys/fs/file-max察看。
[root@nginx ~]# cat /proc/sys/fs/file-max
198351
2. 效率提高,Epoll最大的優勢就在於它只管你「活躍」的鏈接,而跟鏈接總數無關,所以在實際的網絡環境中,Epoll的效率就會遠遠高於select和poll。
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_nodelay、client_header_timeout;、client_body_timeout、send_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匹配
nginx的location很是靈活,並且設置簡單。
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配置
1)Fastcgi相關概念
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;
}
注意:其中nginx是keys_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. URL(Uniform Resource Locator,統一資源定位符)
2. URN:Uniform Resource Name,統一資源名稱
3. URI(Uniform Resource Identifier,統一資源標識符)
fastcgi cache資料:
官方文檔:
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache
3)Fastcgi優化參數說明
配置項 |
配置值 |
說明 |
fastcgi_connect_timeout |
300 |
指定連接到後端FastCGI的超時時間。 |
fastcgi_send_timeout |
300 |
向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。 |
fastcgi_read_timeout |
300 |
指定接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。 |
fastcgi_buffer_size |
64k |
指定讀取FastCGI應答第一部分須要用多大的緩衝區,這個值表示將使用1個64KB的緩衝區讀取應答的第一部分(應答頭),能夠設置爲gastcgi_buffers選項指定的緩衝區大小。 |
fastcgi_buffers |
4 64k |
指定本地須要用多少個和多大的緩衝區來緩衝FastCGI的應答請求,若是一個php腳本所產生的頁面大小爲256KB,那麼會分配4個64KB的緩衝區來緩存,若是頁面大小大於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 |
用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一小時,要和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
通常咱們須要壓縮的內容有:文本,js,html,css,對於圖片,視頻,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 緩存優化
緩存,主要針對於圖片,css,js等元素更改機會比較少的狀況下使用,特別是圖片,佔用帶寬大,咱們徹底能夠設置圖片在瀏覽器本地緩存365d,css,js,html能夠緩存個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. 網站升級對於js,css元素,通常能夠更名,把css,js,推送到CDN。
網站不但願被緩存的內容:
1)廣告圖片
2)網站流量統計工具
3)更新頻繁的文件(google的logo)
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中,由於這些日誌沒有意義,咱們分析的話只須要分析訪問日誌,看看一些頁面連接,如200,301,404的狀態碼,在SEO中很重要,並且咱們統計PV是頁面計算,這些都沒有意義,反而消耗了磁盤IO,下降了服務器性能,能夠屏蔽這些如圖片,js,css這些不宜變化的內容。
在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: 用來記錄請求的url與http協議;
5. $status: 用來記錄請求狀態,成功是200;
6. $body_bytes_sent: 記錄發送給客戶端文件主體內容大小;
7. $http_referer: 用來記錄從哪一個頁面連接訪問過來的;
8. $http_user_agent: 記錄客戶端瀏覽器的相關信息;
6.21.10 目錄文件訪問控制
主要用在禁止目錄下指定文件被訪問,固然也能夠禁止全部文件被訪問!通常什麼狀況下用?好比是有存儲共享,這些文件原本都只是一些下載資源文件,那麼這些資源文件就不容許被執行,如sh,py,pl,php等等。
1)配置限制訪問的文件
修改nginx主配置文件nginx.conf,在server段添加如下內容:
location ~ /images/.*\.(php|php5|js|sh|pl)$ {
deny all;
}
2)測試
注意:測試前先清空一下Chrome瀏覽的緩存,避免影響測試結果。
在Windows端使用chrome瀏覽器訪問:
成功禁止訪問index.php文件。
再測試訪問文本文件:
訪問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步:在客戶端上瀏覽器訪問:
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;
}
說明:allow和deny後面能夠是IP地址或IP地址段。
重載nginx配置生效:
nginx -s reload
2)用條件規則實現
還能夠返回友好提示的404頁面:
if ( $remote_addr = 192.168.0.66 ) {
return 404;
}
6.21.x 測試中遇到的問題
1)訪問目錄下被禁止的文件類型時拋出下載對話框
緣由:兩個匹配的location(緩存目錄和禁止訪問指定類型文件)順序寫得不對。
緩存目錄的location放在了禁止訪問指定文件的location前面。
解決:調整兩個location位置:
原理解析:
1. 緣由是兩個配置都使用了萬能location匹配,優先級是同樣的,nginx從上而下讀取配置,優先級同樣的先讀到就先匹配。
2. 由於先匹配到了緩存目錄的location,目錄下的文件已經緩存到本地瀏覽器了,因此在去訪問被禁止的文件時,瀏覽器就直接到緩存取文件,但瀏覽器沒有nginx配置的deny all策略,所以不會禁止訪問,但.php這類文件瀏覽器沒法解析,就直接下載讓用戶本身處理。
文章還未完,請繼續關注!!!!!!!^_^