1. 程式人生 > 其它 >Nginx-服務配置與優化

Nginx-服務配置與優化

Nginx服務配置與優化

1.Nginx配置檔案介紹

1.1 配置檔案位置

本次配置的nginx配置位於:/usr/local/nginx/conf/nginx.conf

在忘記配置檔案的時候可以通過find命令找到對應地址。

[root@local profile.d]# find / -name nginx.conf
/usr/local/nginx/conf/nginx.conf
/software/nginx-1.14.0/conf/nginx.conf

Nginx 的預設配置檔案為 nginx.conf

  • nginx -c xxx.conf - 以指定的檔案作為配置檔案,啟動 Nginx。

1.2 nginx配置檔案典型結構

#main段配置資訊
#定義 nginx 執行的使用者和使用者組
user nginx nginx;

#nginx 程序數,建議設定為等於 CPU 總核心數。
worker_processes 8;

#nginx 預設沒有開啟利用多核 CPU, 通過增加 worker_cpu_affinity 配置引數來充分利用多核 CPU 以下是 8 核的配置引數
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#全域性錯誤日誌定義型別,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#程序檔案
pid /var/run/nginx.pid;

#一個 nginx 程序開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(系統的值 ulimit -n)與 nginx 程序數相除,但是 nginx 分配請求並不均勻,所以建議與 ulimit -n 的值保持一致。
worker_rlimit_nofile 65535;

# events段配置資訊
events {
    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll 模型是 Linux 2.6 以上版本核心中的高效能網路 I/O 模型,如果跑在 FreeBSD 上面,就用 kqueue 模型。
    #epoll 是多路複用 IO(I/O Multiplexing) 中的一種方式,但是僅用於 linux2.6 以上核心,可以大大提高 nginx 的效能
    use epoll;
    
    ############################################################################
    #單個後臺 worker process 程序的最大併發連結數
    #事件模組指令,定義 nginx 每個程序最大連線數,預設 1024。最大客戶連線數由 worker_processes 和 worker_connections 決定
    #即 max_client=worker_processes*worker_connections, 在作為反向代理時:max_client=worker_processes*worker_connections / 4
    worker_connections 65535;
    ############################################################################
}

