一.壓縮
gzip on; 啟用 gzip 壓縮功能
gzip_min_length 1k; 不壓縮臨界值,大于1K的才壓縮
gzip_http_version; 設定對指定http協定版本進行壓縮
gzip_buffers 設定緩沖區的數量和大小,如果大小沒有設定,那麼預設是一個頁碼的大小,依賴所在系統平台
gzip_comp_level 1~9 指定壓縮率,數值越大,壓縮率是最大的,但是消耗CPU資源多,而且慢;而小的數值是最快的,消耗資源少,但是壓縮率小。這個根據需要自己權衡
gzip_proxied 根據響應的類型,來設定是否壓縮,比對的前提是後端伺服器傳回Via Header頭
gzip_types 指定需要壓縮類型
gzip_vary 該指令用于設定是否向響應資料包添加Vary:Accept-Encoding HTTP頭
gzip on;
gzip_comp_level ; # 壓縮比例,比例越大,壓縮時間越長。預設是1
gzip_types text/xml text/plain text/css application/javascript application/x-javascript application/rss+xml; # 哪些檔案可以被壓縮
gzip_disable "MSIE [1-6]\.";
測試:
用curl測試Gzip是否成功開啟(-H/–header 自定義頭資訊傳遞給伺服器)
curl -I -H “Accept-Encoding: gzip, deflate” “http://www.slyar.com/blog/”
二.緩存
1.nginx通過expires指令來設定浏覽器的Header
#圖檔緩存30天
location ~.*\.(jpg|png|jpeg)$
{
expires d;
}
#js css緩存一小時
location ~.*\.(js|css)?$
{
expires h;
}
2.nginx自帶的内置緩存子產品proxy_cache
proxy_temp_file_write_size k;
proxy_temp_path /usr/local/nginx/proxy_temp;
proxy_cache_path /usr/local/nginx/proxy_cache levels=: keys_zone=content:m inactive=d max_size=m;
levels設定目錄層次 keys_zone設定緩存名字和共享記憶體大小 inactive在指定時間内沒人通路則被删除 max_size最大緩存空間
location /
{
proxy_cache content; //根keys_zone後的内容對應
proxy_cache_valid d; //哪些狀态緩存多長時間
proxy_cache_valid any d; //其他的緩存多長時間
proxy_cache_key $host$uri$is_args$args; //通過key來hash,定義KEY的值
}
緩存的檔案名和key為代理URL的MD5 碼。
三.其他
worker_processes 定義了nginx對外提供web服務時的worker程序數。
worker_rlimit_nofile 102400;
更改worker程序的最大打開檔案數限制,這個指令是指當一個nginx程序打開的最多檔案描述符數目,理論值應該是最多打開檔案數(ulimit -n)與nginx程序數(worker_processes)相除,但是nginx配置設定請求并不是那麼均勻,是以最好與ulimit -n的值保持一緻。
Events子產品
multi_accept on 告訴nginx收到一個新連接配接通知後接受盡可能多的連接配接。
worker_connections 設定可由一個worker程序同時打開的最大連接配接數。如果設定了上面提到的worker_rlimit_nofile。最大客戶數也由系統的可用socket連接配接數限制(~ 64K),是以設定不切實際的高沒什麼好處。
use epoll; 使用epoll的I/O模型
HTTP 子產品
server_tokens 并不會讓nginx執行的速度更快,但它可以關閉在錯誤頁面中的nginx版本數字,這樣對于安全性是有好處的
sendfile 可以讓sendfile()發揮作用。sendfile()可以在磁盤和TCP socket之間互相拷貝資料(或任意兩個檔案描述符)。Pre-sendfile是傳送資料之前在使用者空間申請資料緩沖區。之後用read()将資料從檔案拷貝到這個緩沖區,write()将緩沖區資料寫入網絡。sendfile()是立即将資料從磁盤讀到OS緩存。因為這種拷貝是在核心完成的,sendfile()要比組合read()和write()以及打開關閉丢棄緩沖更加有效(處理靜态檔案時有效)。
tcp_nopush 告訴nginx在一個資料包裡發送所有頭檔案,而不一個接一個的發送。
tcp_nodelay 告訴nginx不要緩存資料,而是一段一段的發送–當需要及時發送資料時,就應該給應用設定這個屬性,這樣發送一小塊資料資訊時就不能立即得到傳回值。通過設定套接字的TCP_NODELAY = on 選項來完成,這樣就禁用了Nagle 算法。
limit_conn_zone 設定用于儲存各種key(比如目前連接配接數)的共享記憶體的參數。5m就是5兆位元組,這個值應該被設定的足夠大以存儲(32K*5)32byte狀态或者(16K*5)64byte狀态。
limit_conn 為給定的key設定最大連接配接數。這裡key是addr,我們設定的值是100,也就是說我們允許每一個IP位址最多同時打開有100個連接配接。
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 100;
ngx_http_limit_conn_module 子產品
伺服器流量異常,負載過大等等。對于大流量惡意的攻擊通路,會帶來帶寬的浪費,伺服器壓力,影響業務,往往考慮對同一個ip的連接配接數,并發數進行限制。
include /etc/nginx/mime.types;
default_type text/html;
charset UTF-8;
include 隻是一個在目前檔案中包含另一個檔案内容的指令。這裡我們使用它來加載稍後會用到的一系列的MIME類型。
default_type 設定檔案使用的預設的MIME-type。
charset 設定我們的頭檔案中的預設的字元集
open_file_cache 打開緩存的同時也指定了緩存最大數目,以及緩存的時間。我們可以設定一個相對高的最大時間,這樣我們可以在它們不活動超過20秒後清除掉。
open_file_cache_valid 在open_file_cache中指定檢測正确資訊的間隔時間。
open_file_cache_min_uses 定義了open_file_cache中指令參數不活動時間期間裡最小的檔案數。
open_file_cache_errors 指定了當搜尋一個檔案時是否緩存錯誤資訊,也包括再次給配置中添加檔案。我們也包括了伺服器子產品,這些是在不同檔案中定義的。如果你的伺服器子產品不在這些位置,你就得修改這一行來指定正确的位置。
open_file_cache 指令會對以下資訊進行緩存:
* 打開檔案描述符的檔案大小和修改時間資訊
* 存在的目錄資訊
* 搜尋檔案的錯誤資訊:檔案不存在無權限讀取等資訊
#指定一個request可接受的body大小,即請求頭裡的Content-Length. 如果請求body超過該值,nginx傳回413(“Request Entity Too Large”),大檔案需要适當調大
client_max_body_size 10M;
#用戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過1k
client_header_buffer_size 4k;
#指定允許為用戶端請求頭最大配置設定buffer個數和大小.
large_client_header_buffers 8 128k;
四.核心優化
# vim /etc/sysctl.conf
#表示開啟重用。允許将TIME-WAIT sockets重新用于新的TCP連接配接,預設為0,表示關閉
net.ipv4.tcp_tw_reuse =
#用戶端為NAT網絡模式下,伺服器會主動丢包,表示開啟TCP連接配接中TIME-WAIT sockets的快速回收,預設為0,表示關閉
net.ipv4.tcp_tw_recycle =
#開啟TCP時間戳
net.ipv4.tcp_timestamps =
#表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀态的時間。
net.ipv4.tcp_fin_timeout =
# netstat -s|grep timestamp
timeout數量不大的時候,不用調整tcp_tw_recycle參數,雖然伺服器端沒有使用nat,但是用戶端使用snat的情況很多,如果後發現packets rejects in established connections because of timestamp增長很快
net.ipv4.tcp_max_tw_buckets = 6000 表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字将立刻被清除并列印警告資訊。
net.ipv4.ip_local_port_range = 1024 65000
允許系統打開的端口範圍
net.ipv4.tcp_syncookies = 1
#表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;
net.core.somaxconn = 262144
web 應用中listen 函數的backlog 預設會給我們核心參數的net.core.somaxconn 限制到128,而nginx 定義的NGX_LISTEN_BACKLOG 預設為511,是以有必要調整這個值。
net.core.netdev_max_backlog = 262144
該參數決定了, 每個網絡接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目, 不要設的過大
net.ipv4.tcp_synack_retries = 1
syn-ack握手狀态重試次數,預設5,遭受syn-flood攻擊時改為1或2
為了打開對端的連接配接,核心需要發送一個SYN 并附帶一個回應前面一個SYN 的ACK。也就是所謂三次握手中的第二次握手。這個設定決定了核心放棄連接配接之前發送SYN+ACK 包的數量。
net.ipv4.tcp_syn_retries = 1
外向syn握手重試次數,預設4
在核心放棄建立連接配接之前發送SYN 包的數量。
net.ipv4.neigh.default.gc_stale_time=120 ARP參數,檢查一次相鄰層記錄的有效性的周期。當相鄰層記錄失效時,将在給它發送資料前,再解析一次。預設值是60秒。
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
arp_ignore:定義了網卡在響應外部ARP請求時候的響應級别
0:預設值,不管哪塊網卡接收到了ARP請求,隻要發現本機有這個MAC都給與響應
1:總是使用最合适的網卡來響應,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另一塊網卡的,這個時候接收到ARP請求的這塊網卡就一定不響應,隻有發現請求的MAC是自己的才給與響應。
net.ipv4.conf.default.arp_announce =2
net.ipv4.conf.all.arp_announce =2
net.ipv4.conf.lo.arp_announce = 2
定義了網卡在向外宣告自己的MAC-IP時候的限制級别
有三個值:
0:預設值,不管哪塊網卡接收到了ARP請求,隻要發現本機有這個MAC都給與響應
1:盡量避免響應ARP請求中MAC不是本網卡的,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另一塊網卡的,這個時候接收到ARP請求的這塊網卡就盡量避免響應
2:總是使用最合适的網卡來響應,一個主機有多塊網卡,其中一塊網卡接收到了ARP請求,發現所請求的MAC是本機另一塊網卡的,這個時候接收到ARP請求的這塊網卡就一定不響應,隻有發現請求的MAC是自己的才給與響應。
執行sysctl-p使修改生效
# sysctl-p
完整配置
worker_processes ;
error_log logs/error.log;
events {
worker_connections ;
multi_accept on;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
server_tokens off;
keepalive_timeout ;
gzip on;
gzip_min_length k;
gzip_buffers k;
gzip_http_version ;
gzip_comp_level ;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
open_file_cache max= inactive=s;
open_file_cache_valid s;
open_file_cache_min_uses ;
client_max_body_size m;
client_body_buffer_size k;
#proxy_redirect off;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_ignore_client_abort on;
#proxy_connect_timeout 60s;
#proxy_send_timeout 60s;
#proxy_read_timeout 60s;
#proxy_buffer_size 64k;
#proxy_buffers 4 64k;
#proxy_busy_buffers_size 128k;
#proxy_intercept_errors on;
#proxy_temp_path /etc/nginx/proxy_temp;
#proxy_cache_path /etc/nginx/proxy_cache levels=1:2 keys_zone=one_cache:20m inactive=1d max_size=100m;
#proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
server {
listen ;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
#location ~ .*\.(html|htm|ico|jpeg|git|jpg|png|bmp|swf)$ {
# root ;
# proxy_pass http://www.demo.com:8080;
# proxy_cookie_path /demo/ /;
#
# proxy_cache one_cache;
# proxy_cache_valid 200 304 301 302 1d;
# proxy_cache_valid any 6h;
# proxy_cache_key $host$uri$is_args$args;
# add_header X-Cache '$upstream_cache_status from $host';
# expires 7d;
#}
#
#location ~ .*\.(css|js)$ {
# root ;
# proxy_pass http://www.demo.com:8080;
# proxy_cookie_path /demo/ /;
#
# proxy_cache one_cache;
# proxy_cache_valid 200 304 301 302 1d;
# proxy_cache_valid any 6h;
# proxy_cache_key $host$uri$is_args$args;
# add_header X-Cache '$upstream_cache_status from $host';
# expires 1d;
#}
#
#location ~ .*$ {
# proxy_pass http://www.demo.com:8080;
# proxy_cookie_path /demo/ /;
#}
}
}