相信看過我以前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 }
(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
Nginx進程運行時須要用戶和組的支持,默認下使用nobody(全部人),爲了防止攻擊者拿到權限修改nginx,就要修改用戶和組。
修改方法:在編譯安裝時指定用戶與組(--user=nginx --group=nginx),並修改主配置文件指定用戶和組,在第一行#user nobody;修改成user nginx nginx;而後ps aux | grep nginx查看,master和worker兩個進程中的其中一個worker進程(接收用戶請求包的這個進程)的用戶變爲了nginx
當Nginx將網頁數據返回給客戶端後,可設置緩存的時間,以方便在往後進行相同內容的請求時直接返回,以免重複請求,加快了訪問的速度,通常針對靜態網頁進行設置,對動態網頁不用設置緩存時間,可在windows客戶端中使用抓包工具fiddler查看網頁緩存時間,配置後可在header裏找到cache參數獲得緩存時間
設置方法:可根據特定須要在主配置文件的http段或者server段或者location段加入對特定內容的過時參數,例:
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ { expires 1d; #緩存一天 };
隨着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
在企業網站中,爲了不同一個客戶長時間佔用鏈接,形成資源浪費,可設置相應的鏈接超時參數,實現控制鏈接訪問時間,可是這個鏈接超時時間還要根據實際狀況設定,好比一個大文件傳輸須要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錯誤
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
基本上如今全部瀏覽器都支持解壓縮網頁的功能,當壓縮的網頁傳到瀏覽器,瀏覽器會識別壓縮文件,進行解壓縮,只有一小部分瀏覽器不支持解壓縮功能,所以配置網頁壓縮成爲可能。
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壓縮的頁面
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頁面
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