如何優化Nginx的處理效能
Nginx是一個很強大的高效能Web和反向代理服務,它具有很多非常優越的特性,在連線高併發的情況下,Nginx是Apache服務不錯的替代品。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力在同類型的網頁伺服器中表現較好,因此國內知名大廠例如:淘寶,京東,百度,新浪,網易,騰訊等等都在使用Nginx網站。
在我們的日常工作學習中,我們會該如何去優化自己的Nginx伺服器?遇到以下問題我們該如何處理呢?
一、如何自定義返回給客戶端的404錯誤頁面
1)優化前,客戶端使用瀏覽器訪問不存在的頁面,會提示404檔案未找到
1.[root@client ~]# firefox http://192.168.4.5/xxxxx //訪問一個不存在的頁面
2)修改Nginx配置檔案,自定義報錯頁面
1.[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf 2... .. 3. charset utf-8; //僅在需要中文時修改該選項 4.error_page 404 /404.html; //自定義錯誤頁面 5... .. 6.[root@proxy ~]# vim /usr/local/nginx/html/404.html //生成錯誤頁面 7.Oops,No NO no page … 8. 9.[root@proxy ~]# nginx -s reload 10.#請先確保nginx是啟動狀態,否則執行該命令會報錯,報錯資訊如下: 11.#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
3)優化後,客戶端使用瀏覽器訪問不存在的頁面,會提示自己定義的40x.html頁面
1.[root@client ~]# firefox http://192.168.4.5/xxxxx //訪問一個不存在的頁面
二、如何檢視伺服器狀態資訊(非常重要的功能)
1)編譯安裝時使用--with-http_stub_status_module開啟狀態頁面模組
1.[root@proxy ~]# tar -zxvf nginx-1.12.2.tar.gz 2.[root@proxy ~]# cd nginx-1.12.2 3.[root@proxy nginx-1.12.2]# ./configure \ 4.> --with-http_ssl_module //開啟SSL加密功能 5.> --with-stream //開啟TCP/UDP代理模組 6.> --with-http_stub_status_module //開啟status狀態頁面 7.[root@proxy nginx-1.12.2]# make && make install //編譯並安裝
2)啟用Nginx服務並檢視監聽埠狀態
ss命令可以檢視系統中啟動的埠資訊,該命令常用選項如下:
-a顯示所有埠的資訊
-n以數字格式顯示埠號
-t顯示TCP連線的埠
-u顯示UDP連線的埠
-l顯示服務正在監聽的埠資訊,如httpd啟動後,會一直監聽80埠
-p顯示監聽埠的服務名稱是什麼(也就是程式名稱)
注意:在RHEL7系統中可以使用ss命令替代netstat命令,功能一樣,選項一樣。
1.[root@proxy ~]# /usr/local/nginx/sbin/nginx 2.[root@proxy ~]# netstat -anptu | grep nginx 3.tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10441/nginx 4.[root@proxy ~]# ss -anptu | grep nginx
3)修改Nginx配置檔案,定義狀態頁面
1.[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf 2.… … 3.location /status { 4. stub_status on; 5. #allow IP地址; 6. #deny IP地址; 7. } 8.… … 9.[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload 4)優化後,檢視狀態頁面資訊 1.[root@proxy ~]# curl http://192.168.4.5/status 2.Active connections: 1 3.server accepts handled requests 4. 10 10 3 5.Reading: 0 Writing: 1 Waiting: 0
Active connections:當前活動的連線數量。
Accepts:已經接受客戶端的連線總數量。
Handled:已經處理客戶端的連線總數量。
(一般與accepts一致,除非伺服器限制了連線數量)。
Requests:客戶端傳送的請求數量。
Reading:當前伺服器正在讀取客戶端請求頭的數量。
Writing:當前伺服器正在寫響應資訊的數量。
Waiting:當前多少客戶端在等待伺服器的響應。
三、優化Nginx併發量
1)優化前使用ab高併發測試
1.[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/ 2.Benchmarking 192.168.4.5 (be patient) 3.socket: Too many open files (24) //提示開啟檔案數量過多
2)修改Nginx配置檔案,增加併發量
1.[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf 2... .. 3.worker_processes 2; //與CPU核心數量一致 4.events { 5.worker_connections 65535; //每個worker最大併發連線數 6.} 7... .. 8.[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)優化Linux核心引數(最大檔案數量)
1.[root@proxy ~]# ulimit -a //檢視所有屬性值 2.[root@proxy ~]# ulimit -Hn 100000 //設定硬限制(臨時規則) 3.[root@proxy ~]# ulimit -Sn 100000 //設定軟限制(臨時規則) 4.[root@proxy ~]# vim /etc/security/limits.conf 5. .. .. 6.* soft nofile 100000 7.* hard nofile 100000 8. 9.#該配置檔案分4列,分別如下: 10.#使用者或組 硬限制或軟限制 需要限制的專案 限制的值
4)優化後測試伺服器併發量(因為客戶端沒調核心引數,所以在proxy測試)
1.[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/
四、優化Nginx資料包頭快取
1)優化前,使用指令碼測試長頭部請求是否能獲得響應
1.[root@proxy ~]# cat lnmp_soft/buffer.sh 2.#!/bin/bash 3.URL=http://192.168.4.5/index.html? 4.for i in {1..5000} 5.do 6. URL=${URL}v$i=$i 7.done 8.curl $URL //經過5000次迴圈後,生成一個長的URL位址列 9.[root@proxy ~]# ./buffer.sh 10... .. 11.<center><h1>414 Request-URI Too Large</h1></center> //提示頭部資訊過大
2)修改Nginx配置檔案,增加資料包頭部快取大小
1.[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf 2... .. 3.http { 4.client_header_buffer_size 1k; //預設請求包頭資訊的快取 5.large_client_header_buffers 4 4k; //大請求包頭部資訊的快取個數與容量 6... .. 7.} 8.[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
3)優化後,使用指令碼測試長頭部請求是否能獲得響應
1.[root@proxy ~]# cat buffer.sh 2.#!/bin/bash 3.URL=http://192.168.4.5/index.html? 4.for i in {1..5000} 5.do 6. URL=${URL}v$i=$i 7.done 8.curl $URL 9.[root@proxy ~]# ./buffer.sh
五、瀏覽器本地快取靜態資料
1)使用Firefox瀏覽器檢視快取
以Firefox瀏覽器為例,在Firefox位址列內輸入about:cache將顯示Firefox瀏覽器的快取資訊,如圖所示,點選List Cache Entries可以檢視詳細資訊。
2)清空firefox本地快取資料,如圖所示。
3)改Nginx配置檔案,定義對靜態頁面的快取時間
1.[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf 2.server { 3. listen 80; 4. server_name localhost; 5. location / { 6. root html; 7. index index.html index.htm; 8. } 9.location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { 10.expires 30d; //定義客戶端快取時間為30天 11.} 12.} 13.[root@proxy ~]# cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html 14.[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload 15.#請先確保nginx是啟動狀態,否則執行該命令會報錯,報錯資訊如下: 16.#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
4)優化後,使用Firefox瀏覽器訪問圖片,再次檢視快取資訊
1.[root@client ~]# firefox http://192.168.4.5/day.jpg
在firefox位址列內輸入about:cache,檢視本地快取資料,檢視是否有圖片以及過期時間是否正確。
Nginx在企業中的應用非常多,想要了解更多企業裡Nginx功能:
誠邀您來參加Nginx免費公開課