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主機是否正常跳轉防盜鏈圖片。