天天看點

Nginx 配置優化

1、隐藏nginx header版本号

[root@ocbsap01 tmp]# curl -I 192.168.56.102:1983

HTTP/1.1 200 OK

Server: nginx/1.12.1

Date: Thu, 20 Jul 2017 06:41:49 GMT

Content-Type: text/html

Content-Length: 612

Last-Modified: Wed, 19 Jul 2017 07:46:59 GMT

Connection: keep-alive

ETag: "596f0e73-264"

Accept-Ranges: bytes

編譯nginx.conf配置檔案,添加server_tokens off參數

http {

   ...

    server_tokens off; #控制http response header内的服務版本資訊的顯示,以及錯誤資訊中web服務版本資訊

}

[root@ocbsap01 ~]# curl -I 192.168.10.128:1983

Server: nginx

Date: Tue, 25 Jul 2017 15:48:00 GMT

Last-Modified: Mon, 24 Jul 2017 16:16:38 GMT

ETag: "59761d66-264"

2、更改源碼隐藏軟體名稱需要修改三個nginx源碼檔案

第一個nginx-1.12.1/src/core/nginx.h檔案

[root@ocbsap01 core]# pwd

/tmp/nginx-1.12.1/src/core

[root@ocbsap01 core]# vim nginx.h   #将如下參數修改自定義的内容

#define NGINX_VERSION      "1.12.1"                #改成你想要的版本号,如2.4.2

#define NGINX_VER          "nginx/" NGINX_VERSION  #你想改成的軟體名稱,如Apache

#define NGINX_VAR          "NGINX"                 #可以改成OWS等

第二個

vim /tmp/nginx-1.12.1/src/httpngx_http_header_filter_module.c

将這條static u_char ngx_http_server_string[] = "Server: nginx" CRLF;

改成static u_char ngx_http_server_string[] = "Server: OWS" CRLF;

或者使用一條指令修改替換

[root@ocbsap01 nginx-1.12.1]# sed -i 's#Server: nginx#Server: OWS#g' src/http/ngx_http_header_filter_module.c

第三個ngx_http_special_response.c是否對外展示敏感資訊

[root@ocbsap01 nginx-1.12.1]# sed -n '21,30p' src/http/ngx_http_special_response.c 

static u_char ngx_http_error_full_tail[] =

"<hr><center>" NGINX_VER "</center>" CRLF

"</body>" CRLF

"</html>" CRLF

;

static u_char ngx_http_error_build_tail[] =

"<hr><center>" NGINX_VER_BUILD "</center>" CRLF

修改為如下

"<hr><center>" NGINX_VER " (http://www.baidu.com)</center>" CRLF

"<hr><center>OWS</center>" CRLF

重新編譯安裝nginx,重新開機服務

3、更改nginx預設使用者及使用者組 (建議是使用普通使用者安裝可參考我第一篇安裝文檔)

[root@ocbsap01 nginx-1.12.1]# grep '#user' /application/nginx/conf/nginx.conf.default 

#user  nobody; #系統預設的使用者為nobody

[root@ocbsap01 nginx-1.12.1]#  useradd ocbs -s /sbin/nologin -M #建立使用者ocbs

user  ocbs ocbs; #nginx.conf 中配置使用者

也可以在編譯時加入使用者和使用者組,如

--user=ocbs --group=ocbs --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.12.1/

[root@ocbsap01 nginx-1.12.1]# ps -ef|grep nginx|grep -v grep

root      1386     1  0 Jul21 ?        00:00:00 nginx: master process /home/ocbs/sbin/nginx

ocbs      24732  1386  0 23:19 ?        00:00:00 nginx: worker process

#此時worker process程序就是使用的ocbs使用者權限,master依舊是root使用者

4、配置nginx worker程序個數

worker_processes  4; #最好為伺服器CPU的邏輯核心數

[root@ocbsap01 /]# grep "cpu cores" /proc/cpuinfo|uniq   #單個實體CPU 邏輯核數

cpu cores : 1

[root@ocbsap01 /]# grep "processor" /proc/cpuinfo|wc -l  #邏輯核心數

