目錄
一、nginx的日志分割
二、nginx性能優化之啟用epoll模型
三、nginx性能優化之設置worker進程數并與cpu進行綁核
四、nginx性能優化之調整worker的最大打開文件數和最大處理連接請求數量
五、nginx性能優化之啟用gzip壓縮,提高傳輸,減少帶寬
六、nginx性能優化之設置keepalive超時時間以及最大請求連接數
七、nginx性能優化之設置頁面緩存時間
八、nginx安全之隱藏版本號
九、nginx安全之修改進程運行的屬主和屬組
十、nginx安全之防盜鏈設置,避免資源盜用以及節省帶寬
十一、fpm參數優化
一、nginx的日志分割
nginx的日志是生成在安裝目錄下/usr/local/nginx/logs中,大量的日志如果不做良好的管理,長此以往會造成日志文件過大且日志分析困難
?
編寫日志分割的腳本
#!/bin/bash
#this is used for cutting nginx logs
##定義日志收集的目錄
newlogpath=/var/log/nginx
##定義區分日志的標識,采用時間標記,計劃每天一次日志分割
lastday=`date -d "-1 day" +%Y%m%d`
##找到應用程序生成日志的源路徑
oldlogpath=/usr/local/nginx/logs
##定義應用程序的pid號 也就是nginx的master進程號
pid=`cat ${oldlogpath}/nginx.pid`##先判斷收集日志的目錄是否存在,沒有則創建,有則進行下一步
[ -d $newlogpath ]||mkdir $newlogpath##使用mv命令進行日志分割,將生成的訪問日志和錯誤日志都移動到收集日志的目錄下,并添加時間標記
mv $oldlogpath/access.log $newlogpath/access.log.$lastday
mv $oldlogpath/error.log $newlogpath/error.log.$lastday##重新生成新的日志,便于nginx記錄后續訪問事務
kill -USR1 $pid##刪除大于30天的日志,釋放磁盤空間
find $newlogpath -mtime +30 -exec rm -rf {} \;chmod +x ~/nginx_log.sh
crontab -e
0 0 * * * ~/nginx_log.sh
二、nginx性能優化之啟用epoll模型
epoll模型使用的是IO多路復用技術,這是一種基于事件處理的模型,可以實現很高的并發量,而且內存占用小。處理請求靈活效率高。
在event模塊添加
user epoll;
底層采用epoll模型,多路復用,可以實現很高的并發量,而且內存占用小。
三、nginx性能優化之設置worker進程數并與cpu進行綁核
為什么要綁核?
##默認情況,Nginx的多個進程可能跑在一個CPU上,如果進行綁核可以分配不同的進程給不同的CPU處理,充分利用硬件多核多CPU。
worker_processes auto;
worker_cpu_affinity 0001 0010 0100 1000;
##默認情況,Nginx的多個進程可能跑在一個CPU上,如果進行綁核可以分配不同的進程給不同的CPU處理,充分利用硬件多核多CPU
?#將每個worker子進程與特定CPU物理核心綁定,提升cpu利用率,進而提升性能。避免同一個worker子進程在不同的CPU核心上切換或者多個進程跑在一個CPU上,緩存失效,降低性能。
四、nginx性能優化之調整worker的最大打開文件數和最大處理連接請求數量
?除了調整應用程序? 還需要調整系統內核的限制
在全局模塊在配置
worker_rlimit_nofile 20480;
在event模塊配置最大連接數量
worker_connections 20480;##記得同時修改內核參數,數量是根據需求自定義的
[root@localhost ~]#vim /etc/security/limits.conf
* soft nofile 81920
* hard nofile 81920
五、nginx性能優化之啟用gzip壓縮,提高傳輸,減少帶寬
Nginx的ngx_http_gzip_module壓縮模塊提供對文件內容壓縮的功能
允許Nginx服務器將輸出內容在發送客戶端之前進行壓縮,以節約網站帶寬,提升用戶的訪問體驗,默認已經安裝,可在配置文件中加入相應的壓縮功能參數對壓縮性能進行優化
修改/usr/local/nginx/conf/nginx.conf配置文件
http {
...... gzip on; #取消注釋,開啟gzip壓縮功能gzip_min_length 1k; #最小壓縮文件大小gzip_buffers 4 64k; #壓縮緩沖區,大小為4個64k緩沖區gzip_http_version 1.1; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)gzip_comp_level 6; #壓縮比率gzip_vary on; #支持前端緩存服務器存儲壓縮頁面gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json; #壓縮類型,表示哪些網頁文檔啟用壓縮功能
......
}
?favicon.ico表示的是網站的小圖標,這里是沒有的,與nginx的配置沒有關系
六、nginx性能優化之設置keepalive超時時間以及最大請求連接數
HTTP有一個KeepAlive模式,它告訴web服務器在處理完一個請求后保持這個TCP連接的打開狀態。若接收到來自同一客戶端的其它請求,服務端會利用這個未被關閉的連接,而不需要再建立一個連接。KeepAlive 在一段時間內保持打開狀態,它們會在這段時間內占用資源。占用過多就會影響性能。
keepalive_timeout
指定KeepAlive的超時時間(timeout)。
指定一個長連接最多可以保持多長時間,服務器將會在這個時間后關閉連接。
Nginx的默認值是65秒,有些瀏覽器最多只保持 60 秒,所以可以設定為 60 秒。
若將它設置為0,就禁止了keepalive 連接。第二個參數(可選的)指定了在響應頭Keep-Alive:timeout=time中的time值。
這個頭能夠讓一些瀏覽器主動關閉連接,這樣服務器就不必去關閉連接了。
沒有這個參數,Nginx 不會發送 Keep-Alive 響應頭。client_header_timeout
客戶端向服務端發送一個完整的 request header 的超時時間。
如果客戶端在指定時間內沒有發送一個完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。client_body_timeout
指定客戶端與服務端建立連接后發送 request body 的超時時間。
如果客戶端在指定時間內沒有發送任何內容,Nginx 返回 HTTP 408(Request Timed Out)。
##ip數據包在傳輸的時候會進行分片,會讓數據包分開傳輸 等到接收端接收后,會重新組合數據包,也就是說數據分片以后到達的時間是不一樣的。這里就是限制整個數據包完整傳輸的最大時間限制
?測試一下:
?一般客戶端小于等于服務端時間,因為大量的timewait會占用tcp連接資源,想要timewait在客戶端產生,這樣可以避免浪費服務端的tcp連接請求資源
##解決方式
服務器不要主動關閉,讓客戶端去主動關閉,那么timewait狀態就在客戶端
另一種是修改內核參數,去收回timewait資源,以及允許timeout的socket可以重用
七、nginx性能優化之設置頁面緩存時間
設置緩存的時間,以方便客戶在后面訪問相同的數據請求,避免重復的請求,加快數據訪問,可以減少服務器的帶寬請求,一般只對靜態資源做緩存時間設置,動態頁面不設置緩存,靜態頁面會在nginx服務器中定時更新,但是動態頁面是數據庫實時更新;
##設置靜態資源在客戶端的緩存時間 location ~ \.(jpg|gif|mp3|mp4)$ {root html/static;expires 1h; #expires的意思是到期}緩存時間也是可以在三個地方設置,分別是http server location
Expires就是用于設置緩存時間,支持天d 小時h 分鐘m 秒s
?緩存時間也是可以在三個地方設置,分別是http server location
八、nginx安全之隱藏版本號
第一種:直接使用server_tokens off關閉版本號
##在server模塊中添加 server_tokens off;
方法二:修改nginx的源代碼的nginx.h文件,這些文件一般都是函數等等
?
?然后重新編譯安裝后測試
##修改nginx的源代碼 進行重新編譯安裝
vim /opt/nginx-1.24.0/src/core/nginx.h12 #define nginx_version 102400013 #define NGINX_VERSION "2.36.7"14 #define NGINX_VER "Apache/" NGINX_VERSION修改完以后 重新編譯安裝
nginx -V./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
nake -j4
make install
cd /usr/local/nginx/conf/
vim nginx.conf
#server_tokens off;##注釋這個模塊,讓其默認開啟
nginx -t
systemctl restart nginx
方法三:使用模塊插件,實現響應請求頭直接自定義刪除
?需要下載模塊插件 然后進行重新配置編譯安裝,再去修改配置文件
./configure --add-module='模塊路徑'?
下載一個模塊插件 可以自定義請求頭的內容
headers-more-nginx-module-0.34.tar.gz 插件包,解壓到一個目錄,編譯安裝 nginx, ./configure --add-module='模塊路徑' && make && make install
##如./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --add-module='/opt/headers-more-nginx-module-0.34' && make && make install修改 nginx.conf 文件,在 http 配置塊加 more_clear_headers '響應頭字段';
##在http模塊下添加more_clear_headers "Server"; ##注意大小寫
表示完全隱藏該響應的請求頭即可去除 nginx 響應頭任何想去除的字段
九、nginx安全之修改進程運行的屬主和屬組
主進程由root創建,子進程由nginx創建
這個一般在配置模塊的時候就已經設置了
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module還有一種就是修改配置文件中的user
?
十、nginx安全之防盜鏈設置,避免資源盜用以及節省帶寬
先準備測試環境
主服務器192.168.20.30,這是域名解析為www.accp.com
關于accp的測試文件
[root@localhost html]#cat accp.html
<head></head>
<body>
<h1>I am accp</h1>
<img src="test.jpg"> ##引用自己站點的圖片
</body>
?另一臺nginx服務器作為想要盜用的web服務器,先部署環境
這臺服務器的ip是192.168.20.8,對應域名是www.benet.com
[root@localhost html]#cat daotu.html
<head></head>
<body>
<h1>this is a daotu</h1>
<img src="http://www.accp.com/test.jpg"> ##盜圖
</body>
現在想要實現不允許盜圖
使用rewrite模塊 重寫url 來實現防盜鏈
主服務器accp的配置,設置防盜鏈:location ~ \.(jpg|gif|mp3|mp4)$ {root html/static;valid_referers none blocked www.accp.com *.accp.com;if ($invalid_referer) {rewrite ^/ http://www.accp.com/static/error.png;}}
同時需要準備一張error.png圖片放在html/static中
同時,該圖片的格式png 不能出現在location的匹配中,否則會死循環,浪費資源
~* \.(jpg|gif|swf)$ :這段正則表達式表示匹配不區分大小寫,以.jpg 或.gif 或.swf 結尾的文件;
valid_referers :設置信任的網站,可以正常使用圖片;
none:允許沒有http_refer的請求訪問資源(根據Referer的定義,它的作用是指示一個請求是從哪里鏈接過來的,如果直接在瀏覽器的地址欄中輸入一個資源的URL地址,那么這種請求是不會包含 Referer 字段的)
blocked:允許不是http://開頭的,不帶協議的請求訪問資源;
*.kgc.com:只允許來自指定域名的請求訪問資源,如 http://www.kgc.comif語句:如果鏈接的來源域名不在valid_referers所列出的列表中,$invalid_referer為true,則執行后面的操作,即進行重寫或返回 403 頁面。
關于valid_referer?
如果是
http://www.accp.com/zip.html www.accp.com/zip.html ---> www.accp.com/test.jpg
那么:$valid_referer 就是www.accp.com/zip.html
如果是
http://www.accp.com/test.jpg --->直接訪問
那么:$valid_referer 就是none 空
如果是
http://www.benet.com/daotu.html www.benet.com/daotu.html ---> www.accp.com/test.jpg
那么:$valid_referer 就是www.benet.com/daotu.html?
進行結果驗證
?
關于電腦真機中如何設置ip與域名的映射關系?
文件修改的時候進入屬性——安全——編輯(指定當前用戶)有寫入的權限,及時修改 及時撤回!!!
十一、fpm參數優化
Nginx的PHP解析功能實現如果是交由FPM處理的,為了提高PHP的處理速度,可對FPM模塊進行參數的調整。根據服務器的內存與服務負載,調整FPM模塊參數
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pidvim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic #fpm進程啟動方式,動態的
--107行--
pm.max_children=20 #fpm進程啟動的最大進程數
--112行--
pm.start_servers = 5 #動態方式下啟動時默認開啟的進程數,在最小和最大之間
--117行--
pm.min_spare_servers = 2 #動態方式下最小空閑進程數
--122行--
pm.max_spare_servers = 8 #動態方式下最大空閑進程數kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #重啟php-fpm
netstat -anpt | grep 9000