Nginx 配置文件詳解,生產環境nginx配置文件傾情分享,錯過後悔5年!

Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。Nginx是一款輕量級的Web 服務器/反向代理服務器,其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。下面我們就來詳細介紹下nginx的常用配置,該配置均爲我們生產環境中檢驗過的,大家可放心使用。

一、主配置文件

user nobody nobody; #nginx用戶、用戶組

worker_processes 8; #開啓8個工作進程

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; #0001表示啓用第一個CPU內核,0010表示啓用第二個CPU內核,依此類推

error_log logs/error.log; #錯誤日誌存放路徑

#error_log logs/error.log notice;

#error_log logs/error.log info;

pid logs/nginx.pid; #pid文件存放路徑

worker_rlimit_nofile 100000; #指定進程可以打開的最大描述符號,這個指令是指當一個nginx進程打開的最多文件描述符數量,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是很均勻,建議與ulimit -n的值保持一致。當然設置比ulimit -n大也可以,設置後你的操作系統和Nginx可以處理比ulimit -n更多的文件

google_perftools_profiles /tmp/tcmalloc;# google-perftools中TCMalloc庫在內存分配效率和速度上要高很多,這在很大程度上提高了服務器在高併發情況下的性能,從而降低系統負載

events {

use epoll; #使用epoll的I/O 模型。linux建議epoll,FreeBSD建議採用kqueue

#accept_mutex off;

#multi_accept on;

worker_connections 100000; #每個工作進程的最大連接數量。根據硬件調整,和前面工作進程配合起來用,儘量大,但是別把cpu跑到100%就行。每個進程允許的最多連接數,理論上每臺nginx服務器的最大連接數爲。worker_processes*worker_connections

}

http { #nginx代理http協議,還可以代理ftp/mail等協議

include mime.types; #設定mime類型,類型由mime.type文件定義

default_type application/octet-stream;

log_formatmain'$http_x_forwarded_for - "$upstream_cache_status" $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $remote_addr ';

#log_format log1 '$realip - "$upstream_cache_status" $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $remote_addr';

#日誌格式設置

$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;

$remote_user:用來記錄客戶端用戶名稱;

$time_local:用來記錄訪問時間與時區;

$request:用來記錄請求的url與http協議;

$status:用來記錄請求狀態;成功是200,

$body_bytes_sent :記錄發送給客戶端文件主體內容大小;

$http_referer:用來記錄從那個頁面鏈接訪問過來的;

$http_user_agent:記錄客戶瀏覽器的相關信息;

通常web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。

#access_log logs/access.log main;

sendfile on; #使用高效的文件傳輸,可以讓sendfile()發揮作用。sendfile()可以在磁盤和TCP socket之間互相拷貝數據(或任意兩個文件描述符)。Pre-sendfile是傳送數據之前在用戶空間申請數據緩衝區。之後用read()將數據從文件拷貝到這個緩衝區,write()將緩衝區數據寫入網絡。sendfile()是立即將數據從磁盤讀到OS緩存。因爲這種拷貝是在內核完成的,sendfile()要比組合read()和write()以及打開關閉丟棄緩衝更加有效。

tcp_nopush on; #防止TCP阻塞, 告訴nginx在一個數據包裏發送所有頭文件,而不一個接一個的發送

tcp_nodelay on; #告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。 server_tokens off;#徹底隱藏nginx版本號,提高安全性

#charset utf-8;

keepalive_timeout 75; #保持連接超時時間

gzip on; #是否啓用壓縮功能,實時壓縮輸出數據流

gzip_min_length 1k; #允許壓縮的頁面的最小字節數,建議設置成大於 1K 的字節數(頁面字節數從header 頭的Content-Length 中獲取的,默認值爲 0 ,不管頁面多大都進行壓縮)

gzip_buffers 4 16k; # 申請4 個單位爲 16K 的內存作爲壓縮數結果的緩存。(默認是申請與原始數據大小相同的內存空間來存儲gzip的壓縮結果)

gzip_http_version 1.0; #設置識別HTTP協議的版本,默認是1.1,大部分瀏覽器已經支持gzip解壓

gzip_comp_level 3; #設置壓縮比(1 壓縮比最小,9 壓縮比最大)

gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png application/xml; #指定壓縮的類型(無論是否指定, "text/html" 類型一定是會被壓縮的)

#gzip_vary on; #可以讓前端緩存服務器緩存經過 gzip 壓縮的頁面,如:Squid

server_names_hash_bucket_size 128; #保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。參數hash bucket size總是等於hash表的大小,並且是一路處理器緩存大小的倍數。在減少了在內存中的存取次數後,使在處理器中加速查找hash表鍵值成爲可能。如果hash bucket size等於一路處理器緩存的大小,那麼在查找鍵的時候,最壞的情況下在內存中查找的次數爲2。第一次是確定存儲單元的地址,第二次是在存儲單元中查找鍵 值。因此,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小

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

client_max_body_size 50m; #允許客戶端請求的最大單文件字節數

client_body_buffer_size 512k; #指定用戶請求體所使用的buffer的最大值

client_header_buffer_size 32k; #設置用戶請求頭所使用的buffer大小

large_client_header_buffers 4 32k; #注意:(1)對絕大多數請求來說,1k足以滿足請求頭所需的buffer;(2)對於攜帶有較大cookie或來自於wap用戶的請求頭來說,1k的buffer一般不夠,這時可以使用指令large_client_header_buffers。

#proxy_ignore_client_abort on;

proxy_connect_timeout 10s; #nginx跟後端服務器連接超時時間(代理連接超時)

proxy_read_timeout 60s; #連接成功後,後端服務器響應時間(代理接收超時)

proxy_send_timeout 60s; #後端服務器數據回傳時間(代理髮送超時)

proxy_buffer_size 16k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小

proxy_buffers 4 64k; # proxy_buffers緩衝區,網頁平均在64k以下的話,這樣設置

proxy_busy_buffers_size 128k; #高負荷下緩衝大小

proxy_temp_file_write_size 128k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳

proxy_temp_path /dev/shm/nginx_temp_mem; #代理緩存目錄

open_file_cache max=204800 inactive=20s; #這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。

open_file_cache_min_uses 1; # open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除

open_file_cache_valid 30s; #這個是指多長時間檢查一次緩存的有效信息。

#limit_req_zone $binary_remote_addr zone=allips:10m rate=5r/m; #速率限制

#limit_req_zone $http_x_forwarded_for zone=allips:100m rate=1r/m;

server {

server_name _; #default

return 403;

access_log off;

}#禁止IP直接訪問80端口或者禁止非本站的域名綁定我們的IP

################# ywadminproject ####################

include nginx-ywadmin.conf; #虛擬主機配置,每個虛擬主機寫個單獨配置文件,便於管理

}