# http段配置資訊
# 配置使用最頻繁的部分,代理、快取、日誌定義等絕大多數功能和第三方模組的配置都在這裡設定
http { 
    include mime.types; #副檔名與檔案型別對映表
    default_type application/octet-stream; #預設檔案型別
    #charset utf-8; #預設編碼
    server_names_hash_bucket_size 128; #伺服器名字的 hash 表大小
    client_header_buffer_size 32k; #上傳檔案大小限制
    large_client_header_buffers 4 64k; #設定請求緩
    client_max_body_size 8m; #設定請求緩
    sendfile on; #開啟高效檔案傳輸模式,sendfile 指令指定 nginx 是否呼叫 sendfile 函式來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟 IO 重負載應用,可設定為 off,以平衡磁碟與網路 I/O 處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成 off。
    
    autoindex on; #開啟目錄列表訪問,合適下載伺服器,預設關閉。
    tcp_nopush on; #防止網路阻塞
    tcp_nodelay on; #防止網路阻塞
   
   ##連線客戶端超時時間各種引數設定##
    keepalive_timeout  120;          #單位是秒,客戶端連線時時間,超時之後伺服器端自動關閉該連線 如果 nginx 守護程序在這個等待的時間裡,一直沒有收到瀏覽發過來 http 請求,則關閉這個 http 連線
    client_header_timeout 10;        #客戶端請求頭的超時時間
    client_body_timeout 10;          #客戶端請求主體超時時間
    reset_timedout_connection on;    #告訴 nginx 關閉不響應的客戶端連線。這將會釋放那個客戶端所佔有的記憶體空間
    send_timeout 10;                 #客戶端響應超時時間,在兩次客戶端讀取操作之間。如果在這段時間內,客戶端沒有讀取任何資料,nginx 就會關閉連線
   
   ################################
    #FastCGI 相關引數是為了改善網站的效能:減少資源佔用,提高訪問速度。下面引數看字面意思都能理解。
    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;
    
    ###作為代理快取伺服器設定#######
    ###先寫到 temp 再移動到 cache
    #proxy_cache_path /var/tmp/nginx/proxy_cache levels=1:2 keys_zone=cache_one:512m inactive=10m max_size=64m;
    ###以上 proxy_temp 和 proxy_cache 需要在同一個分割槽中
    ###levels=1:2 表示快取級別,表示快取目錄的第一級目錄是 1 個字元,第二級目錄是 2 個字元 keys_zone=cache_one:128m 快取空間起名為 cache_one 大小為 512m
    ###max_size=64m 表示單個檔案超過 128m 就不快取了  inactive=10m 表示快取的資料,10 分鐘內沒有被訪問過就刪除
    #########end####################
   
   #####對傳輸檔案壓縮###########
    #gzip 模組設定
    gzip on; #開啟 gzip 壓縮輸出
    gzip_min_length 1k; #最小壓縮檔案大小
    gzip_buffers 4 16k; #壓縮緩衝區
    gzip_http_version 1.0; #壓縮版本(預設 1.1,前端如果是 squid2.5 請使用 1.0)
    gzip_comp_level 2; #壓縮等級,gzip 壓縮比,1 為最小,處理最快;9 為壓縮比最大,處理最慢,傳輸速度最快,也最消耗 CPU;
    gzip_types text/plain application/x-javascript text/css application/xml;
    #壓縮型別,預設就已經包含 text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個 warn。
    gzip_vary on;
    ##############################
    #limit_zone crawler $binary_remote_addr 10m; #開啟限制 IP 連線數的時候需要使用

    # server段配置資訊
    server {
      listen       80;       # 配置監聽的埠
      server_name  localhost;    # 配置的域名

      # location段配置資訊
      location / {
        root   /usr/share/nginx/html;  # 網站根目錄
        index  index.html index.htm;   # 預設首頁檔案
        deny 172.168.22.11;   # 禁止訪問的ip地址,可以為all
        allow 172.168.33.44;# 允許訪問的ip地址,可以為all
      }

      error_page 500 502 503 504 /50x.html;  # 預設50x對應的訪問頁面
      error_page 400 404 error.html;   # 同上
    }
}
  • main:全域性配置,對全域性生效;
  • events:配置影響 Nginx 伺服器與使用者的網路連線;
  • http:配置代理,快取,日誌定義等絕大多數功能和第三方模組的配置;
  • server:配置虛擬主機的相關引數,一個 http 塊中可以有多個 server 塊;
  • location:用於配置匹配的 url ;
  • upstream:配置後端伺服器具體地址,負載均衡配置不可或缺的部分。

配置檔案整體結構為:

1.3 Nginx常用命令

常用到的命令如下:

nginx -s stop       快速關閉Nginx,可能不儲存相關資訊,並迅速終止web服務。
nginx -s quit       平穩關閉Nginx,儲存相關資訊,有安排的結束web服務。
nginx -s reload     因改變了Nginx相關配置,需要重新載入配置而過載。
nginx -s reopen     重新開啟日誌檔案。
nginx -c filename   為 Nginx 指定一個配置檔案,來代替預設的。
nginx -t            不執行,僅僅測試配置檔案。nginx 將檢查配置檔案的語法的正確性,並嘗試開啟配置檔案中所引用到的檔案。
nginx -v            顯示 nginx 的版本。
nginx -V            顯示 nginx 的版本,編譯器版本和配置引數。

在使用命令的時候注意將nginx相關命令加入到系統命令庫中.

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

2.Nginx服務優化

在進行優化前,如果可以先通過nginx -V檢視安裝自定義配置的模組。

[root@local conf]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --http-log-path=/data/logs/nginx/access.log --error-log-path=/data/logs/nginx/error.log --with-http_ssl_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_stub_status_module

2.1 隱藏版本號

版本號資訊可以通過http模組的配置進行隱藏,從而防止網路攻擊根據nginx版本號獲知版本漏洞發起攻擊。

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;								#新增,關閉版本號
    ......
}

在未進行配置的時候,通過curl -I 檢視http資訊的頭資訊。

