NGINX優化參數

(1)nginx運行工做進程個數,通常設置cpu的核心或者核心數x2javascript

若是不瞭解cpu的核數,能夠top命令以後按1看出來,也能夠查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l php

[root@lx~]# vi/usr/local/nginx1.10/conf/nginx.confcss

worker_processes  4;html

[root@lx~]# /usr/local/nginx1.10/sbin/nginx-s reload前端

[root@lx~]# ps -aux | grep nginx |grep -v grepjava

root 9834  0.0  0.0 47556  1948 ?      Ss  22:36  0:00 nginx: master processnginxnode

www 10135  0.0 0.0  50088  2004 ?       S    22:58  0:00 nginx: worker processmysql

www 10136  0.0  0.0 50088  2004 ?        S   22:58  0:00 nginx: worker processlinux

www 10137  0.0  0.0 50088  2004 ?        S   22:58  0:00 nginx: worker processnginx

www 10138  0.0  0.0 50088  2004 ?        S   22:58  0:00 nginx: worker process

Nginx運行CPU親和力

好比4核配置

worker_processes  4;

worker_cpu_affinity 0001 0010 0100 1000

好比8核配置

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;

worker_processes最多開啓8個,8個以上性能提高不會再提高了,並且穩定性變得更低,因此8個進程夠用了。

Nginx最多能夠打開文件數

worker_rlimit_nofile 65535;

這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,可是nginx分配請求並非那麼均勻,因此最好與ulimit -n的值保持一致。

注:

文件資源限制的配置能夠在/etc/security/limits.conf設置,針對root/user等各個用戶或者*表明全部用戶來設置。

*   soft   nofile   65535

*   hard  nofile   65535

用戶從新登陸生效(ulimit -n)

 

(2)Nginx事件處理模型

events {

use epoll;

worker_connections 65535;

multi_accept on;

}

nginx採用epoll事件模型,處理效率高

work_connections是單個worker進程容許客戶端最大鏈接數,這個數值通常根據服務器性能和內存來制定,實際最大值就是worker進程數乘以work_connections

實際咱們填入一個65535,足夠了,這些都算併發值,一個網站的併發達到這麼大的數量,也算一個大站了!

multi_accept 告訴nginx收到一個新鏈接通知後接受盡量多的鏈接,默認是on,設置爲on後,多個worker按串行方式來處理鏈接,也就是一個鏈接只有一個worker被喚醒,其餘的處於休眠狀態,設置爲off後,多個worker按並行方式來處理鏈接,也就是一個鏈接會喚醒全部的worker,直到鏈接分配完畢,沒有取得鏈接的繼續休眠。當你的服務器鏈接數很少時,開啓這個參數會讓負載有必定的下降,可是當服務器的吞吐量很大時,爲了效率,能夠關閉這個參數。

 

(3)開啓高效傳輸模式

