(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:頂層配置,約束服務器的行爲
指令 | 上下文 | 語法 | 默認值 | 功能描述 |
---|---|---|---|---|
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
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模塊的內嵌變量,若是變存在的話,會作爲日誌輸出。如:remoteaddr,remoteaddr,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; } ... } ... }
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
通常來講,軟件的漏洞都和版本相關,因此咱們要隱藏或消除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 /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
而後從新編譯
第一種方法:
直接更改配置文件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 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.普通用戶的端口問題
在高併發、高訪問量的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
默認狀況下,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
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默認會自動的選擇最佳的事件處理模型服務
參數語法:worker_connections number
默認配置:worker_connections 512
放置位置:events 標籤
events { worker_connections 1024; #一個worker進程的併發 }
總併發= worker_processes* worker_connections
參數語法: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無效)
設置參數 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;
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;
nginx壓縮功能的介紹:
nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送給客戶端以前,nginx服務器會根據一些具體的策略實施壓縮,以節省網站出口帶寬,同時加快了數據傳輸效率,提高了用戶的訪問體驗。
提高網站用戶體驗:因爲發給用戶的內容小了,因此用戶訪問單位大小的頁面就快了,用戶體驗就提高了
節約網站帶寬成本:因爲數據時壓縮傳輸的,所以,會消耗一些cpu資源
純文本內容壓縮比很高,所以,純文本的內容最好要壓縮
被壓縮的純文本文件必需要大於1KB,因爲壓縮算法的特殊緣由,極小的文件壓縮反而變大
圖片、視頻(流媒體)等文件儘可能不要壓縮,由於這些文件大多都是通過壓縮的,若是再壓縮極可能不會減少或減少不多,或者有可能增大,而在壓縮時還會消耗大量的CPU、內存資源
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;
爲用戶訪問網站的內容設定一個過時時間,當用戶第一次訪問到這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及以後繼續訪問該網站,瀏覽器就會檢查已經緩存在用戶瀏覽器本地的內容,就不會去瀏覽器下載了,直到緩存的內容過時或者被清除爲止。
expires能夠下降網站的帶寬,節約成本
加快用戶訪問網站的速度,提高了用戶訪問體驗
服務器訪問量下降,服務器壓力就減輕了,服務器的成本也會下降,甚至能夠節約人力成本
幾乎對於全部web服務來講,這是很是重要的功能之一,apache服務也有此功能。
## Add expires header according to URI(path or dir). location ~ ^/(images|javascript|js|css|flash|media|static)/ { expires 360d; }
當網站被緩存的頁面或數據更新了,此時用戶端看到的可能仍是舊的已經緩存的內容,這樣就會影響用戶體驗,那麼如何解決這個問題呢?
第一:對於常常須要的變更圖片等文件,能夠縮短對象緩存時間,例如,百度、谷歌等網站的首頁圖片常常會換成一些節日的圖,這裏能夠將緩存期修改成1天
第二:當網站改版或更新內容時,能夠在服務器將緩存的對象更名(網站代碼程序)
對於網站的圖片、附件,通常不會被用戶直接修改,用戶層面上的修改圖片,其實是從新傳到服務器,雖然內容同樣可是一個新的圖片名了
網站改版升級會修改JS、CSS元素,若改版的時候對這些元素改了名,會使得前端的CDN以及用戶端須要從新緩存內容
編寫腳本實現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
在實際工做中,對於負載均衡器健康檢查節點或某些特定的文件(圖片、JS、CSS)的日誌,通常不須要記錄下來,由於在統計PV時是按照頁面計算的,並且日誌寫入的太頻繁會消耗磁盤i/o,下降服務的性能
具體配製方法: location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; }
假如日誌目錄爲/app/logs,則受權方法爲:
chown -R root.root /app/logs chmod -R 600 /app/logs
不須要在日誌目錄上給nginx用戶讀寫或者讀寫許可,不少人都沒有注意這個問題,這就稱爲了安全隱患。
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服務配置的前面
配置禁止訪問指定的單個或多個目錄
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; } }
使用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; }
問題: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; }
簡單的說,沒有通過你的容許在本身網站嵌入你的圖片。
被盜鏈的網站配置
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 }
範例:當出現403錯誤會跳轉到403.html頁面
error_page 403 /403.html;
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
配置
if ($http_user_agent ~* LWP:Simple|BBBike|wget) { return 403 ; rewrite ^(.*) http://blog.etiantian.org/$1 permanent; }
配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; }
配置上傳服務器限制HTTP的GET的配置
#Only allow these request methods ## if ($request_method ~*(GET)$ ) { return 501; }
本地Cache加速 提升了企業站點(尤爲含有大量圖片和靜態頁面站點)的訪問速度,並大大提升以上性質站點的穩定性
鏡像服務 消除了不一樣運營商之間互聯的瓶頸形成的影響,實現了跨運營商的網絡加速,保證不一樣網絡中的用戶都能獲得良好的訪問質量。
遠程加速 遠程訪問用戶根據DNS負載均衡技術智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度
帶寬優化 自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減小遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能。
集羣抗攻擊 普遍分佈的CDN節點加上節點之間的智能冗餘機制,能夠有效地預防黑客入侵以及下降各類D.D.o.S攻擊對網站的影響,同時保證較好的服務質量 。
解決方案
給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
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報錯。
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。