[root@local profile.d]# curl -I http://192.168.80.20
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Mon, 09 May 2022 09:15:12 GMT
Content-Type: text/html
Content-Length: 25
Last-Modified: Mon, 09 May 2022 08:18:31 GMT
Connection: keep-alive
ETag: "6278ce57-19"
Accept-Ranges: bytes

修改配置後,版本號已隱藏

[root@local conf]# curl -I http://192.168.80.20
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 09 May 2022 09:20:20 GMT
Content-Type: text/html
Content-Length: 25
Last-Modified: Mon, 09 May 2022 08:18:31 GMT
Connection: keep-alive
ETag: "6278ce57-19"
Accept-Ranges: bytes

2.2 快取圖片

當Nginx將網頁資料返回給客戶端後,可設定快取的時間,以方便在日後進行相同內容的請求時直接返回,避免重複請求,加快了訪問速度一般針對靜態網頁設定,對動態網頁不設定快取時間。

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	...... 
		location / {
			root html;
			index index.html index.htm;
		}
		
		location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { 		#加入新的 location,以圖片作為快取物件
			root html;
			expires 1d;									#指定快取時間,1天
		}
......
	}
}

檢視響應頭中包含 Cahce-Control:max-age=86400 表示快取時間是 86400 秒。也就是快取一天的時間,一天之內瀏覽器訪問這個頁面,都是用快取中的資料,而不需要向 Nginx 伺服器重新發出請求,減少了伺服器的使用頻寬。

2.3 配置連線超時

HTTP有一個KeepAlive模式,它告訴web伺服器在處理完一個請求後保持這個TCP連線的開啟狀態。若接收到來自同一客戶端的其它請求,服務端會利用這個未被關閉的連線,而不需要再建立一個連線。KeepAlive 在一段時間內保持開啟狀態,它們會在這段時間內佔用資源。佔用過多就會影響效能。

vim /usr/local/nginx/conf/nginx.conf
http {
...... 
    keepalive_timeout 65 180;
    client_header_timeout 80;
    client_body_timeout 80;
    reset_timedout_connection on;
    send_timeout 10;
...... 
}
  • keepalive_timeout
    指定KeepAlive的超時時間(timeout)。指定每個TCP連線最多可以保持多長時間,伺服器將會在這個時間後關閉連線。 Nginx的預設值是65秒,有些瀏覽器最多隻保持 60 秒,所以可以設定為 60 秒。若將它設定為0,就禁止了keepalive 連線。
    第二個引數(可選的)指定了在響應頭Keep-Alive:timeout=time中的time值。這個頭能夠讓一些瀏覽器主動關閉連線,這樣伺服器就不必去關閉連線了。沒有這個引數,Nginx 不會發送 Keep-Alive 響應頭。

  • client_header_timeout
    客戶端向服務端傳送一個完整的 request header 的超時時間。如果客戶端在指定時間內沒有傳送一個完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。

  • client_body_timeout
    指定客戶端與服務端建立連線後傳送 request body 的超時時間。如果客戶端在指定時間內沒有傳送任何內容,Nginx 返回 HTTP 408(Request Timed Out)。

  • reset_timedout_connection
    告訴 nginx 關閉不響應的客戶端連線。這將會釋放那個客戶端所佔有的記憶體空間

  • send_timeout 10
    客戶端響應超時時間,在兩次客戶端讀取操作之間。如果在這段時間內,客戶端沒有讀取任何資料,nginx 就會關閉連線。

以上引數靈活按需設定即可。

2.4 配置程序數(併發數)

在高併發場景,需要啟動更多的Nginx程序以保證快速響應,以處理使用者的請求,避免造成阻塞。理論上單個Nginx應用服務可以支援50000併發,單根據實際情況和硬體設施的限制,單個Nginx服務提供併發數在30000以下。

Nginx併發數受到全域性配置中的worker_processes和events配置中的worker_connections引數限制。即max_client=worker_processes*worker_connections

其中worker_processes為Nginx可以使用程序數,一般設定為伺服器的cpu核心數,如果cpu有超執行緒技術,則設定對應的超執行緒數量,如4核心8執行緒CPU,該引數設定為8.

