一:常用功能優化:
1:網絡連接的優化:
只能在events模塊設置,用於防止在同一一個時刻只有一個請求的情況下,出現多個睡眠進程會被喚醒但只能有一個進程可獲得請求的尷尬,如果不優化,在多進程的nginx會影響以部分性能。
events { accept_mutex on; #優化同一時刻只有一個請求而避免多個睡眠進程被喚醒的設置,on為防止被同時喚醒,默認為off,因此nginx剛安裝完以后要進行適當的優化。 }
2.設置是否允許同時接受多個網絡連接:
只能在events模塊設置,Nginx服務器的每個工作進程可以同時接受多個新的網絡連接,但是需要在配置文件中配置,此指令默認為關閉,即默認為一個工作進程只能一次接受一個新的網絡連接,打開后幾個同時接受多個,配置語法如下:
events { accept_mutex on; multi_accept on; #打開同時接受多個新網絡連接請求的功能。 }
3.隱藏ngxin版本號:
當前使用的nginx可能會有未知的漏洞,如果被黑客使用將會造成無法估量的損失,但是我們可以將nginx的版本隱藏,如下:
server_tokens off; #在http 模塊當中配置
4.:選擇事件驅動模型:
Nginx支持眾多的事件驅動,比如select、poll、epoll,只能設置在events模塊中設置:
events { accept_mutex on; multi_accept on; use epoll; #使用epoll事件驅動,因為epoll的性能相比其他事件驅動要好很多 }
5:配置單個工作進程的最大連接數:
通過worker_connections number;進行設置,numebr為整數,number的值不能大於操作系統能打開的最大的文件句柄數,使用ulimit -n可以查看當前操作系統支持的最大文件句柄數,默認為為1024.
events { worker_connections 102400; #設置單個工作進程最大連接數102400 accept_mutex on; multi_accept on; use epoll; }
6:定義MIME-Type:
在瀏覽器當中可以顯示的內容有HTML/GIF/XML/Flash等內容,瀏覽器為取得這些資源需要使用MIME Type,即MIME是網絡資源的媒體類型,Nginx作為Web服務器必須要能夠識別全都請求的資源類型,在nginx.conf文件中引用了一個第三方文件,使用include導入:
include mime.types;
default_type application/octet-stream;
7:自定義訪問日志:
訪問日志是記錄客戶端即用戶的具體請求內容信息,全局配置模塊中的error_log是記錄nginx服務器運行時的日志保存路徑和記錄日志的level,因此有着本質的區別,而且Nginx的錯誤日志一般只有一個,但是訪問日志可以在不同server中定義多個,定義一個日志需要使用access_log指定日志的保存路徑,使用log_format指定日志的格式,格式中定義要保存的具體日志內容:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main;
8:將日志定義為json格式:
在使用日志分析工具如ELK對訪問日志做統計的時候,就需要將日志格式定義為json格式,以便於取相應字段的key做統計,完整的定義如下:
log_format logstash_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"domain":"$host",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"agent":"$http_user_agent",' '"status":"$status"}'; server { listen 8090; server_name samsung.chinacloudapp.cn; access_log /var/log/nginx/samsung1.access.log logstash_json; location / { root html; index index1.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } access_log /var/log/nginx/json.access.log logstash_json; #定義日志路徑為/var/log/nginx/json.access.log,並引用在主配置文件nginx.conf中定義的json日志格式
json格式的日志內如下:
{"@timestamp":"2016-04-25T13:16:29+08:00","host":"192.168.0.202","clientip":"106.120.73.171","size":0,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"samsung.chinacloudapp.cn","url":"/index1.html","domain":"samsung.chinacloudapp.cn","xff":"-","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36","status":"304"}
9:配置允許sendfile方式傳輸文件:
是由后端程序負責把源文件打包加密生成目標文件,然后程序讀取目標文件返回給瀏覽器;這種做法有個致命的缺陷就是占用大量后端程序資源,如果遇到一些訪客下載速度巨慢,就會造成大量資源被長期占用得不到釋放(如后端程序占用的CPU/內存/進程等),很快后端程序就會因為沒有資源可用而無法正常提供服務。通常表現就是 nginx報502錯誤,而sendfile打開后配合location可以實現有nginx檢測文件使用存在,如果存在就有nginx直接提供靜態文件的瀏覽服務,因此可以提升服務器性能.
可以配置在http、server或者location模塊,配置如下:
sendfile on;
sendfile_max_chunk 512k; #Nginxg工作進程每次調用sendfile()傳輸的數據最大不能超出這個值,默認值為0表示無限制,可以設置在http/server/location模塊中。
10:配置nginx工作進程最大打開文件數:
可以設置為linux系統最大打開的文件數量一致,在全局模塊配置
worker_rlimit_nofile 65535;
11:會話保持時間:
用戶和服務器建立連接后客戶端分配keep-alive鏈接超時時間,服務器將在這個超時時間過后關閉鏈接,我們將它設置低些可以讓ngnix持續工作的時間更長,1.8.1默認為65秒,一般不超過120秒。
keepalive_timeout 65 60; #后面的60為發送給客戶端應答報文頭部中顯示的超時時間設置為60s:如不設置客戶端將不顯示超時時間。 Keep-Alive:timeout=60 #瀏覽器收到的服務器返回的報文 如果設置為0表示關閉會話保持功能,將如下顯示: Connection:close #瀏覽器收到的服務器返回的報文
12配置網絡監聽:
使用命令listen,可以配置監聽IP+端口,端口或監聽unix socket:
listen 8090; #監聽本機的IPV4和IPV6的8090端口,等於listen *:8000 listen 192.168.0.1:8090; #監聽指定地址的8090端口 listen Unix:/www/file #監聽unix socket
二:server部分主要配置:
1、基於域名和IP的虛擬主機
server_name localhost www.a.com; #多個域名用空格間隔即可 server_name 192.168.0.2; #IP是本機的網卡IP地址
2、location 模塊正則匹配配置:
在沒有使用正則表達式的時候,nginx會先在server中的多個location選取匹配度最高的一個uri,uri是用戶請求的字符串,即域名后面的web文件路徑,然后使用該location模塊中的正則url和字符串,如果匹配成功就結束搜索,並使用此location處理此請求。
location 正則匹配的語法:
= #用於標准uri前,需要請求字串與uri完全匹配,如果匹配成功就停止向下匹配並立即處理請求。 ~ #區分大小寫 ~* #不區分大寫 !~ #區分大小寫不匹配 !~* #不區分大小寫不匹配 ^ #匹配以什么開頭 $ #匹配以什么結尾 \ #轉義字符。可以轉. * ?等 * #代表任意長度的任意字符 -f和!-f #用來判斷是否存在文件 -d和!-d #用來判斷是否存在目錄 -e和!-e #用來判斷是否存在文件或目錄 -x和!-x #用來判斷文件是否可執行
3、常見http狀態碼:
200 #請求成功,即服務器返回成功 301 #永久重定向 302 #臨時重定向 403 #禁止訪問,一般是服務器權限拒絕
400 #錯誤請求,請求中有語法問題,或不能滿足請求。
403 #服務器權限問題導致無法顯示 404 #服務器找不到用戶請求的頁面 500 #服務器內部錯誤,大部分是服務器的設置或內部程序出現問題
501 #沒有將正在訪問的網站設置為瀏覽器所請求的內容 502 #網關問題,是代理服務器請求后端服務器時,后端服務器不可用或沒有完成 相應網關服務器,這通常是反向代理服務器下面的節點出問題導致的。 503 #服務當前不可用,可能是服務器超載或停機導致的,或者是反向代理服務器后面沒有可以提供服務的節點。 504 #網關超時,一般是網關代理服務器請求后端服務器時,后端服務器沒有在指定的時間內完成處理請求,多數是服務器過載導致沒有在特定的時間內返回數據給前端代理服務器。
505 #該網站不支持瀏覽器用於請求網頁的HTTP協議版本(最為常見的是HTTP/1.1)
4.在server部分使用location配置一個web界面:
要求:在html/localtion/myweb 里面有個index.html文件里面寫了myweb,當訪問nginx 服務器的/myweb的時候要顯示此html文件的內容:
server { listen 8090; server_name samsung.chinacloudapp.cn; access_log /var/log/nginx/samsung1.access.log logstash_json; location / { root html; index index1.html index.htm; } location ~/myweb { #區分大小寫,即訪問Myweb是不行的 root html/localtion; #定義myweb所在的路徑,即在瀏覽器訪問myweb的時候,實際是訪問的html/localtion/myweb目錄里面的web內容 index index.html; #默認首頁文件類型 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
驗證如下:
三:sysctl.conf針對IPv4內核的7個參數的配置優化:
1、net.core.netdev_max_backlog #每個網絡接口的處理速率比內核處理包的速度快的時候,允許發送隊列的最大數目。
[root@Server1 nginx]# sysctl -a | grep max_backlog net.core.netdev_max_backlog = 1000 這里默認是1000,可以設置的大一些,比如: net.core.netdev_max_backlog = 102400
2、net.core.somaxconn: #用於調節系統同時發起的TCP連接數,默認值一般為128,在客戶端存在高並發請求的時候,128就變得比較小了,可能會導致鏈接超時或者重傳問題。
net.core.somaxconn = 128 #默認為128,高並發的情況時候要設置大一些,比如: net.core.somaxconn = 102400
3、net.ipv4.tcp_max_orphans:設置系統中做多允許多少TCP套接字不被關聯到任何一個用戶文件句柄上,如果超出這個值,沒有與用戶文件句柄關聯的TCP套接字將立即被復位,同時給出警告信息,這個值是簡單防止DDOS(Denial of service)的攻擊,在內存比較充足的時候可以設置大一些:
net.ipv4.tcp_max_orphans = 32768 #默認為32768,可以改該打一些: net.ipv4.tcp_max_orphans = 102400
4、net.ipv4.tcp_max_syn_backlog #用於記錄尚未收到客戶度確認消息的連接請求的最大值,一般要設置大一些:
net.ipv4.tcp_max_syn_backlog = 256 #默認為256,設置大一些如下: net.ipv4.tcp_max_syn_backlog = 102400
5、net.ipv4.tcp_timestamps #用於設置時間戳,可以避免序列號的卷繞,有時候會出現數據包用之前的序列號的情況,此值默認為1表示不允許序列號的數據包,對於Nginx服務器來說,要改為0禁用對於TCP時間戳的支持,這樣TCP協議會讓內核接受這種數據包,從而避免網絡異常,如下:
net.ipv4.tcp_timestamps = 1 #默認為1,改為0,如下: net.ipv4.tcp_timestamps = 0
6、net.ipv4.tcp_synack_retries #用於設置內核放棄TCP連接之前向客戶端發生SYN+ACK包的數量,網絡連接建立需要三次握手,客戶端首先向服務器發生一個連接請求,服務器收到后由內核回復一個SYN+ACK的報文,這個值不能設置過多,會影響服務器的性能,還會引起syn攻擊:
net.ipv4.tcp_synack_retries = 5 #默認為5,可以改為1避免syn攻擊 net.ipv4.tcp_synack_retries = 1
7、net.ipv4.tcp_syn_retries #與上一個功能類似,設置為1即可:
net.ipv4.tcp_syn_retries = 5 #默認為5,可以改為1 net.ipv4.tcp_syn_retries = 1
四:配置文件中針對CPU的2個優化參數:
1、woker_precess #設置Nginx 啟動多少個工作進程的數量
2、woker_cpu_affinit #固定Nginx 工作進程所運行的CPU核心
五:配置文件中與網絡相關的4個指令:
1、keepalived_timeout 60 50; #設置Nginx服務器與客戶端保持連接的時間是60秒,到60秒后服務器與客戶端斷開連接,50s是使用Keep-Alive消息頭與部分瀏覽器如 chrome等的連接事件,到50秒后瀏覽器主動與服務器斷開連接。 keepalived_timeout 60 50; 2、sendtime_out 10s #Http核心模塊指令,指定了發送給客戶端應答后的超時時間,Timeout是指沒有進入完整established狀態,只完成了兩次握手,如果超過這個時間客戶端沒有任何響應,nginx將關閉與客戶端的連接。 sendtime_out 10s; 3、client_header_timeout #用於指定來自客戶端請求頭的headerbuffer大小,對於大多數請求,1kb的緩沖區大小已經足夠,如果自定義了消息頭部或有更大的cookie,可以增加緩沖區大小。 client_header_timeout 4k; 4、multi_accept #設置是否允許,Nginx在已經得到一個新連接的通知時,接收盡可能更多的連接。 multi_accept on;
六:配置文件中與驅動模型相關的8個指令:
1、use; #用於指定Nginx 使用的事件驅動模型
2、woker_process; #指定Nginx啟動的工作進程的數量
3、woker_connections 65535; #指定Nginx 每個工作進程的最大連接數,woker_connections * woker_process即為Nginx的最大連接數量。
4、woker_rlimit_sigpending 65535 #Nginx每個進程的事件信號隊列的上限長度,如果超出長度,Nginx則使用poll模型處理客戶的請求。
5、devpoll_changes 和 devpoll_events #用於設置Nginx 在/dev/poll 模型下Nginx服務器可以與內核之間傳遞事件的數量,前一個設置傳遞給內核的事件數量,后一個設置從內核讀取的事件數量,默認為512。
6、kqueue_changes 和 kqueue_events #設置在kqueue模型下Nginx服務器可以與內核之間傳遞事件的數量,前一個設置傳遞給內核的事件數量,后一個設置從內核讀取的事件數量,默認為512。
7、epoll_events #設置在epoll驅動模式下Nginx 服務器可以與內核之間傳遞事件的數量,默認為512。
8、rtsig_signo #設置Nginx在rtsig 模式使用的兩個信號中的第一個,第二個信號是在第一個信號的編號上加1.
9、rtsig_overflow #這些參數指定如何處理rtsig隊列溢出。當溢出發生在nginx清空rtsig隊列時,它們將連續調用poll()和 rtsig.poll()來處理未完成的事件,直到rtsig被排空以防止新的溢出,當溢出處理完畢,nginx再次啟用rtsig模式,rtsig_overflow_events specifies指定經過poll()的事件數,默認為16,rtsig_overflow_test指定poll()處理多少事件后nginx將排空rtsig隊列,默認值為32,rtsig_overflow_threshold只能運行在Linux 2.4.x內核下,在排空rtsig隊列前nginx檢查內核以確定隊列是怎樣被填滿的。默認值為1/10,“rtsig_overflow_threshold 3”意為1/3。