http {

include mime.types;

default_type application/octet-stream;

……

sendfile on;

tcp_nopush on;

……

Include mime.types; //媒體類型,include 只是一個在當前文件中包含另外一個文件內容的指令

default_type application/octet-stream;  //默認媒體類型足夠

sendfile on;//開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。

注意:若是圖片顯示不正常把這個改爲off。

tcp_nopush on;必須在sendfile開啓模式纔有效,防止網路阻塞,積極的減小網絡報文段的數量(將響應頭和正文的開始部分一塊兒發送,而不一個接一個的發送。)

 

(4)鏈接超時時間

主要目的是保護服務器資源,CPU,內存,控制鏈接數,由於創建鏈接也是須要消耗資源的

keepalive_timeout 60;

tcp_nodelay on;

client_header_buffer_size 4k;

open_file_cache max=102400 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 1;

client_header_timeout 15;

client_body_timeout 15;

reset_timedout_connection on;

send_timeout 15;

server_tokens off;

client_max_body_size 10m;

keepalived_timeout客戶端鏈接保持會話超時時間,超過這個時間,服務器斷開這個連接

tcp_nodelay;也是防止網絡阻塞,不過要包涵在keepalived參數纔有效

client_header_buffer_size 4k;
客戶端請求頭部的緩衝區大小,這個能夠根據你的系統分頁大小來設置,通常一個請求頭的大小不會超過 1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。分頁大小能夠用命令getconf PAGESIZE取得。
open_file_cache max=102400 inactive=20s;
這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件
數一致,inactive 是指通過多長時間文件沒被請求後刪除緩存。
open_file_cache_valid 30s;
這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_min_uses 1;
open_file_cache指令中的inactive 參數時間內文件的最少使用次數,若是超過這個數字,文
件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive 時間內一次沒被使用,它將被移除。

client_header_timeout設置請求頭的超時時間。咱們也能夠把這個設置低些,若是超過這個時間沒有發送任何數據,nginx將返回request time out的錯誤

client_body_timeout設置請求體的超時時間。咱們也能夠把這個設置低些,超過這個時間沒有發送任何數據,和上面同樣的錯誤提示

reset_timeout_connection 告訴nginx關閉不響應的客戶端鏈接。這將會釋放那個客戶端所佔有的內存空間。

send_timeout響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,若是超過這個時間,客戶端沒有任何活動,nginx關閉鏈接

server_tokens  並不會讓nginx執行的速度更快,但它能夠關閉在錯誤頁面中的nginx版本數字,這樣對於安全性是有好處的。

client_max_body_size上傳文件大小限制

 

(5)fastcgi調優

fastcgi_connect_timeout    600;

fastcgi_send_timeout 600;

fastcgi_read_timeout 600;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;

fastcgi_intercept_errors on;

fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;

fastcgi_connect_timeout 600; #指定鏈接到後端FastCGI的超時時間。

fastcgi_send_timeout 600; #向FastCGI傳送請求的超時時間。

fastcgi_read_timeout 600; #指定接收FastCGI應答的超時時間。

fastcgi_buffer_size 64k; #指定讀取FastCGI應答第一部分須要用多大的緩衝區,默認的緩衝區大小爲fastcgi_buffers指令中的每塊大小,能夠將這個值設置更小。

fastcgi_buffers 4 64k; #指定本地須要用多少和多大的緩衝區來緩衝FastCGI的應答請求,若是一個php腳本所產生的頁面大小爲256KB,那麼會分配4個64KB的緩衝區來緩存,若是頁面大小大於256KB,那麼大於256KB的部分會緩存到fastcgi_temp_path指定的路徑中,可是這並非好方法,由於內存中的數據處理速度要快於磁盤。通常這個值應該爲站點中php腳本所產生的頁面大小的中間值,若是站點大部分腳本所產生的頁面大小爲256KB,那麼能夠把這個值設置爲「8 32K」、「4 64k」等。

fastcgi_busy_buffers_size 128k; #建議設置爲fastcgi_buffers的兩倍,繁忙時候的buffer

fastcgi_temp_file_write_size 128k;  #在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍,該數值設置小時若負載上來時可能報502BadGateway

fastcgi_temp_path #緩存臨時目錄

fastcgi_intercept_errors on;#這個指令指定是否傳遞4xx和5xx錯誤信息到客戶端,或者容許nginx使用error_page處理錯誤信息。

注:靜態文件不存在會返回404頁面,可是php頁面則返回空白頁!!

fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;# fastcgi_cache緩存目錄,能夠設置目錄層級,好比1:2會生成16*256個子目錄,cache_fastcgi是這個緩存空間的名字,cache是用多少內存(這樣熱門的內容nginx直接放內存,提升訪問速度),inactive表示默認失效時間,若是緩存數據在失效時間內沒有被訪問,將被刪除,max_size表示最多用多少硬盤空間。

fastcgi_cache cache_fastcgi;  #表示開啓FastCGI緩存併爲其指定一個名稱。開啓緩存很是有用,能夠有效下降CPU的負載,而且防止502的錯誤放生。cache_fastcgi爲proxy_cache_path指令建立的緩存區名稱

fastcgi_cache_valid 200 302 1h; #用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一小時,要和fastcgi_cache配合使用

fastcgi_cache_valid 301 1d;     #將301應答緩存一天

fastcgi_cache_valid any 1m;     #將其餘應答緩存爲1分鐘

fastcgi_cache_min_uses 1;       #該指令用於設置通過多少次請求的相同URL將被緩存。

fastcgi_cache_key http://$host$request_uri; #該指令用來設置web緩存的Key值,nginx根據Key值md5哈希存儲.通常根據$host(域名)、$request_uri(請求的路徑)等變量組合成proxy_cache_key 。

fastcgi_pass #指定FastCGI服務器監聽端口與地址,能夠是本機或者其它

總結:

nginx的緩存功能有:proxy_cache / fastcgi_cache

proxy_cache的做用是緩存後端服務器的內容,多是任何內容,包括靜態的和動態。
fastcgi_cache的做用是緩存fastcgi生成的內容,不少狀況是php生成的動態的內容。
proxy_cache緩存減小了nginx與後端通訊的次數,節省了傳輸時間和後端寬帶。
fastcgi_cache緩存減小了nginx與php的通訊的次數,更減輕了php和數據庫(mysql)的壓力。

 CGI是爲了保證web server傳遞過來的數據是標準格式的,方便CGI程序的編寫者。Fastcgi是用來提升CGI程序性能的。php-fpm是fastcgi進程的管理器,用來管理fastcgi進程的

(6)gzip調優

使用gzip壓縮功能,可能爲咱們節約帶寬,加快傳輸速度,有更好的體驗,也爲咱們節約成本,因此說這是一個重點。

Nginx啓用壓縮功能須要你來ngx_http_gzip_module模塊,apache使用的是mod_deflate

通常咱們須要壓縮的內容有:文本,js,html,css,對於圖片,視頻,flash什麼的不壓縮,同時也要注意,咱們使用gzip的功能是須要消耗CPU的!

gzip on;

gzip_min_length 2k;

gzip_buffers    4 32k;

gzip_http_version 1.1;

gzip_comp_level 6;

gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;

gzip_vary on;

gzip_proxied any;

gzip on;    #開啓壓縮功能

gzip_min_length 1k; #設置容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取,默認值是0,無論頁面多大都進行壓縮,建議設置成大於1K,若是小與1K可能會越壓越大。

gzip_buffers 4 32k; #壓縮緩衝區大小,表示申請4個單位爲32K的內存做爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。

gzip_http_version 1.1; #壓縮版本,用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認便可

gzip_comp_level 6; #壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,可是處理慢,也比較消耗CPU資源。

gzip_types text/css text/xml application/javascript; #用來指定壓縮的類型,‘text/html’類型老是會被壓縮。

默認值: gzip_types text/html (默認不對js/css文件進行壓縮)
# 壓縮類型,匹配MIME��型進行壓縮
# 不能用通配符 text/*
# (不管是否指定)text/html默認已經壓縮 
# 設置哪壓縮種文本文件可參考 conf/mime.types

gzip_vary on;  #varyheader支持,改選項可讓前端的緩存服務器緩存通過GZIP壓縮的頁面,例如用Squid緩存通過nginx壓縮的數據

 

(7)expires緩存調優

緩存,主要針對於圖片,css,js等元素更改機會比較少的狀況下使用,特別是圖片,佔用帶寬大,咱們徹底能夠設置圖片在瀏覽器本地緩存365d,css,js,html能夠緩存個10來天,這樣用戶第一次打開加載慢一點,第二次,就很是快了!緩存的時候,咱們須要將須要緩存的拓展名列出來, Expires緩存配置在server字段裏面

location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {

  expires 30d;

  #log_not_found off;

  access_log off;

}

location ~* \.(js|css)$ {

  expires 7d;

  log_not_found off;

  access_log off;

注:log_not_found off;是否在error_log中記錄不存在的錯誤。默認是。

總結:

expire功能優勢 (1)expires能夠下降網站購買的帶寬,節約成本(2)同時提高用戶訪問體驗(3)減輕服務的壓力,節約服務器成本,是web服務很是重要的功能。 expire功能缺點:被緩存的頁面或數據更新了,用戶看到的可能仍是舊的內容,反而影響用戶體驗。解決辦法:第一個縮短緩存時間,例如:1天,但不完全,除非更新頻率大於1天;第二個對緩存的對象更名。

網站不但願被緩存的內容 1)網站流量統計工具2)更新頻繁的文件(google的logo)

 

(8)防盜鏈

防止別人直接從你網站引用圖片等連接,消耗了你的資源和網絡流量,那麼咱們的解決辦法由幾種: 1:水印,品牌宣傳,你的帶寬,服務器足夠 2:防火牆,直接控制,前提是你知道IP來源 3:防盜鏈策略下面的方法是直接給予404的錯誤提示