1

[root@ocbsap01 /]# grep "physical id" /proc/cpuinfo|sort|uniq|wc -l #實體CPU個數

5、根據CPU核數進行nginx程序優化

親和力參數(Nginx服務可能會發生隻在同一顆CPU上起作用的情況)有幾個core就有幾位0 其中1表示運作第幾個上面

worker_processes  8;

worker_cpu_affinity 0001 0010 0100 1000; #數字代表1、2、3、4的掩碼,平均分攤程序壓力

worker_cpu_affinity 00000001 00000010...#8核心寫法

防止程序隻在一個核心上運作也可以使用 taskset 指令

taskset -c 1,2,3 /home/ocbs/sbin/nginx start

6、nginx事件處理模型優化

nginx的連接配接處理機制在不同的作業系統中會采用不同的I/O模型:Linux上使用epoll、BSD上面用kqueue、Solaris中使用/dev/poll、windows中使用icop.

events {

    use epoll; #nginx官方建議,可以不指定事件處理模型,Nginx會自動選擇最佳的事件處理模型

7、調整Nginx worker單個worker_processes程序允許的用戶端最大連接配接數

    worker_connections  1024;

#最大連接配接數Max_client = worker_processes * worker_connections

#程序的最大連接配接數收Linux系統程序的最大打開檔案數限制,在執行作業系統指令“ulimit -HSn 65535”後,才能生效

#連接配接數并不是越大越好,要在系統性能能接受的範圍内

8、配置Nginx worker程序最大打開檔案數

    worker_rlimit_nofile 65535; #該值可設定為系統優化後的ulimit -HSn的結果

9、開啟高效的檔案傳輸模式

    sendfile        on; #開啟檔案的高效傳輸模式

#同時将tcp_nopush和tcp_nodelay兩個指令設定為on,減少網絡傳輸包數量、防止網絡及磁盤的I/O阻塞,提升Nginx效率

其中tcp_nopush 預設為on

10、設定連接配接逾時時間

    keepalive_timeout  65;        #設定用戶端連接配接保持會話的逾時時間

    tcp_nodelay on;               #激活tcp_nodelay,提高I/O性能,在包含keepalive參數時才有效

    client_header_timeout 15;     #讀取用戶端請求頭資料逾時時間,逾時則傳回“Request time out(408)”

    clietn_body_timeout 15;       #讀取用戶端請求主體逾時時間

    send_timeout 15;              #指定用戶端響應時間

#将無用的連接配接盡快設定為逾時,可以保護伺服器的系統資源(CPU、記憶體、磁盤)

11、上傳檔案大小設定(動态應用)

 client_max_body_size 10m;      #具體數字要根據業務需求決定

12、fastcgi調優(配合PHP引擎動态服務)

fastcgi作為靜态服務和動态服務之間的傳接口,也有cache和buffer緩存和緩沖區

    fastcgi_connect_timeout 240;          #連接配接到後端fastcgi的逾時時間

    fastcgi_send_timeout 240;             #已經和fastcgi建立連接配接後多久不傳送資料,就會被斷開

    fastcgi_read_timeout 240;             #接收fastcgi應答的逾時時間

    fastcgi_buffer_size 64k;              #指定讀取fastcgi應答第一部分需要多大的緩沖區,可以設定為gastcgi_buffers選項指定的緩沖區大小

    fastcgi_busy_buffers_size 128k;       #繁忙時的buffer,可以是fastcgi_buffer的兩倍

    fastcgi_temp_path /data/ngx_fcgi_tmp; #在寫入fastcgi_temp_path時将用多大的資料庫,預設是fastcgi_buffer的兩倍,如果太小,可能會報502 Bad GateWay

    fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;  #指定相關參數配比

在server标簽中配合設定相關參數

server {

    location ~ .*\.(php|php5)?$ {

            root html/www;

            fastcgi_pass        127.0.0.1:9000;

            fastcgi_index       index.php;

            include fastcgi.conf;

            fastcgi_cache ngx_fcgi_cache;   #表示開啟緩存并為其指定一個名稱,開啟緩存非常有用,可以有效降低cpu的負載,并且防止502的發生,但是也可能會帶來其他問題

            fastcgi_cache_valid 200 302 1h; #将對應的應答碼緩存時間

            fastcgi_cache_valid 301 1d;     #将301緩存1天

            fastcgi_cache_valid any 1m;     #将其他應答緩存1分鐘

            fastcgi_cache_min_uses 1;       #請求數量

            fastcgi_cache_use_stale error timeout invalid_header http_500; #錯誤判斷

        }

    }

13、配置nginx gzip壓縮功能

###(重要!!!)幾k位元組的壓縮比在大資料量的沖擊下也可以節省不少的流量,網站内容傳輸速度更快,為使用者帶來更好的浏覽體驗

Nginx gzip壓縮子產品提供了壓縮檔案内容的功能,使用者請求的内容在發送到使用者用戶端之前,Nginx伺服器會根據一些具體的政策實施壓縮,到用戶端後由浏覽器解壓

Nginx 依賴ngx_http_gzip_module子產品

Apache 使用mod_deflate壓縮功能

    gzip on;               #開啟壓縮功能

    gzip_min_length 1k;    #允許壓縮的最小頁面位元組數,從header頭的Content-Length中擷取,不管頁面多大都進行壓縮,建議設定成大于1K,如果小于1K可能會越壓縮越大

    gzip_http_version 1.1; #壓縮版本,預設為1.1,目前大部分浏覽器都支援壓縮

    gzip_buffers  4 32k;   #壓縮緩沖大小,允許申請4個機關為32K的記憶體作為流緩存

    gzip_comp_level 9;     #壓縮比例,1最小,9最大,傳輸速度最快,但是比較消耗資源

    gzip_types text/css text/xml application/javascript;   #指定壓縮的内容類型

    gzip_vary on;          #vary header支援,讓前端的緩存伺服器繼續緩存傳輸該壓縮頁面,而不提前解壓

14、配置Nginx expires緩存功能

重要!!!)

