web運維第一篇:nginx配置文件詳解筆記

#定義Nginx運行的用戶和用戶組
user www www;
#nginx進程數,建議設置爲等於CPU總核心數。
worker_processes 8;
#全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#進程文件
pid /var/run/nginx.pid;
#一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,可是nginx分配請求並不均勻,因此建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工做模式與鏈接數上限
events
{
    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本內核中的高性能網絡I/O模型,若是跑在FreeBSD上面,就用kqueue模型。
    use epoll;
    #單個進程最大鏈接數(最大鏈接數=鏈接數*進程數)
    worker_connections 65535;
}

#設定http服務器
http
{
    include mime.types; #文件擴展名與文件類型映射表
    default_type application/octet-stream; #默認文件類型
    #charset utf-8; #默認編碼
    server_names_hash_bucket_size 128; #服務器名字的hash表大小
    client_header_buffer_size 32k; #上傳文件大小限制
    large_client_header_buffers 4 64k; #設定請求緩
    client_max_body_size 8m; #設定請求緩
    sendfile on; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。注意:若是圖片顯示不正常把這個改爲off。
    autoindex on; #開啓目錄列表訪問,合適下載服務器,默認關閉。
    tcp_nopush on; #防止網絡阻塞
    tcp_nodelay on; #防止網絡阻塞
    keepalive_timeout 120; #長鏈接超時時間,單位是秒
    #FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。下面參數看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    #gzip模塊設置
    gzip on; #開啓gzip壓縮輸出
    gzip_min_length 1k; #最小壓縮文件大小
    gzip_buffers 4 16k; #壓縮緩衝區
    gzip_http_version 1.0; #壓縮版本(默認1.1,前端若是是squid2.5請使用1.0)
    gzip_comp_level 2; #壓縮等級
    gzip_types text/plain application/x-javascript text/css application/xml;
    #壓縮類型,默認就已經包含text/html,因此下面就不用再寫了,寫上去也不會有問題,可是會有一個warn。
    gzip_vary on;
    gzip_disable     "MSIE [1-6]\.";  #ie6如下的版本不開啓壓縮
    #limit_zone crawler $binary_remote_addr 10m; #開啓限制IP鏈接數的時候須要使用

upstream www.itnihao.com {
    #upstream的負載均衡,weight是權重,能夠根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的概率越大。
    server 10.10.10.10:80 weight=3 max_fails=2 fail_timeout=30s;
    server 10.10.10.11:80 weight=4 max_fails=2 fail_timeout=30s;
    server 10.10.10.12:80 weight=3 max_fails=2 fail_timeout=30s;
}


#虛擬主機的配置
server
{
    #監聽端口
    listen 80;
    #域名能夠有多個,用空格隔開
    server_name www.itnihao.com itnihao.com;
    index index.html index.htm index.php;
    root /data/web/www;
    #防止系統目錄被訪問
    location ~ (/.svn/|etc/passwd|etc/shadow|etc/group|etc/gshadow|etc/sudoers|nginx/nginx.conf|etc/my.cnf|sshd_config|ifconfig|bin/rm|bin/mkdir|bin/rmdir|bin/touch|usr/bin/vim|rsync.conf|redis.conf)
    {
        deny all;
    }


    #php解析
    location ~ .*.(php|php5)?$
    {
        #fastcgi_pass   unix:/tmp/fpm.sock;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;

    }
   
    #日誌格式設定
    log_format access '$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/www.itnihao.com.access.log access;
    #對 "/" 啓用反向代理
    location / {
        #若是後端的服務器返回502,504,執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        #代理的服務器池名稱
        proxy_pass http://www.itnihao.com;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #如下是一些反向代理的配置,可選。
        proxy_set_header Host $host;
        client_max_body_size 10m; #容許客戶端請求的最大單文件字節數
        client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,
        proxy_connect_timeout 90; #nginx跟後端服務器鏈接超時時間(代理鏈接超時)
        proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)
        proxy_read_timeout 90; #鏈接成功後,後端服務器響應時間(代理接收超時)
        proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
        proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k如下的設置
        proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;
        #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
        
        if ($http_user_agent ~ (curl|LWP::Simple|winhttp|clshttp|HTTrack|harvest|nsauditor|dirbuster|pangolin|nmap|sqlninja|grendel-scan|hydra|perl|HTMLParser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|sae|zmeu|BabyKrokodil|python|netsparker|httperf|ApacheBench|webbench|JoeDog))
        {
              return 443;
        }
        #拒絕非法瀏覽器訪問
        
    }
    #設定查看Nginx狀態的地址
    location /NginxStatus {
        stub_status on;
        access_log off;
        #auth_basic "NginxStatus";
        #auth_basic_user_file conf/htpasswd;
        #htpasswd文件的內容能夠用apache提供的htpasswd工具來產生。
        allow 127.0.0.1;
        allow 192.168.11.0/24;
        deny all; 
    }
    #php-fpm的狀態查看
    #須要開啓php-fpm.conf中的pm.status_path = /phpfpmstatus
    location ~ ^/(phpfpmstatus)$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/fpm.sock;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    }

    #本地動靜分離反向代理配置
    #全部jsp的頁面均交由tomcat或resin處理
    location ~ .(jsp|jspx|do)?$ {
        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_pass http://127.0.0.1:8080;
    }
    #全部靜態文件由nginx直接讀取不通過tomcat或resin
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
        expires 15d;
    }
   }
}
       