location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {

    valid_referers noneblocked  www.benet.com benet.com;

    if($invalid_referer) {

      #return 302  http://www.benet.com/img/nolink.jpg;

      return 404;

        break;

    }

    access_log off;

 }

參數可使以下形式:
none 意思是不存在的Referer頭(表示空的,也就是直接訪問,好比直接在瀏覽器打開一個圖片)
blocked 意爲根據防火牆假裝Referer頭,如:「Referer:XXXXXXX」。
server_names 爲一個或多個服務器的列表,0.5.33版本之後能夠在名稱中使用「*」通配符。

 

(9)內核參數優化

fs.file-max = 999999:這個參數表示進程(好比一個worker進程)能夠同時打開的最大句柄數,這個參數直線限制最大併發鏈接數,需根據實際狀況配置。

net.ipv4.tcp_max_tw_buckets = 6000 #這個參數表示操做系統容許TIME_WAIT套接字數量的最大值,若是超過這個數字,TIME_WAIT套接字將馬上被清除並打印警告信息。該參數默認爲180000,過多的TIME_WAIT套接字會使Web服務器變慢。

注:主動關閉鏈接的服務端會產生TIME_WAIT狀態的鏈接
net.ipv4.ip_local_port_range = 1024 65000 #容許系統打開的端口範圍。
net.ipv4.tcp_tw_recycle = 1#啓用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1#開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接。這對於服務器來講頗有意義,由於服務器上總會有大量TIME-WAIT狀態的鏈接。

net.ipv4.tcp_keepalive_time = 30:這個參數表示當keepalive啓用時,TCP發送keepalive消息的頻度。默認是2小時,若將其設置的小一些,能夠更快地清理無效的鏈接。
net.ipv4.tcp_syncookies = 1#開啓SYN Cookies,當出現SYN等待隊列溢出時,啓用cookies來處理。
net.core.somaxconn = 40960 #web 應用中 listen 函數的 backlog 默認會給咱們內核參數的 net.core.somaxconn 限制到128,而nginx定義的NGX_LISTEN_BACKLOG 默認爲511,因此有必要調整這個值。

注:對於一個TCP鏈接,Server與Client須要經過三次握手來創建網絡鏈接.當三次握手成功後,咱們能夠看到端口的狀態由LISTEN轉變爲ESTABLISHED,接着這條鏈路上就能夠開始傳送數據了.每個處於監聽(Listen)狀態的端口,都有本身的監聽隊列.監聽隊列的長度與如somaxconn參數和使用該端口的程序中listen()函數有關

somaxconn參數:定義了系統中每個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲128,對於一個常常處理新鏈接的高負載 web服務環境來講,默認的 128 過小了。大多數環境這個值建議增長到 1024 或者更多。大的偵聽隊列對防止拒絕服務 DoS 攻擊也會有所幫助。
net.core.netdev_max_backlog = 262144 #每一個網絡接口接收數據包的速率比內核處理這些包的速率快時,容許送到隊列的數據包的最大數目。
net.ipv4.tcp_max_syn_backlog = 262144 #這個參數標示TCP三次握手創建階段接受SYN請求隊列的最大長度,默認爲1024,將其設置得大一些可使出現Nginx繁忙來不及accept新鏈接的狀況時,Linux不至於丟失客戶端發起的鏈接請求。

net.ipv4.tcp_rmem = 10240 87380 12582912#這個參數定義了TCP接受緩存(用於TCP接受滑動窗口)的最小值、默認值、最大值。

net.ipv4.tcp_wmem = 10240 87380 12582912:這個參數定義了TCP發送緩存(用於TCP發送滑動窗口)的最小值、默認值、最大值。
net.core.rmem_default = 6291456:這個參數表示內核套接字接受緩存區默認的大小。

net.core.wmem_default = 6291456:這個參數表示內核套接字發送緩存區默認的大小。

net.core.rmem_max = 12582912:這個參數表示內核套接字接受緩存區的最大大小。

net.core.wmem_max = 12582912:這個參數表示內核套接字發送緩存區的最大大小。

net.ipv4.tcp_syncookies = 1:該參數與性能無關,用於解決TCP的SYN攻擊。

 

下面貼一個完整的內核優化設置:

fs.file-max = 999999

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem = 10240 87380 12582912

net.ipv4.tcp_wmem = 10240 87380 12582912

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 262144

net.core.somaxconn = 40960

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.ip_local_port_range = 1024 65000

執行sysctl  -p使內核修改生效

 

(10)關於系統鏈接數的優化:

linux 默認值 open files爲1024

#ulimit -n

1024

說明server只容許同時打開1024個文件

使用ulimit -a 能夠查看當前系統的全部限制值,使用ulimit -n 能夠查看當前的最大打開文件數。

新裝的linux 默認只有1024 ,看成負載較大的服務器時,很容易遇到error: too many open files。所以,須要將其改大

在/etc/security/limits.conf最後增長:

*               soft    nofile          65535

*               hard    nofile          65535

*               soft    noproc          65535

*                hard    noproc          65535

Nginx的配置是以模塊爲單位來組織的,每個模塊包含一個或多個指令,指令是配置文件中的最小配置單元,一切配置項皆爲指令。如http核心模塊中的include、default_type、sendfile指令,都屬於http模塊。nginx全部模塊中的指令見官方文檔說明:http://nginx.org/en/docs/dirindex.html

注意:如下配置中的「上下文」表示指令能夠配置在哪些模塊中。
main:頂層配置,約束服務器的行爲
  • 1
  • 2
  • 3

一、服務器級別核心配置

