The server of Nginx(三)——Nginx企業級優化

  相信看過我以前apache文章的朋友們,對服務優化也有了一個大概的瞭解,相比較而言,Nginx企業中應用的更多一些,所以今天也會詳細闡述Nginx的優化,有人說,服務器不須要優化,開虛擬化,分分鐘成倍增長併發量,可是網站服務器優化不只僅是爲了高併發而作,有些優化也涉及到了安全和控制,請你們耐心往下看,若是有哪裏寫的不明白大家能夠評論,我基本天天都上線,會仔細思考你們的問題。javascript

  首先提供Nginx主配置文件,你們可先參考瞭解一下php

 1 #user  nobody;
 2 worker_processes  1;
 3 #error_log  logs/error.log;
 4 #error_log  logs/error.log  notice;
 5 #error_log  logs/error.log  info;
 6 #pid        logs/nginx.pid;
 7 events {
 8     worker_connections  1024;
 9 }
10 http {
11     include       mime.types;
12     default_type  application/octet-stream;
13     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
14     #                  '$status $body_bytes_sent "$http_referer" '
15     #                  '"$http_user_agent" "$http_x_forwarded_for"';
16     #access_log  logs/access.log  main;
17     sendfile        on;
18     #tcp_nopush     on;
19     #keepalive_timeout  0;
20     keepalive_timeout  65;
21     #gzip  on;
22     server {
23         listen       80;
24         server_name  localhost;
25         #charset koi8-r;
26         #access_log  logs/host.access.log  main;
27         location / {
28             root   html;
29             index  index.html index.htm;
30         }
31         #error_page  404              /404.html;
32         # redirect server error pages to the static page /50x.html
33         #
34         error_page   500 502 503 504  /50x.html;
35         location = /50x.html {
36             root   html;
37         }
38         # proxy the PHP scripts to Apache listening on 127.0.0.1:80
39         #
40         #location ~ \.php$ {
41         #    proxy_pass   http://127.0.0.1;
42         #}
43         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
44         #
45         #location ~ \.php$ {
46         #    root           html;
47         #    fastcgi_pass   127.0.0.1:9000;
48         #    fastcgi_index  index.php;
49         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
50         #    include        fastcgi_params;
51         #}
52         # deny access to .htaccess files, if Apache's document root
53         # concurs with nginx's one
54         #
55         #location ~ /\.ht {
56         #    deny  all;
57         #}
58     }
59     # another virtual host using mix of IP-, name-, and port-based configuration
60     #
61     #server {
62     #    listen       8000;
63     #    listen       somename:8080;
64     #    server_name  somename  alias  another.alias;
65     #    location / {
66     #        root   html;
67     #        index  index.html index.htm;
68     #    }
69     #}
70     # HTTPS server
71     #
72     #server {
73     #    listen       443 ssl;
74     #    server_name  localhost;
75     #    ssl_certificate      cert.pem;
76     #    ssl_certificate_key  cert.key;
77     #    ssl_session_cache    shared:SSL:1m;
78     #    ssl_session_timeout  5m;
79     #    ssl_ciphers  HIGH:!aNULL:!MD5;
80     #    ssl_prefer_server_ciphers  on;
81     #    location / {
82     #        root   html;
83     #        index  index.html index.htm;
84     #    }
85     #}
86 }
View Code

 1、隱藏版本號

(1)查看信息:由下列語句看到了nginx的版本號,咱們的目的就是要隱藏它css

 1 [root@localhost ~]# curl -I http://127.0.0.1
 2 HTTP/1.1 200 OK
 3 Server: nginx/1.6.0                      #隱藏後此項變爲Server: nginx
 4 Date: Thu, 10 Nov 2016 12:51:37 GMT
 5 Content-Type: text/html
 6 Content-Length: 612
 7 Last-Modified: Thu, 10 Nov 2016 08:08:43 GMT
 8 Connection: keep-alive
 9 ETag: "58242b0b-264"
10 Accept-Ranges: bytes