二、子配置文件

[user@www conf]$ cat nginx-ywadmin.conf

proxy_temp_path /dev/shm/nginx_temp_mem; # 指定存放的緩存目錄

proxy_cache_path /dev/shm/nginx_cache_mem/www levels=2:2 keys_zone=cache_nginx_www:200m max_size=5000m inactive=3d;

proxy_cache_path /tmp/cache_dir1/www levels=1:2:2 keys_zone=danye_s:8000m max_size=2000G inactive=5d;

#指定緩存的路徑;levels=1:2:2 代表第一級目錄有16個目錄;第二級有256個,第三級也是有256個;所有活動的key和元數據存儲在共享的內存區域中,這個區域用keys_zone參數指定,內存佔據8000m;最大的磁盤佔用空間爲2000G;inactive=5d 如果在 inactive參數指定的5天內緩存的數據沒有被請求則被刪除;

upstream www_ywadmin_com #代理被調用的名稱爲:www_ywadmin_com

{

server 192.168.1.100:8080 max_fails=3 fail_timeout=30s weight=2;

server 192.168.1.101:8080 max_fails=3 fail_timeout=30s weight=3;

#max_fails = NUMBER - 在一定時間內(這個時間在fail_timeout參數中設置)檢查這個服務器是否可用時產生的最多失敗請求數,默認爲1,將其設置爲0可以關閉檢查;

weight = NUMBER - 設置服務器權重,默認爲1;

fail_timeout = TIME - 在這個時間內產生了max_fails所設置大小的失敗嘗試連接請求後這個服務器可能不可用,同樣它指定了服務器不可用的時間(在下一次嘗試連接請求發起之前)

}

geo $whiteiplist { #白名單

default 1;

8.8.8.8 0;

127.0.0.1 0;

}

map $whiteiplist $limit {

1 $binary_remote_addr;

0 "";

}

limit_conn_zone $limit zone=wwwperip:10m; #連接數限制

limit_req_zone $limit zone=www:10m rate=50r/s; #訪問速率限制

server

{

server_name ywadmin.com;

rewrite "^/(.*)$" http://www.ywadmin.com/$1 permanent;

access_log off;

}

server