指令 上下文 語法 默認值 功能描述
user main user nobody nobyd; nobody 以哪一個用戶權限運行工做線程
daemon main daemon yes; yes nginx是否以守護進程運行
worker_processes main worker_processes number; 1 配置工做進程數。傳統的web服務器(如apache)都是同步阻塞模型,一請求一進(線)程模式,當進(線)程數增達到必定程度後,更多CPU時間浪費在線程和進程切換當中,性能急劇降低,因此負載率不高。Nginx是基於事件的非阻塞多路複用(epoll或kquene)模型,一個進程在短期內就能夠響應大量的請求。建議將該值設置<=cpu核心數量,通常高於cpu核心數量不會帶來好處,反而可能會有進程切換開銷的負面影響。
worker_connections events worker_connections number; 1024 併發響應能力的關鍵配置值,表示每一個進程容許的最大同時鏈接數。maxConnection = work_connections * worker_processes;通常一個瀏覽器會同時開兩條鏈接,若是是反向代理,nginx到後服務器的鏈接數量也要佔用2條鏈接數,因此,作靜態服務器,通常maxConnection = work_connections * worker_processes / 2; 作反代理服務器時maxConnection = work_connections * worker_processes / 4;
use events use epoll; 根據不一樣的平臺,選擇最高效的鏈接處理方法 指定處理鏈接請求的方法。linux內核2.6以上默認使用epoll方法,其它平臺請參考:http://nginx.org/en/docs/events.html 備註:要達到超高負載下最好的網絡響應能力,還有必要優化與網絡相關的linux內核參數
worker_cpu_affinity main worker_cpu_affinity cpumask …; 將工做進程綁定到特定的CPU上,減小CPU在進程之間切換的開銷。用二進制bit位表示進程綁定在哪一個CPU內核。如8內核4進程時的設置方法:worker_cpu_affinity 00000001 00000010 00000100 10000000
worker_rlimit_nofile main worker_rlimit_core size; 受linux內核文件描述符數量限制 設置nginx最大能打開的文件描述符數量。由於Linux對每一個進程所能打開的文件描述數量是有限制的,默認通常是1024個,可經過ulimit -n FILECNT或/etc/securit/limits.conf配置修改linux默認能打開的文件句柄數限制。建議值爲:系統最大數量/進程數。但進程間工做量並非平均分配的,因此能夠設置在大一些。推薦值爲:655350
error_log main, http, mail, stream, server, location error_log 日誌文件路徑 日誌級別; error_log logs/error.log error; 配置錯誤日誌文件的路徑和日誌級別。日誌級別有debug, info, notice, warn, error, crit, alert和emerg幾種。nginx的日誌使用syslog輸出,因此輸出的日誌格式是有規律的,系統運維人員能夠根據日誌規則進行查錯或統計分析。更多說明請參考官方文檔:http://nginx.org/en/docs/ngx_core_module.html#error_log
pid main pid 守護進程socket文件路徑; pid logs/nginx.pid 配置nginx守護進程ID存儲文件路徑(不是工做進程)

以上是nginx的頂層配置,管理服務器級別的行爲。更多配置請參考官方文檔:http://nginx.org/en/docs/ngx_core_module.html#working_directory

二、HTTP模塊核心配置

nginx作爲一個HTTP反向代理服務器,平時接觸得最多的應該是針對http請求的相關配置了,和http模塊有關的全部配置都放在http { ... }配置中。

指令 上下文 語法 功能描述
types http, server, location types { mime類型 文件後綴;}; 配置能處理的文件類型。如:text/html html htm shtml;
include any include 文件路徑; 將外部文件的內容作爲配置拷貝到nginx.conf文件中。如:include mime.type; 將當前目錄下的mime.type配置文件拷貝到nginx配置文件中。文件路徑能夠是相對路徑或絕對路徑。文件名能夠用*來表示通配符。
default_type http, server, location default_type mime類型; 文件名到後綴的映射關係。配置默認的mime類型,當在types指令中找不到請求的文件類型時,就使用default_type指定的類型。默認爲text/plain類型。
access_log http, server, location, if in location, limit_except access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
關閉或開啓訪問日誌。默認配置爲:access_log logs/access.log combined; 表示根據combined定義的日誌格式,寫入logs/access.log文件中,combined是http模塊默認格式。若是定義了buffer和gzip其中一個參數,日誌默認會先寫入緩存中,當緩存滿了以後,經過gzip壓縮緩存中的日誌並寫入文件,啓用了gzip壓縮必須保證nginx安裝的時候添加了gzip模塊。緩存大小默認爲64K。能夠配置gzip的1~9的壓縮級別,級別越高壓縮效率越大,日誌文件佔用的空間越小,但要求系統性能也越高。默認值是1。http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
log_format http log_format 格式名稱 日誌格式; 定義http訪問日誌的格式,在日誌格式中能夠訪問http模塊的內嵌變量,若是變存在的話,會作爲日誌輸出。如:remoteaddrremoteaddr,request等,更多變量請參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
sendfile http, server, location, if in location sendfile on | off; 啓用內核複製模式。做爲靜態服務器能夠提升最大的IO訪問速度。傳統的文件讀寫採用read和write方式,流程爲:硬盤 >> kernel buffer >> user buffer>> kernel socket buffer >>協議棧,採用sendfile文件讀寫的流程爲:硬盤 >> kernel buffer (快速拷貝到kernelsocket buffer) >>協議棧,很明顯sendfile這個系統調用減小了內核到用戶模式之間的切換和數據拷貝次數,直接從內核緩存的數據拷貝到協議棧,提升了很大的效率。這篇文章介紹比較詳細:http://xiaorui.cc/?p=1673
tcp_nodelay http, server, location off|on;  
tcp_nopush http, server, location off|on; tcp_nodelay和tcp_nopush這兩個參數是配合使用的,啓動這兩項配置,會在數據包達到必定大小後再發送數據。這樣會減小網絡通訊次數,下降阻塞機率,但也會影響響應及時性。比較適合於文件下載這類的大數據通訊場景。
keepalive_timeout http, server, location keepalive_time 65; 客戶端到服務器創建鏈接的超時時長,超過指定的時間服務器就會斷開鏈接。默認爲75秒。下降每一個鏈接的alive時間可在必定程度上提升可響應鏈接數量,因此通常可適當下降此值
gzip http, server, location, if in location gzip on | off; 開啓內容壓縮,能夠有效下降客戶端的訪問流量和網絡帶寬
gzip_min_length http, server, location gzip_min_length length; 單位爲k,默認爲20k。內容超過最少長度後纔開啓壓縮,由於過短的內容壓縮效果不佳,且壓縮過程還會浪費系統資源。這個壓縮長度會做爲http響應頭Content-Length字段返回給客戶端。 建議值:1000
gzip_comp_level http, server, location gzip_comp_level 1~9; 壓縮級別,默認值爲1。範圍爲1~9級,壓縮級別越高壓縮率越高,但對系統性能要求越高。建議值:4
gzip_types http, server, location gzip_types mime-type …; 壓縮內容類型,默認爲text/html;。只壓縮html文本,通常咱們都會壓縮js、css、json之類的,能夠把這些常見的文本數據都配上。如:text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache http, server, location open_file_cache off; open_file_cache max=N [inactive=time]; 默認值爲off; 設置最大緩存數量,及緩存文件未使用的存活期。建議值:max=655350(和worker_rlimit_nofile參數一致) inactive=20s;
open_file_
cache_min_uses
http, server, location open_file_cache_min_uses number; 默認爲1,有效期內文件最少使有的次數。建議值:2
open_file
_cache_valid
http, server, location open_file_cache_valid time; 默認爲60s,驗證緩存有效期時間間隔。 表示每隔60s檢查一下緩存的文件當中,有哪些文件在20s之內沒有使用超過2次的,就從緩存中刪除。採用lru算法。
server server { … } http HTTP服務器的核心配置,用於配置HTTP服務器的虛擬主機,能夠配置多個
listen listen ip[:端口] server 配置虛擬主機監聽的IP地址和端口,默認監聽本機IP地址和80或8000端口。若是隻設置了IP沒設端口,默認使用80端口。若是隻設置了端口,沒設置IP默認使用本機IP。詳細配置請參考:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
server_name server_name domain_name …; server 配置虛擬主機的域名,能夠指定多個,用空格分隔。默認爲空
charset http, server, location, if in location charset charset | off; 設置請求編碼,和url參數亂碼問題有關。
location server, location location [ = | ~ | ~* | ^~ ] uri { … } 
location @name { … }
http請求中的一個重要配置項,用於配置客戶端請求服務器url地址的匹配規則。能夠配置多個匹配規則