在網站的開發和營運過程中,視訊、圖檔、CSS、JS等網站元素的更改機會較少,我們可以将這些更改頻率較少的内容緩存在使用者本地,

使用者在第二次通路網站時就不用繼續去伺服器下載下傳了,節省流量,加快通路速度

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ #指定緩存檔案的類型

        {

        expires      3650d; #指定緩存時間

        location ~ .*\.(js|css)?$

        expires      3d;

expires緩存的缺點就是在網站更新相關資料後,使用者如果不清理緩存看到的就會一直是過期的資料,為了解決這個問題可以使用如下方法:

a、縮短緩存時間,比如百度的首頁圖檔緩存時間為一天;

b、服務背景更改圖檔名稱,這樣就相當于是一個新的頁面内容,使用者會重新下載下傳 

c、相關的CSS、JS推送到CDN

15、Nginx日志相關優化與安全

1)每天進行日志切割,備份

#!/bin/sh

cd /home/ocbs/log/

mv access.log ocbs.access_$(date +%F -d -1day).log

mv blog_access.log blog.access_$(date +%F -d -1day).log

/home/ocbs/sbin/nginx -s reload

cat >>/var/spool/cron/root<<EOF

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

EOF

2)不記錄不需要的通路日志

對于健康檢查或者某些圖檔、JS、CSS日志,一般不需要記錄日志,因為在統計PV時是按照頁面計算的,而且寫入頻繁會消耗IO,降低伺服器性能

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {

        access_log off;

3)通路日志的權限設定

chown -R root:root /application/nginx/logs

chmod -R 700 /application/logs

16、Nginx站點目錄及檔案URL通路控制(防止惡意解析)

1)根據擴充名限制程式或者檔案被通路

資源檔案夾如使用者上傳的頭像,防止惡意上傳腳本病毒檔案被解析執行

location ~ ^/images/.*\.(php|php5|sh|pl|py)$ { #指定目錄限制通路

            deny all;

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

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

        location ~ .*\.(php|php5)?$ { #必須配置在解析之前

2)禁止通路目錄并傳回指定HTTP代碼

    location /admin/ { return 404; }

3)限制網站來源IP