(2)有兩種方式隱藏版本號:第一種是修改主配置文件;第二種是在編譯安裝以前就修改源碼;html

  第一種方法:在http { 下添加server_tokens    off;前端

http {
  server_tokens off;

若是php配置文件/usr/local/php5/etc/下的fastcgi的配置文件中配置了fastcgi_param SERVER_SOFTWARE選項,則編輯php-fpm配置文件,將fastcgi_param SERVER_SOFTWARE對應的值nginx-1.6.0修改成nginx;java

  第二種方法:nginx

  將下載完成Nginx源碼包解壓後,到源碼目錄/usr/src/nginx-1.6.0/src/core中找到nginx.h將版本信息修改後再編譯安裝apache

修改前windows

#define NGINX_VERSION      "1.6.0"
#define NGINX_VER          "nginx/" NGINX_VERSION

修改後(修改成IIS服務器版本,作假裝)瀏覽器

#define NGINX_VERSION      "1.1.1"
#define NGINX_VER          "IIS/" NGINX_VERSION

2、修改Nginx用戶和組  

  Nginx進程運行時須要用戶和組的支持,默認下使用nobody(全部人),爲了防止攻擊者拿到權限修改nginx,就要修改用戶和組。

  修改方法:在編譯安裝時指定用戶與組(--user=nginx --group=nginx),並修改主配置文件指定用戶和組,在第一行#user  nobody;修改成user  nginx  nginx;而後ps aux | grep nginx查看,master和worker兩個進程中的其中一個worker進程(接收用戶請求包的這個進程)的用戶變爲了nginx

3、配置Nginx網頁緩存時間

  當Nginx將網頁數據返回給客戶端後,可設置緩存的時間,以方便在往後進行相同內容的請求時直接返回,以免重複請求,加快了訪問的速度,通常針對靜態網頁進行設置,對動態網頁不用設置緩存時間,可在windows客戶端中使用抓包工具fiddler查看網頁緩存時間,配置後可在header裏找到cache參數獲得緩存時間

  設置方法:可根據特定須要在主配置文件的http段或者server段或者location段加入對特定內容的過時參數,例:

location ~ \.(gif|jpg|jpeg|png|bmp|ico)$  {
    expires   1d;   #緩存一天
  };

4、日誌切割

   隨着Nginx運行時間的增長,產生的日誌也會增長,爲了方便掌握Nginx的運行狀態,須要時刻關注Nginx日誌文件,太大的日誌文件對監控是一個大災難,因此要按期進行日誌文件的切割。Nginx沒有相似Apache的cronlog日誌分割處理的功能,可是,能夠經過Nginx的信號控制功能的腳原本實現日誌的自動切割,並將腳本加入到Linux的計劃任務中,讓腳本在天天的固定時間執行,好比天天晚上1點半執行腳本,這時咱們老的日誌文件就會被改名,而後生成一份新的日誌文件來承載新的數據,即可實現日誌分割功能。

日誌分割腳本

1 #!/bin/bash
2 # Filename: fenge.sh
3 d=$(date -d "-1 day" "+%Y%m%d")
4 logs_path="/var/log/nginx"                        #咱們的日誌文件默認不存放這裏,若是想把日誌存在這裏的話能夠這麼寫
5 pid_path="/usr/local/nginx/logs/nginx.pid"
6 [ -d $logs_path ] || mkdir -p $logs_path          #由於是邏輯或,因此判斷有這個目錄就無論,沒有的話執行||後面的語句繼續判斷,因而就建立了這個目錄
7 mv /usr/local/nginx/logs/access.log  ${logs_path}/test.com-access.log-$d          #把原來的日誌更名後放在了新目錄下
8 kill -USER1 $(cat $pid_path)                      #在/usr/local/nginx/logs/下產生一個新的access.log文件
9 find $logs_path -mtime +30 | xargs rm -rf         #檢測下日誌的修改時間是30天前的文件並刪除掉

加入計劃任務

~]#crontab -e
30  1 * * *  source /opt/fenge.sh

5、設置鏈接超時

   在企業網站中,爲了不同一個客戶長時間佔用鏈接,形成資源浪費,可設置相應的鏈接超時參數,實現控制鏈接訪問時間,可是這個鏈接超時時間還要根據實際狀況設定,好比一個大文件傳輸須要30分鐘,可是鏈接超時時間設定10分鐘,這樣這個文件就永遠不能傳送完。設置後可使用fiddler工具查看connection參數。

設置方法:

根據需求可在http {}段,server{}段,location{}段中設置參數,以在http{}段設置爲例:

1 修改
2 keepalive_timeout  65 ;      #超時時間65秒
3 keepalive_timeout  65  180 ; #這個意思是超時時間180秒,之後面的爲準
4 添加
5 Client_header_timeout   80;    #指定等待客戶端發送請求頭的超時時間,超時提示408錯誤
6 Client_body_timeout     80;    #設置請求體讀超時時間,超時提示408錯誤

6、更改Nginx運行進程數

  Nginx默認只有兩個進程,master和worker

配置方法:

  在全局配置中更改worker_processes參數,通常設爲CPU的個數或者核數,在高併發狀況下可設置爲CPU個數或者核數的2倍,好比2芯4核(2個物理cpu,每一個cpu4核)CPU,通常狀況給參數8,高併發就給16,運行進程數多一些,相應客戶端訪問請求時,Nginx就不會臨時啓動新的進程提供服務,減小了系統的開銷,提高了服務速度。使用cat  /proc/cpuinfo來查看cpu信息,其中processor核數,若是開虛擬機,這個數值是0,實際上是1核的意思,physical是cpu個數,使用cat  /proc/cpuinfo | grep -c "phycical"語句查看,若是顯示爲2,那麼咱們就叫作2路cpu另外使用uname  -r能夠看cpu版本。設置完能夠ps -aux | grep worker看一下,發現worker進程數變多。

  默認狀況,Nginx的多個進程可能更多的跑在一顆cpu上,能夠分配不一樣的進程給不一樣的cpu處理,充分利用硬件多核多cpu,例如在一臺4核物理服務器,可進行如下配置,將進程進行分配

全局配置中添加:

Worker_cpu_affinity  0001  0010  0100  1000

7、網頁壓縮

   基本上如今全部瀏覽器都支持解壓縮網頁的功能,當壓縮的網頁傳到瀏覽器,瀏覽器會識別壓縮文件,進行解壓縮,只有一小部分瀏覽器不支持解壓縮功能,所以配置網頁壓縮成爲可能。

  Nginx的ngx_http_gzip_module壓縮模塊提供了對文件內容壓縮的功能,容許nginx服務器將輸出內容在發送客戶端以前進行壓縮,以節約網站帶寬,提高用戶的訪問體驗,默認已經安裝,若是不想安裝,在預配置的時候還要添加without加這個模塊,具體卸載方式能夠./configure --help時仔細查看。

  可在配置文件中加入相應的壓縮功能參數對壓縮性能進行優化

配置方法:http{}段

1 gzip   on;               #開啓gzip壓縮輸出
2 gzip_min_length  1k;     #用於設置容許壓縮的網頁最小字節數,意思是低於1k的網頁就不須要壓縮了
3 gzip_buffers 4  16k;     #表示申請4個單位爲16k的內存做爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果,若是不設置的話,默認值是申請與原始數據大小相同的內存空間,這個功能的用法大體是這樣的,做爲管理員的你,觀察你的網頁壓縮文件都是多大的,而後對這個值進行除以4的處理,把結果寫在參數後面,這樣就能夠快速的相應客戶請求了
4 zip_http_version   1.1;  #用於設置識別http協議版本,默認是1.1,目前大部分瀏覽器已經支持gzip解壓,但處理最慢,也比較消耗服務器cpu資源
5 gzip_comp_level   2;     #用來指定gzip壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理速度最慢,使用默認便可
6 gzip_types    test/plain test/javascript test/css test/xml application/x-javascript application/xml application/xml+rss; #壓縮類型,是就對哪些網頁文檔啓用壓縮功能,也能夠寫多個,用空格隔開
7 gzip_vary    on;         #可讓前端的緩存服務器緩存通過gzip壓縮的頁面

 8、配置防盜鏈

1 location ~* \.(jpg|gif|png|swf)$  {
2 valid_referers none blocked *.test.com test.com;
3 if ($invalid_referer) {
4 rewrite ^/ http://www.test.com/img/error.gif;
5   #return 403;
6 }
7   }

配置說明:

valid_referers :設置信任的網站,即能引用相應圖片的網站

none :瀏覽器中referer爲空的狀況,就是直接在瀏覽器訪問圖片

blocked:referer不爲空的狀況,可是值被代理或防火牆刪除了,這些值不以http://或者https://開頭

後面的網址或者域名:referer中包含相關字符串的網址

if語句:若是連接的來源域名不在valid_referers所列出的列表中,$invalid_referer爲1,則執行後面的操做,即進行重寫或返回403頁面

9、fpm參數優化

  Nginx的PHP解析功能實現若是是交由FPM處理的,爲了提升PHP的處理速度,可對FPM模塊進行參數的調整,配置文件php-fpm.conf

FPM優化參數講解

pm : 使用哪一種方式啓動fpm進程,可使static和dynamic,前者將產生固定數量的fpm進程,後者將以動態的方式產生fpm進程

pm.max_children : 靜態方式下開啓的fpm進程數

pm.start_servers : 動態方式下初始的fpm進程數量

pm.min_spare_servers : 動態方式下最小的fpm空閒進程數

pm.max_spare_servers : 動態方式下最大的fpm空閒進程數

注意:以上動靜參數要根據服務器的內存與服務負載進行調整。

實際舉例:(只需修改參數便可,不需手動添加)

pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
相關文章
相關標籤/搜索