三、核心配置優化

# nginx不一樣於apache服務器,當進行了大量優化設置後會魔術般的明顯性能提高效果 # nginx在安裝完成後,大部分參數就已是最優化了,咱們須要管理的東西並很少 #user nobody; #阻塞和非阻塞網絡模型: #同步阻塞模型,一請求一進(線)程,當進(線)程增長到必定程度後 #更多CPU時間浪費到切換一,性能急劇降低,因此負載率不高 #Nginx基於事件的非阻塞多路複用(epoll或kquene)模型 #一個進程在短期內能夠響應大量的請求 #建議值 <= cpu核心數量,通常高於cpu數量不會帶好處,也許還有進程切換開銷的負面影響 worker_processes 4; #將work process綁定到特定cpu上,避免進程在cpu間切換的開銷 worker_cpu_affinity 0001 0010 0100 1000 #8內核4進程時的設置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000 # 每進程最大可打開文件描述符數量(linux上文件描述符比較廣義,網絡端口、設備、磁盤文件都是) # 文件描述符用完了,新的鏈接會被拒絕,產生502類錯誤 # linux最大可打開文件數可經過ulimit -n FILECNT或 /etc/security/limits.conf配置 # 理論值 系統最大數量 / 進程數。但進程間工做量並非平均分配的,因此能夠設置的大一些 worker_rlimit_nofile 65535; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { # 併發響應能力的關鍵配置值 # 每一個進程容許的最大同時鏈接數,work_connectins * worker_processes = maxConnection; # 要注意maxConnections不等同於可響應的用戶數量, # 由於通常一個瀏覽器會同時開兩條鏈接,若是反向代理,nginx到後端服務器的鏈接也要佔用鏈接數 # 因此,作靜態服務器時,通常 maxClient = work_connectins * worker_processes / 2 # 作反向代理服務器時 maxClient = work_connectins * worker_processes / 4 # 這個值理論上越大越好,但最多可承受多少請求與配件和網絡相關,也可最大可打開文件,最大可用sockets數量(約64K)有關 worker_connections 65535; # 指明使用epoll 或 kquene (*BSD) use epoll; # 備註:要達到超高負載下最好的網絡響應能力,還有必要優化與網絡相關的linux內核參數 } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; # 關閉此項可減小IO開銷,但也沒法記錄訪問信息,不利用業務分析,通常運維狀況不建議使用 access_log off # 只記錄更爲嚴重的錯誤日誌,可減小IO壓力 error_log logs/error.log crit; #access_log logs/access.log main; # 啓用內核複製模式,應該保持開啓達到最快IO效率 sendfile on; # 簡單說,啓動以下兩項配置,會在數據包達到必定大小後再發送數據 # 這樣會減小網絡通訊次數,下降阻塞機率,但也會影響響應及時性 # 比較適合於文件下載這類的大數據包通訊場景 #tcp_nopush on; 在 #tcp_nodelay on|off on禁用Nagle算法 #keepalive_timeout 0; # HTTP1.1支持持久鏈接alive # 下降每一個鏈接的alive時間可在必定程度上提升可響應鏈接數量,因此通常可適當下降此值 keepalive_timeout 30s; # 啓動內容壓縮,有效下降網絡流量 gzip on; # 太短的內容壓縮效果不佳,壓縮過程還會浪費系統資源 gzip_min_length 1000; # 可選值1~9,壓縮級別越高壓縮率越高,但對系統性能要求越高 gzip_comp_level 4; # 壓縮的內容類別 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; # 靜態文件緩存 # 最大緩存數量,文件未使用存活期 open_file_cache max=65535 inactive=20s; # 驗證緩存有效期時間間隔 open_file_cache_valid 30s; # 有效期內文件最少使用次數 open_file_cache_min_uses 2; server { listen 80; server_name localhost; charset utf-8; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } ... } ... }

nginx的優化

複製代碼
1.    gzip壓縮優化
2.    expires緩存有還
3.    網絡IO事件模型優化
4.    隱藏軟件名稱和版本號
5.    防盜鏈優化
6.    禁止惡意域名解析
7.    禁止經過IP地址訪問網站
8.    HTTP請求方法優化
9.    防DOS攻擊單IP併發鏈接的控制,與鏈接速率控制
10.    嚴格設置web站點目錄的權限
11.    將nginx進程以及站點運行於監牢模式
12.    經過robot協議以及HTTP_USER_AGENT防爬蟲優化
13.    配置錯誤頁面根據錯誤碼指定網頁反饋給用戶
14.    nginx日誌相關優化訪問日誌切割輪詢,不記錄指定元素日誌、最小化日誌目錄權限
15.    限制上傳到資源目錄的程序被訪問,防止木馬入侵系統破壞文件
16.    FastCGI參數buffer和cache配置文件的優化
17.    php.ini和php-fpm.conf配置文件的優化
18.    有關web服務的Linux內核方面深度優化(網絡鏈接、IO、內存等)
19.    nginx加密傳輸優化(SSL)
20.    web服務器磁盤掛載及網絡文件系統的優化
21.    使用nginx cache
複製代碼

