nginx基本優化
優化服務器進程
優化進程個數
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基本優化