{

listen 80;

server_name www.ywadmin.com; # 配置訪問的主機名

proxy_set_header Host $host; #但是如果這個字段在客戶端的請求頭中不存在,那麼不發送數據到被代理服務器。這種情況下最好使用$Host變量,它的值等於請求頭中的"Host"字段或服務器名,$host, 請求信息中的"Host",如果請求中沒有Host行,則等於設置的服務器名

proxy_set_header X-Real-IP $remote_addr; #$remote_addr, 客戶端地址

proxy_set_header X-Forwarded-For $remote_addr; #X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時纔會添加該項

set $realip "";

if ($proxy_add_x_forwarded_for ~ "^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)") {

set $realip $1;

}

if ($proxy_add_x_forwarded_for = "^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)") {

set $realip $proxy_add_x_forwarded_for;

}

proxy_set_header ipip $realip;

#proxy_set_header X-Forwarded-For $realip;

proxy_set_header Accept-Encoding '';

proxy_ignore_headers "Set-Cookie" "Expires" "Cache-Control" "X-Accel-Redirect" "X-Accel-Expires"; #nginx緩存分成兩部分,一部分是key,一部分是value;瀏覽器會有個cookie等會影響key的生成值。所以忽略掉這些cookie以及一些頭部信息,使相同的頁面生成的key值一樣,促使命中率的提升。

limit_conn wwwperip 20;

limit_req zone=www burst=120;

limit_rate_after 500k;

limit_rate 300k;

#Nginx的http核心模塊ngx_http_core_module中提供limit_rate這個指令可以用於控制速度,limit_rate_after用於設置http請求傳輸多少字節後開始限速。另外兩個模塊ngx_http_limit_conn_module和ngx_http_limit_req_module分別用於連接數和連接頻率的控制。

location = /robots.txt {

root /var/www/html/www.ywadmin.com;

}

location ~ /purge_s(/.*)

{

proxy_cache_purge danye_s $host$1$is_args$args;

}

location ~ ^/(s|g|q)([0-9]*)\.html$

{

expires 1h; # 指定瀏覽器緩存時間爲1小時,以減少不必要的請求;

proxy_cache danye_s; #指定使用哪個keys_zone;

proxy_cache_valid 200 304 7d; #配置nginx cache中的緩存文件的緩存時間;對於狀態爲200和304的緩存文件的緩存時間是7天,7天之後再訪問該緩存文件時,文件會過期,從而去源服務器重新取數據;

proxy_cache_key $host$uri$is_args$args; #以域名、URI、參數組合成Web緩存的Key值,Nginx根據Key值哈希,存儲緩存內容到二級緩存目錄內;

proxy_hide_header Vary; #隱藏vary信息,這樣,cache層就好處理多了,命中率也能有很大提升

proxy_pass http://www_ywadmin_com;

proxy_cache_min_uses 2; #多少次的查詢後應答將被緩存

add_header Cache "$upstream_cache_status";

}

location ~ ^/wap/sendVerifyCode.shtml(.*) #訪問速率限制

{

limit_req zone=allips_2 burst=1 nodelay;

proxy_pass http://www_ywadmin_com;

}

location ~ ^/wap/account!sendVerifyCode.do(.*) #拒絕指定地址訪問

{

if ( $http_x_forwarded_for ~ 100.100.100.101|100.100.100.100 ){

return 403;

}

location ~ ^/plane/app {

rewrite "/plane/(.*)" /$1 break;

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_set_header Cookie $http_cookie;

proxy_pass http://www_ywadmin_com;

}

location ~ ^/plane/ {

rewrite "/plane/(.*)" /$1 break;

proxy_set_header Referer $http_referer;

proxy_set_header Cookie $http_cookie;

proxy_pass http://www_ywadmin_com;

}

location ~ .*\.(png|gif|jpg|jpeg|bmp|ico|js|css|swf)$ #關閉圖片日誌記錄,減少日誌寫入

{

expires 30m;

proxy_cache cache_nginx_www;

proxy_cache_valid 200 304 1h;

proxy_cache_valid any 1m;

proxy_cache_key $host$uri$is_args$args;

proxy_redirect off;

proxy_hide_header Vary;

proxy_pass http://www_ywadmin_com;

add_header Cache "$upstream_cache_status";

access_log off;

}

location ~* ^/nginx-status { #開啓nginx狀態模塊

stub_status on;

allow 192.168.0.0/18;

deny all;

access_log off;

}

location ~ ^/(WEB-INF)/

{

deny all;

}

location ~ .*\.svn/(.*)

{

deny all;

}

location /

{

proxy_pass http://www_ywadmin_com;

}

error_page 404 500 502 /404.htm;

location = /404.htm {

proxy_pass http://www_ywadmin_com;

}

access_log logs/www.access.log main;

error_log logs/www.error.log;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章