location ~ ^/admin/ {

            allow 202.111.12.211;

            #allow 192.168.1.0/24; #也可以限制IP段

企業問題案列:Nginx做方向代理的時候可以限制用戶端IP嗎?

方法一:用if來控制

屏蔽:

if ( $remotea_addr = 10.0.0.110 ) {

  return 403;

允許:

if ( $remotea_addr = 10.0.0.111 ) {

  set $allow_access_root 'true';

方法二:利用deny和allow

location / {

  root html/blog;

  index index.php index.html index.html;

  deny 10.0.0.7;

  allow all;

17、防止惡意解析通路企業網站

方法一:

  listen 80 default_server;

  server_name _;

  return 501;

方法二:

  rewrite ^(.*) http://www.lichengbing.cn$1 permanent;

方法三:

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

18、Nginx圖檔及目錄防盜鍊

網站圖檔被盜鍊最直接的影響就是網絡帶寬占用加大了,寬帶費用變高了,網絡流量忽高忽低,監控頻繁告警

由于購買了CDN加速,流量高了好幾個G,瞬間損失好幾萬...

利用referer防盜鍊

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

    valid_referers none blocked *.lichengbing.cn lichengbing.cn;

 if ($invalid_referer) {

    rewrite ^/ http://www.lichengbing.cn/img/nolink.jpg

   }

#或者也可以使用NginxHttpAccessKeyModule實作防盜鍊

19、Nginx錯誤頁面的優雅顯示

  error_page 403   /403.html; #當出現403錯誤時,會跳轉到403.html頁面

20、Nginx防爬蟲優化

robots.txt機器人協定

網絡爬蟲排除标準,告訴搜尋引擎哪些目錄可以抓取,哪些禁止抓取

禁止下載下傳協定代理

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

    return 403;

防止N多爬蟲代理通路網站

if ($http_user_agent ~*

  “qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot”) {

   return 403;

禁止不同浏覽器通路

if ($http_user_agent ~* “Firefox|MSIE”)

{

rewrite ^(.*) http://blog.etiantian.org/$1 permanent

21 、限制HTTP請求方法

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

   return 501;

22、防DOS攻擊

使用limit_conn_zone進行控制,控制單個IP或域名的通路次數,限制連續通路

limit_conn_zone $binary_remote_addr zone=perip:10m;

limit_conn_zone $server_remote_addr zone=perserver:10m;

limit_conn perip 10;

limit_conn perserver 100;

#還可以使用limit_req_zone進行控制,控制單個IP的通路速率

23、Nginx程式架構優化

解耦,一堆程式代碼按照業務用途分開,然後提供服務,例如:注冊登入、上傳、下載下傳、浏覽清單、商品内容、訂單支付等都應該是獨立的程式服務,

隻不過在用戶端看來是一個整體而已,小公司最起碼要做到的解耦是

01網頁頁面服務

02圖檔附件及下載下傳服務

03上傳圖檔服務

24、使用普通使用者安裝啟動Nginx(監牢模式),尤其是在銀行等金融機關要求是AP必須運作在普通使用者上

降級思想,Nginx的Master程序使用的是root使用者,worker程序使用的是nginx指定的普通使用者,

用root跑nginx的Master程序有兩大問題:

1、是最小化權限配置設定遇到問題;

2、網站一旦有漏洞,很容易丢掉root權限

降級執行的好處:

1、建立普通使用者ocbs,用ocbs跑Nginx服務,開發運維都使用普通帳号,隻要和ocbs同組,照樣可以管理nginx,還解決了root權限太大問題

2、職責分明,相關賬号負責維護程式和日志,出問題負首要責任

備注:以上是個人學習并整理的,一般正規運維機關都有一套針對自己環境優化方式,切不可生搬硬套。如需要優化需要針對性的靈活處理

本文轉自 yuri_cto 51CTO部落格,原文連結:http://blog.51cto.com/laobaiv1/1951049,如需轉載請自行聯系原作者

繼續閱讀