一、基本安全優化

1.1  隱藏版本信息

    通常來講,軟件的漏洞都和版本相關,因此咱們要隱藏或消除web服務對訪問用戶顯示的各類敏感信息。

複製代碼
 1 [root@db01 rpm]# curl -I 10.0.0.8
 2 HTTP/1.1 401 Unauthorized
 3 Server: nginx                                          #隱藏版本號
 4 Date: Thu, 21 Jul 2016 03:23:38 GMT
 5 Content-Type: text/html
 6 Content-Length: 188
 7 Connection: keep-alive
 8 WWW-Authenticate: Basic realm="oldboy training"
 9 過程:
10 vim /application/nginx/conf/nginx.conf
11 在http模塊下加入:
12 server_tokens off;
13 /application/nginx/sbin/nginx -t
14 /application/nginx/sbin/nginx -s reload
複製代碼

1.2  隱藏nginx要修改源代碼

要修改內容的路徑:

第一路徑:

1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行
2 #define NGINX_VERSION  "1.6.2" 修改成想要的版本號如2.4.3
3 #define NGINX_VER "nginx/" NGINX_VERSION 將nginx修改成想要修改的軟件名稱,如Apache。

第二路徑

1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行
2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic
3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c

第三路徑

/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行
"<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF

而後從新編譯

1.3  更改nginx服務的默認用戶

第一種方法:

    直接更改配置文件nginx.conf.default參數,將默認的#user nobody;改成user nginx.nginx;

第二種方法:

  直接在編譯nginx的時候指定用戶和用戶組命令以下:

  ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module

1.4  降權啓動nginx

複製代碼
1 useradd inca
2 cd /home/inca/
3 mkdir conf logs www
4 echo inca >www/index.html
5 chown -R inca.inca *
6 ln -s /application/nginx/conf/mime.types conf/mime.types  #mime.types媒體類型文件
複製代碼

egrep -v "#|^$" /application/nginx/conf/nginx.conf.default >conf/nginx.conf

nginx.conf配置文件

複製代碼
worker_processes  1;
error_log  /home/inca/logs/error.log;
pid /home/inca/logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                 '$status $body_bytes_sent "$http_referer" '
                                 '"$http_user_agent" "$http_x_forwarded_for"';
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       8080;
        server_name  localhost;
        location / {
            root   /home/inca/www;
            index  index.html index.htm;
            }
            access_log /home/inca/logs/access.log main;
}
}
複製代碼

  su - inca -c "/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf"   #啓動nginx服務

 重點強調:

  1.nginx.conf裏面的相關路徑都要更改

  2.普通用戶的端口問題

二、  根據參數優化nginx服務性能

2.1  優化nginx進程個數的策略

  在高併發、高訪問量的web服務場景,須要事先啓動好更多的nginx進程,以保證快速響應並處理大量併發用戶的請求。

  worker_processes  1;通常調整到與CPU的顆數相同

  (1)查看LInux可查看CPU個數及總核數

grep processor /proc/cpuinfo|wc -l

  (2)查看CPU總顆數

grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l

  (3)經過執行top命令,而後按數字1,便可顯示全部的CPU核數

top  按1鍵就會顯示第一個的信息

Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0

2.2   優化綁定不一樣的nginx進程到不一樣的CPU上

     默認狀況下,nginx的進程跑在某一個CPU或CPU的某一個核上,致使nginx進程使用硬件的資源不均,本節的優化是不一樣的nginx進程給不一樣的CPU處理,充分有效的利用有效的硬件資源

  四核cpu配置

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

  雙核配置

worker_processes    2;
worker_cpu_affinity 0101 1010;

  還有一個命令taskset -c用來分配服務給CPU

2.3 nginx事件處理模型優化

  nginx的鏈接處理機制在於不一樣的操做系統會採用不一樣的I/O模型,Linux下,nginx使用epoll的I/O多路複用模型,在freebsd使用kqueue的IO多路複用模型,在solaris使用/dev/pool方式的IO多路複用模型,在windows使用的icop等等。 
  要根據系統類型不一樣選擇不一樣的事務處理模型,選擇有「use [ kqueue | rtsig |epool |dev/pool |select |pllo ];」咱們使用的是Centos6.5的linux,所以將nginx的事件處理模型調整爲epool模型。

events {
worker_connections  1024;
use epoll;
}

官方說明:在不指定事件處理模型時,nginx默認會自動的選擇最佳的事件處理模型服務

2.4 調整nginx單個進程容許的客戶端最大鏈接數

參數語法:worker_connections number 
默認配置:worker_connections 512 
放置位置:events 標籤  

events {
    worker_connections  1024;    #一個worker進程的併發
}

總併發= worker_processes* worker_connections

2.5 配置nginx worker進程最大打開文件數

參數語法:worker_rlimit_nofile number 
放置位置:主標籤段 
說明:做用是改變worker processes能打開的最大文件數

worker_rlimit_nofile 65535;

這各參數受系統文件的最大打開數限制,解決方法:

[root@admin nginx]# cat /proc/sys/fs/file-max
8192

文件系統最大可打開文件數

[root@admin nginx]# ulimit -n
1024

程序限制只能打開1024個文件

使用# ulimit -n 8192調整一下

或者永久調整打開文件數 可在啓動文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx無效)

2.6 開啓高效文件傳輸模式

設置參數 sendfile on;

sendfile參數用於開啓文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置爲on,可防止網絡及磁盤i/o阻塞,提高nginx工做效率。

http {
  sendfile        on;     #放在http,server,location均可以
}

設置參數tcp_nopush;

激活tcp_nopush參數能夠容許把httpresponse header和文件的開始放在一個文件裏發佈,積極的做用是減小網絡報文段的數量(只有sendfile on開啓才生效)

複製代碼
例:
    sendfile   on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    server_names_hash_bucket_size 128;
    server_names_hash_max_size 512;
    keepalive_timeout  65;
    client_header_timeout 15s;
    client_body_timeout 15s;
    send_timeout 60s;