Nginx預設沒有開啟利用多核 CPU, 通過增加 worker_cpu_affinity 配置引數來充分利用多核 CPU 以下是 8 核的配置引數
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

兩核心引數配置為
worker_cpu_affinity 01 10;

worker_connection為單個Nginx程序可以處理的連線數。值為1-65535。最大值是由linux單程序最大開啟檔案數所限制。

該值的查詢可以通過下述命令查詢。

[root@local conf]# ulimit -n
1024

通過修改/etc/security/limits.conf可以修改。在該檔案加入配置項

* soft nofile 65535
* hard nofile 65535

注意:* 要加到檔案裡面,以上在limits.conf檔案中新增的兩句話的含義是
soft(應用軟體)級別限制的最大可開啟檔案數的限制
hard表示作業系統級別限制的最大可開啟檔案數的限制,
*表示所有使用者都生效。

修改完該配置後,該選項並非立即生效,在無法重啟的時候需要使用ulimit -n臨時配置一下。

[root@local conf]# ulimit -n 65535        #配置修改後無法直接生效,所以在不能重啟的情況下使用ulimit -n 數字臨時設定
[root@local conf]# ulimit -a 
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14950
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14950
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

在完成最後開啟檔案數的修改後,修改Nginx配置過程應該為。

cat /proc/cpuinfo | grep -c "physical id"	#檢視cpu核數
ps aux | grep nginx							#檢視nginx主程序中包含幾個子程序

vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;				#修改為核數相同或者2倍
worker_cpu_affinity 01 10;			#設定每個程序由不同cpu處理,程序數配為4時0001 0010 0100 1000
…………………………
events{
   …………
   worker_connections 65535;
}


2.5 配置網頁壓縮(gzip)

Nginx的ngx_http_gzip_module壓縮模組提供對檔案內容壓縮的功能。允許Nginx伺服器將輸出內容在傳送客戶端之前進行壓縮,以節約網站頻寬,提升使用者的訪問體驗,預設已經安裝。可在配置檔案中加入相應的壓縮功能引數對壓縮效能進行優化。

在未配置gzip壓縮的時候,圖片大小為1.74MB。

配置壓縮

vim /usr/local/nginx/conf/nginx.conf
...... 
http {
...... 
   gzip on;							#取消註釋,開啟gzip壓縮功能
   gzip_min_length 1k;      		#最小壓縮檔案大小,防止所有檔案都壓縮,反而影響服務效率。
   gzip_buffers 4 64k;      		#壓縮緩衝區,大小為4個64k緩衝區
   gzip_http_version 1.1;   		#壓縮版本(預設1.1,前端如果是squid2.5請使用1.0)
   gzip_comp_level 6;       		#壓縮比率
   gzip_vary on;					#支援前端快取伺服器儲存壓縮頁面
   gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;		#壓縮型別,表示哪些網頁文件啟用壓縮功能
...... 
}

開啟後,圖片壓縮為1.28MB,並在請求頭上顯示gzip。

2.6 配置防盜鏈

防盜鏈是指避免其他網站通過網路連線訪問伺服器上的圖片,從而導致主機流量損失。此時我們使用另外一臺主機。

首先配置盜鏈網站。

[root@localhost html]# cat index.html
<img src="http://www.canyun.com/wallhaven-y8lqo7.jpg" />   //獲取的是原圖

在配置20主機的防盜鏈設定

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
	    #~* \.(jpg|gif|swf)$ :這段正則表示式表示匹配不區分大小寫,以.jpg 或.gif 或.swf 結尾的檔案;
		location ~* \.(jpg|gif|swf)$ {   
            #valid_referers :設定信任的網站,可以正常使用圖片;
			valid_referers none blocked *.canyun.com canyun.com;
			#if語句:如果連結的來源域名不在valid_referers所列出的列表中,$invalid_referer為true,則執行後面的操作,即進行重寫,到防盜鏈圖片
			if ( $invalid_referer ) {
				rewrite ^/ http://www.canyun.com/error.png;
            }
        }
	......
	}
}

重新整理並清理快取,檢視25主機是否正常跳轉防盜鏈圖片。