1. 程式人生 > >nginx基本優化

nginx基本優化

div AD conn 附件 包含 urn send 也會 OS

優化服務器進程

優化進程個數

worker_processes 4; #官方建議設置為cpu的總核數

# ../sbin/nginx -s reload

[root@c1 conf]# ps -ef|grep nginx|grep -Ev "grep|php-fpm"

root 6544 1 0 Apr16 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx

nginx 8067 6544 0 07:26 ? 00:00:00 nginx: worker process

nginx 8068 6544 0 07:26 ? 00:00:00 nginx: worker process

nginx 8069 6544 0 07:26 ? 00:00:00 nginx: worker process

nginx 8070 6544 0 07:26 ? 00:00:00 nginx: worker process

"worker_processes 4"可知,worker進程數為4.nginx master主進程不包含在內,master為管理進程,負責調度和管理worker進程

綁定不同的nginx進程到不同的cpu上

默認情況下,nginx的多個進程可能跑到某一個cpu或cpu的某一個核上,導致nginx進程使用硬件的資源不均。此節優化是盡可能地分配 不同的nginx進程給不同的cpu處理,達到充分有效利用硬件的多cpu多核資源的目的

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;

這裏的0001 0010 0100 1000是掩碼,分別代表第1、2、3、4核cpu,由於worker_processes進程數為4,因此,上述配置會把每個進程 一核cpu處理,默認情況下不會綁定任何cpu,參數位置為main段

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

worker_rlimit_nofile 65535; 可以設置系統優化後的ulimit -HSn的結果,放置在main段

優化nginx時間處理模型

nginx的連接處理機制在不同的操作系統會采用不同的I/O模型,在Linux下,nginx使用epoll的I/O多路復用模型,在FreeBSD使用kqueue的I/O多路復用,在Solaris中使用/dev/poll方式,在Windows中使用的是icop等等

events {

use epoll;

......

}

調整nginx單個進程允許的客戶端最大連接數

events {

......

worker_connections 20480;

}

worker_connections用於定義nginx每個進程的最大連接數,默認是1024。nginx總並發連接數=worker數量*worker_connections,進程的最大連接數受linux系統進程的最大文件數限制,在執行操作系統命令“ulimit -HSn 65535”或配置相應文件後,worker_connections設置才能生效

隱藏版本號信息

隱藏版本號 在nginx配置文件nginx.conf中的http標簽段內加入"server_tokens off;"參數,然後重載配置文件

http {

......

server_tokens off;

}

修改軟件名稱及版本號

修改版本號需要在編譯安裝前

下載nginx並解壓後,對源碼進行修改,源碼文件都在二級目錄nginx-1.8.0/src/下,找到文件src/core/nginx.h, 然後按照下面的代碼中指出的兩行(粗體)進行修改

# cat nginx.h

......

#define NGINX_VERSION "1.8.0"

#define NGINX_VER "nginx/" NGINX_VERSION

.......

對於粗體部分可以隨意修改

開啟高效文本傳輸模式

sendfile 參數用於開啟文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置為on,可以防止網絡及磁盤I/0阻塞,提升nginx工作效率

可以放置的標簽段[http ,server, location, if in location]

sendfile on; 提高靜態文件讀取效率

tcp_nopush on; 在sendfile開啟的情況下,提高網絡包的傳輸效率,把多個包整合一次性發送出去

tcp_nodelay on; 和tcp_nopush對應的,在keepalive連接下,提高網絡包的傳輸實時性

站點目錄文件及目錄權限優化

為了保證網站不遭受木馬入侵,所有站點目錄的用戶和組都應該為root,所有的目錄權限是755;所有的文件權限是644

以上的權限設置可以防止黑客上傳木馬,以及修改站點文件,但是,合理的網站用戶上傳的內容也會被拒絕。那麽如何讓合法的用戶可以上傳文件,而又不至於被黑客利用攻擊呢?

如果是單機的環境,站點目錄和文件屬性設置如下:

所有的目錄權限設置為755

所有的文件權限設置為644

所有的目錄,以及文件用戶和組都是root

把用戶上傳資源的目錄設置為755,將用戶和組設置為nginx服務的用戶

最後針對上傳資源的目錄做資源訪問限制

對上傳資源的目錄做資源訪問限制

有些網站不但允許用戶發布內容到服務器,還允許用戶發圖片設置上傳附件到服務器上,由於為用戶開了上傳的功能,因此給服務器帶來了很大的安全風險。雖然很多程序在上傳前會做一定的控制,例如:文件大小,類型等,但是,一不小心就會被黑客鉆了空子,上傳了木馬程序。下面將利用nginx配置禁止訪問上傳資源目錄下的PHP、SHELL、Perl、Python程序文件,這樣用戶即使上傳了木馬文件也沒法執行,從而加強了網站的安全。

配置nginx,禁止解析指定目錄下的指定程序

location ~ ^/images/.*\.(php|php5|sh|pl|py)$

{

deny all;

}

location ~ ^/static/.*\.(php|php5|sh|pl|py)$

{

deny all;

}

location ~ ^/data/(attachment|avatar)/.*\.(php|php5)$

{

deny all;

}

以上目錄的限制必須寫在nginx處理php服務配置前面

禁止非法域名解析訪問企業網站

nginx如何防止用戶ip訪問網站(惡意域名解析,也相當於直接IP訪問企業網站)?

方法1:讓使用ip訪問或者惡意解析域名的用戶,收到501錯誤,命令如下:

server {

listen 80 default_server;

server_name _;

return 501;

}

#說明:直接報501錯誤,從用戶體驗上不是很好

方法2:通過301跳轉到主頁,命令如下:

server {

listen 80 default_server;

server_name _;

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

}

方法3:發現某域名惡意解析到公司的服務器ip,在server標簽裏添加一下代碼即可,若有多個server則要多處添加:

if ($host !~ ^www/.heboan/.com$){

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

}

圖片及目錄防盜鏈

根據HTTP referer實現防盜鏈

HTTP referer是header的一部分,當瀏覽器向web服務器發送請求時,一般會帶上referer,告訴服務器我是從哪個頁面鏈接過來的,服務器借此獲得一些信息用於處理。Apache、Nginx、Lighttpd三者都支持HTTP referer實現防盜鏈,referer是目前網站圖片、附件、html等最常用的防盜鏈手段。

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

valid_referers none blocked *.heboan.com;

if ($invalid_referer){

rewrite ^/ http://www.heboan.com/img/nolink.jpg;

#return 404;

}

}

網頁壓縮

gzip on;

#用於開啟gzip,默認是關閉的

gzip_min_length 1k;

#設置允許壓縮的頁面最小字節數,頁面字節數從header頭的content-length中進行獲取。默認值是0,不管頁面多大都壓縮。建議設置大於1k的字節數,小於1k可能會越壓越大

gzip_buffers 4 16k;

#這是系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流,4 16k代表以16k為單位,安裝原始數據大小以16k為單位的4倍申請內存

gzip_http_version 1.1;

#識別http的協議版本

gzip_comp_level2;

#設置壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢,比較消耗cpu資源

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif images/png;

#匹配mime類型進行壓縮,無論是否指定,”text/html”類型總是會被壓縮的

gzip_vary on;

#和http頭有關系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮.

gzip_disable “MSIE [1-6]\.”;

#同時由於IE6不支持gizp解壓縮,所以在IE6下要關閉gzip壓縮功能

nginx基本優化