複製代碼

2.7 FastCGI相關參數調優

    fastcgi參數是配合nginx向後請求PHP動態引擎服務的相關參數。

 

 

 

複製代碼
fastcgi_connect_timeout 240;       
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
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=ngx_fcgi_cache:512m inactive=1d max_size=40g;
複製代碼

 

 

 

2.8 配置nginx gzip壓縮實現性能優化

  nginx壓縮功能的介紹:

  nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送給客戶端以前,nginx服務器會根據一些具體的策略實施壓縮,以節省網站出口帶寬,同時加快了數據傳輸效率,提高了用戶的訪問體驗。

2.8.1 壓縮的優勢:

  提高網站用戶體驗:因爲發給用戶的內容小了,因此用戶訪問單位大小的頁面就快了,用戶體驗就提高了

  節約網站帶寬成本:因爲數據時壓縮傳輸的,所以,會消耗一些cpu資源

2.8.2 壓縮的對象:

  純文本內容壓縮比很高,所以,純文本的內容最好要壓縮

  被壓縮的純文本文件必需要大於1KB,因爲壓縮算法的特殊緣由,極小的文件壓縮反而變大

  圖片、視頻(流媒體)等文件儘可能不要壓縮,由於這些文件大多都是通過壓縮的,若是再壓縮極可能不會減少或減少不多,或者有可能增大,而在壓縮時還會消耗大量的CPU、內存資源

2.8.3 參數介紹及配置說明:

gzip on;                            #表示開啓壓縮功能

gzip_min_length  1k;                  #表示容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值是0,表示無論頁面多大都進行壓縮,建議設置成大於1K。若是小於1K可能會越壓越大

gzip_buffers     4 32k;                 #壓縮緩存區大小

gzip_http_version 1.1;                #壓縮版本

gzip_comp_level 9;                  #壓縮比率

gzip_types  text/css text/xml application/javascript;  #指定壓縮的類型

gzip_vary on;                   #vary header支持

完美配置:

複製代碼
nginx.conf  http模塊
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 32k;
  gzip_http_version 1.1;
  gzip_comp_level 9;
  gzip_types  text/css text/xml application/javascript;
  gzip_vary on;
複製代碼

2.9 nginx expires功能

  爲用戶訪問網站的內容設定一個過時時間,當用戶第一次訪問到這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及以後繼續訪問該網站,瀏覽器就會檢查已經緩存在用戶瀏覽器本地的內容,就不會去瀏覽器下載了,直到緩存的內容過時或者被清除爲止。

 

 

2.9.1 expires做用和優勢:

   expires能夠下降網站的帶寬,節約成本

  加快用戶訪問網站的速度,提高了用戶訪問體驗

  服務器訪問量下降,服務器壓力就減輕了,服務器的成本也會下降,甚至能夠節約人力成本

  幾乎對於全部web服務來講,這是很是重要的功能之一,apache服務也有此功能。

2.9.2 nginx expires 配置詳解:

## Add expires header according to URI(path or dir).

location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    expires 360d;
}

2.9.3 expire缺點及解決辦法:

  當網站被緩存的頁面或數據更新了,此時用戶端看到的可能仍是舊的已經緩存的內容,這樣就會影響用戶體驗,那麼如何解決這個問題呢?

  第一:對於常常須要的變更圖片等文件,能夠縮短對象緩存時間,例如,百度、谷歌等網站的首頁圖片常常會換成一些節日的圖,這裏能夠將緩存期修改成1天

  第二:當網站改版或更新內容時,能夠在服務器將緩存的對象更名(網站代碼程序)

  對於網站的圖片、附件,通常不會被用戶直接修改,用戶層面上的修改圖片,其實是從新傳到服務器,雖然內容同樣可是一個新的圖片名了

  網站改版升級會修改JS、CSS元素,若改版的時候對這些元素改了名,會使得前端的CDN以及用戶端須要從新緩存內容

3.   nginx日誌的優化

3.1 編寫腳本實現日誌輪詢

  編寫腳本實現nginx access日誌輪詢

  用戶咋請求一個軟件時,絕大多數軟件都會記錄用戶的訪問狀況,nginx軟件目前沒有相似apache經過cronolog或者rotatelog對日誌分隔處理的功能,可是,運維人員能夠經過利用腳本開發、nginx的信號控制功能或reload從新加載,來實現日誌的自動切割、輪詢。

  操做步驟:

    寫一個定時任務

mv www_access.log www_access_$(date +F -d -1day).log
/applocation/nginx/sbin/nginx -s reload

3.2 不記錄不須要的日誌

     在實際工做中,對於負載均衡器健康檢查節點或某些特定的文件(圖片、JS、CSS)的日誌,通常不須要記錄下來,由於在統計PV時是按照頁面計算的,並且日誌寫入的太頻繁會消耗磁盤i/o,下降服務的性能

具體配製方法:

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
    access_log off;
}

3.3訪問日誌的權限設置

  假如日誌目錄爲/app/logs,則受權方法爲:

  chown -R root.root /app/logs
  chmod -R 600 /app/logs

  不須要在日誌目錄上給nginx用戶讀寫或者讀寫許可,不少人都沒有注意這個問題,這就稱爲了安全隱患。

4.   nginx站點目錄及文件URL訪問控制

4.1 根據擴展名限制程序和文件訪問

  web2.0時代,絕大多數網站都是以用戶爲中心的,這些產品有一些共同點,就是不容許用戶發佈內容到服務器,還容許用戶發圖片甚至附件上傳到服務器上,給用戶開啓了上傳的功能。帶來了很大的安全隱患。

  下面將利用nginx配置禁止訪問上傳資源目錄下的PHP,SHELL,PERL,PYTHON程序文件,這樣就算是用戶上傳了木馬文件也沒辦法執行

複製代碼
 1        location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$
 2                {
 3                          deny all;
 4                }
 5        location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$
 6                {
 7                     deny all;
 8                }
 9        location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
10            {
11                    deny all;
12            }    
複製代碼

  對於上述目錄的限制必須寫在nginx處理PHP服務配置的前面

4.2 禁止訪問指定目錄下的全部文件和目錄

配置禁止訪問指定的單個或多個目錄

複製代碼
location ~ ^/(static)/ {
        deny all;
}

 

location ~ ^/static {
        deny all;
}
複製代碼