nginx的調度算法

nginx的調度算法
1.輪詢調度算法(Round-Robin Scheduling):
    輪詢調度算法的原理是每一次把來自用戶的請求輪流分配給內部中的服務器,從1開始,直到N(內部服務器個數)
    對於一級後端服務器羣,造成一個環隊列的形式,對於每一個到達的請求按時間順序順次分配給這些後端服務器。在前端調度器與後端服務器之間採用「心跳」方式進行狀態檢查,若是發現後端服務器宕機,則將其刪除。
    這種方式爲默認配置,優勢是簡潔,但缺點是沒法進行最優化調度,有可能有的請求須要耗時較久,這樣會帶來必定的不平衡。
upstream lb {
        server 10.10.57.122:80;
        server 10.10.57.123:80;
}
2. 加權輪詢
    這是一種對上述方式的改進,引入權值的概念,可以解決後端服務器性能不均的狀況

upstream lb {
        server 10.10.57.122:80 weight=5;
        server 10.10.57.123:80 weight=10;
}
3.ip_hash:同一個ip老是被轉發同一server
    這是一種非輪詢式方式,對於每一個到達的請求,直接經過其請求IP進行哈希的映射,經過映射結果得到那一臺後端服務器要處理這個請求,這種方式有一個明顯的好處是可以保證session的惟一性。
upstream lb {
        ip_hash;
        server 10.10.57.122:80;
        server 10.10.57.123:80;
}
4.url_hash(基於URL的哈希方式)  
    這種方式與IP的哈希方式相似,是對客戶機請求的URL進行哈希操做,這樣的方式有一個明顯的好處是,可以便於內容緩存的實現,對於常常性的資源訪問,採
upstream lb {
         server 10.10.57.122:80;
         server 10.10.57.123:80;
         hash $request_uri;
}
5.fair
    這種方式是根據服務器端的動態響應,對每個請求進行分配。 這種方式可以自動根據當前的後端實際負載來優化。
upstream lb {
         server 10.10.57.122:80;
         server 10.10.57.123:80;
         fair;
}
      	

nginx防盜鏈

server {
        listen 80;
        server_name www.itnihao.com;
        charset utf-8;
        root /var/web/www;
        index index.php;

        location / {
        valid_referers none blocked www.itnihao.com;

        if ($invalid_referer) {
             return   411;
           }
        }
}
      	
用curl測試
curl http://www.itnihao.com -A "user_agentd" -e "http://www.itnihao.com"
返回200
curl http://www.itnihao.com -A "user_agentd" -e "http://www.itnihao.net"
返回411
這裏只有一個重要的指令valid_referers:
這個指令在referer頭的基礎上爲 $invalid_referer 變量賦值,其值爲0或1。
可使用這個指令來實現防盜鏈功能,若是valid_referers列表中沒有Referer頭的值, $invalid_referer將被設置爲1。
參數可使以下形式:
none意爲不存在的Referer頭
blocked意爲根據防火牆假裝Referer頭,如:「Referer: XXXXXXX」。
server_names爲一個或多個服務器的列表,0.5.33版本之後能夠在名稱中使用「*」通配符

nginx鏈接狀態解釋

Active connections //當前 Nginx 正處理的活動鏈接數。
server accepts handled requests //總共處理了多少個鏈接 |成功建立多少次握手|總共處理了多少個請求。
Reading //nginx 讀取到客戶端的 Header 信息數。
Writing //nginx 返回給客戶端的 Header 信息數。
Waiting //開啓 keep-alive 的狀況下,這個值等於 active – (reading + writing),意思就是 Nginx 已經處理完正在等候下一次請求指令的駐留鏈接

測試url返回狀態

curl -o /dev/null -s -w %{http_code} http://www.itnihao.com 

tcp鏈接狀態

CLOSED:無鏈接是活動的或正在進行
LISTEN:服務器在等待進入呼叫 
SYN_RECV:一個鏈接請求已經到達,等待確認 
SYN_SENT:應用已經開始,打開一個鏈接 
ESTABLISHED:正常數據傳輸狀態 
FIN_WAIT1:應用說它已經完成 
FIN_WAIT2:另外一邊已贊成釋放 
ITMED_WAIT:等待全部分組死掉 
CLOSING:兩邊同時嘗試關閉 
TIME_WAIT:另外一邊已初始化一個釋放 
LAST_ACK:等待全部分組死掉 

統計tcp鏈接狀態數

netstat -n|awk '/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]}'
相關文章
相關標籤/搜索