Nginx配置及linux系統內存高併發多方面優化

基於網上的技術文章思路,自己加以整理,有常用的和不常用的策略,供參考。

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.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.普通用戶的端口問題

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

2.1  優化nginx進程個數的策略

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

  worker_processes  1;一般調整到與CPU的核數相同(如,2個四核的cpu計爲8)

  (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     432k;                   #壓縮緩存區大小

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
/usr/local/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 /usr/local/nginx/logs
  chmod -R 600 /usr/local/nginx/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。

再加一個linux的系統內核和內存的優化

1、關於內核參數的優化:

net.ipv4.tcp_max_tw_buckets = 6000

timewait 的數量,默認是180000。

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 連接。

net.ipv4.tcp_syncookies = 1

開啓SYN Cookies,當出現SYN 等待隊列溢出時,啓用cookies 來處理。

net.core.somaxconn = 262144

web 應用中listen 函數的backlog 默認會給我們內核參數的net.core.somaxconn 限制到128,而nginx 定義的NGX_LISTEN_BACKLOG 默認爲511,所以有必要調整這個值。

net.core.netdev_max_backlog = 262144

每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。

net.ipv4.tcp_max_orphans = 262144

系統中最多有多少個TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被複位並打印出警告信息。這個限制僅僅是爲了防止簡單的DoS 攻擊,不能過分依靠它或者人爲地減小這個值,更應該增加這個值(如果增加了內存之後)。

net.ipv4.tcp_max_syn_backlog = 262144

記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M 內存的系統而言,缺省值是1024,小內存的系統則是128。

net.ipv4.tcp_timestamps = 0

時間戳可以避免序列號的卷繞。一個1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的數據包。這裏需要將其關掉。

net.ipv4.tcp_synack_retries = 1

爲了打開對端的連接,內核需要發送一個SYN 並附帶一個迴應前面一個SYN 的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK 包的數量。

net.ipv4.tcp_syn_retries = 1

在內核放棄建立連接之前發送SYN 包的數量。

net.ipv4.tcp_fin_timeout = 1

如 果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2 狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。缺省值是60 秒。2.2 內核的通常值是180 秒,3你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB 服務器,也有因爲大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比FIN-WAIT-1 要小,因爲它最多隻能吃掉1.5K 內存,但是它們的生存期長些。

net.ipv4.tcp_keepalive_time = 30

當keepalive 起用的時候,TCP 發送keepalive 消息的頻度。缺省是2 小時。


2、下面是關於系統連接數的優化

linux 默認值 open files 和 max user processes 爲 1024

#ulimit -n

1024

#ulimit Cu

1024

問題描述: 說明 server 只允許同時打開 1024 個文件,處理 1024 個用戶進程

使用ulimit -a 可以查看當前系統的所有限制值,使用ulimit -n 可以查看當前的最大打開文件數。

新裝的linux 默認只有1024 ,當作負載較大的服務器時,很容易遇到error: too many open files 。因此,需要將其改大。

解決方法:

使用 ulimit Cn 65535 可即時修改,但重啓後就無效了。(注ulimit -SHn 65535 等效 ulimit -n 65535 ,-S 指soft ,-H 指hard)

有如下三種修改方式:

1. 在/etc/rc.local 中增加一行 ulimit -SHn 65535
2. 在/etc/profile 中增加一行 ulimit -SHn 65535
3. 在/etc/security/limits.conf 最後增加:

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

具體使用哪種,在 CentOS 中使用第1 種方式無效果,使用第3 種方式有效果,而在Debian 中使用第2 種有效果

# ulimit -n

65535

# ulimit -u

65535

備註:ulimit 命令本身就有分軟硬設置,加-H 就是硬,加-S 就是軟默認顯示的是軟限制

soft 限制指的是當前系統生效的設置值。 hard 限制值可以被普通用戶降低。但是不能增加。 soft 限制不能設置的比 hard 限制更高。 只有 root 用戶才能夠增加 hard 限制值。


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