禁止訪問目錄而且返回代碼404

複製代碼
server {

        listen       80;

        server_name  www.etiantian.org etiantian.org;

            root   /data0/www/www;

            index  index.html index.htm;

            access_log  /app/logs/www_access.log  commonlog;

            location /admin/ { return 404; }

            location /templates/ { return 403; }

}
複製代碼

4.3 限制網站來源的IP訪問

使用ngx_http_access_module限制網站來源IP訪問。

範例1:禁止外界訪問,但容許某個IP訪問該目錄

複製代碼
location ~ ^/oldboy/ {

       allow 202.111.12.211;

       deny all;

}
複製代碼

範例2:限制及指定IP或IP段訪問。

複製代碼
location / {

       deny 192.168.1.1;

       allow 192.168.1.0/24;

       allow 10.1.1.0/16;

       deny all;

}
複製代碼

4.4 配置nginx禁止非法域名解析訪問企業網站

問題:nginx如何防止用戶IP訪問網站(惡意域名解析,至關於直接使用IP訪問網站)

方法1:直接報錯,用戶體驗很差

複製代碼
server {

listen 80 default_server;

server_name _;

return 501;

}
複製代碼

方法2:經過301跳轉到主頁

複製代碼
server {

listen 80 default_server;

server_name _;

rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;

}
複製代碼

 

5.   nginx圖片防盜鏈解決方案。

簡單的說,沒有通過你的容許在本身網站嵌入你的圖片。

 

  

5.1 常見的防盜鏈解決方案的基本原理

  1. 根據HTTP referer實現防盜鏈
  2. 根據cookie防盜鏈

 

5.2 防盜鏈實戰

被盜鏈的網站配置

複製代碼
 1 #Preventing hot linking of images and other file types
 2 
 3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
 4 
 5     valid_referers none blocked *.etiantian.org etiantian.org;
 6 
 7     if ($invalid_referer) {
 8 
 9         rewrite ^/ http://bbs.etiantian.org/img/nolink.gif;
10 
11     }
12 
13     root html/www;
14 
15 }
複製代碼

6.   nginx錯誤頁面的優雅顯示

範例:當出現403錯誤會跳轉到403.html頁面

error_page  403  /403.html;

7.   nginx站點目錄文件及目錄權限優化

 

 

 

8.  部署網站程序權限設置

(1)wordpress站點目錄權限設置

方案1:推薦方案

目錄:755

文件:644

全部者:root

圖片及上傳目錄設置全部者爲www

複製代碼
cd /application/apache/html/

chown -R root.root blog

find ./blog/ -type f|xargs chmod 644

find ./blog/ -type d|xargs chmod 755
複製代碼

9.   nginx防爬蟲優化

配置

複製代碼
if  ($http_user_agent   ~*  LWP:Simple|BBBike|wget)  {

return  403 ;

rewrite ^(.*) http://blog.etiantian.org/$1 permanent;

}
複製代碼

 

10.   利用nginx限制HTTP的請求方法

配置:

if ($request_method  !~  ^(GET|HEAD|POST)$ ) {

return  501;

}

配置上傳服務器限制HTTP的GET的配置

複製代碼
#Only allow these request methods ##

if ($request_method ~*(GET)$ ) {

   return 501;

}
複製代碼

 

11.   使用CDN作網站內容加速

cdn特色

  本地Cache加速 提升了企業站點(尤爲含有大量圖片和靜態頁面站點)的訪問速度,並大大提升以上性質站點的穩定性 

  鏡像服務 消除了不一樣運營商之間互聯的瓶頸形成的影響,實現了跨運營商的網絡加速,保證不一樣網絡中的用戶都能獲得良好的訪問質量。 

  遠程加速 遠程訪問用戶根據DNS負載均衡技術智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度 

  帶寬優化 自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減小遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能。 

  集羣抗攻擊 普遍分佈的CDN節點加上節點之間的智能冗餘機制,能夠有效地預防黑客入侵以及下降各類D.D.o.S攻擊對網站的影響,同時保證較好的服務質量 。

12.  使用普通用戶啓動Nginx(監牢模式)

解決方案 

  給Nginx服務降權,用普通用戶跑Nginx服務,給開發及運維設置普通帳號 

  開發人員使用普通帳號便可管理nginx服務及站點下的程序和日誌 

  責任劃分:網絡問題:運維責任,網站打不開開發責任。(共同承擔)

實戰配置:

複製代碼
useradd inca

cd /home/inca

mkdir conf www log

echo inca >www/index.html
複製代碼

修改配置文件

error_log /home/inca/log/error.log

pid /home/inca/log/nginx.pid

13. 控制Nginx併發鏈接數量

  ngx_http_limit_conn_module這個模塊用於限制每一個定義key值得鏈接數,特別是單個TP的鏈接數。 
  不是全部的鏈接數都會被計算。一個符合計數要求的鏈接是整個請求頭已經被讀取的鏈接。

  控制Nginx併發鏈接數量參數的說明 
  1)limit_conn_zone參數: 
    語法:limit_conn_zone key zone=name:size; 
    上下文:http 
    用於設置共享內存區域,key能夠是字符串、Nginx自帶變量或前兩個組合。name爲內存區域的名稱,size爲內存區域的大小。

  2)limit_conn參數 
    語法:limit_conn zone number; 
    上下文:http、server、location 
    用於指定key設置最大鏈接數。當超時最大鏈接數時,服務器會返回503報錯。

14. 控制客戶端請求Nginx的速率

  ngx_http_limit_req_module模塊用於限制每一個IP訪問每一個定義key的請求速率。

  limit_req_zone參數說明以下。 
    語法:limit_req_zone key zone=name:size rate=rate; 
    上下文:http 
    用於設置共享內存區域,key能夠是字符串,Nginx自帶變量或前兩個組合。name爲內存區域的名稱,size爲內存區域的大小,rate爲速率,單位爲r/s,每秒一個請求。 
  limit_req參數說明以下: 
    語法:limit_req zone=name [burst-number] [nobelay]     上下文:http、server、location     這裏運用了令牌桶原理,burst=num,一個有num快令牌,令牌發完後,多出來的那些請求就會返回503。   nodelay默認在不超過burst值得前提下會排隊等待處理,若是使用此參數,就會處理完num+1次請求,剩餘的請求爲超時,返回503。

相關文章
相關標籤/搜索