Nginx的性能優化、安全以及防盜鏈配置

目錄

一、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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210758.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

字節iconpark基于vue使用

1.安裝 npm i icon-park/vue 2.導入 說明&#xff1a;導入并在main.js使用。 import { install } from icon-park/vue/es/all; import icon-park/vue/styles/index.css; Vue.use(install) 3.打開官網 ByteDance IconPark 4.復制 說明&#xff1a;點擊官方圖標庫&#xff0c…

Java-JDBC操作MySQL

Java-JDBC操作MySQL 文章目錄 Java-JDBC操作MySQL一、Java-JDBC-MySQL的關系二、創建連接三、登錄MySQL四、操作數據庫1、返回型操作2、無返回型操作 練習題目及完整代碼 一、Java-JDBC-MySQL的關系 #mermaid-svg-B7qjXrosQaCOwRos {font-family:"trebuchet ms",verd…

國產Type-C PD芯片—接口快充取電芯片

常用USB PDTYPE-C受電端&#xff0c;即設備端協議IC芯片&#xff08;PD Sink&#xff0c;也叫PD誘騙芯片&#xff09;&#xff0c;誘導取電芯片。 產品介紹 LDR6328: ◇ 采用 SOP-8 封裝 ◇ 兼容 USB PD 3.0 規范&#xff0c;支持 USB PD 2.0 ◇ 兼容 QC 3.0 規范&#x…

TailwindCSS 支持文本文字超長溢出截斷、文字文本省略號

前言 文本文字超長截斷并自動補充省略號&#xff0c;這是前端日常開發工作中常用的樣式設置能力&#xff0c;文字超長截斷主要分為單行超長截斷和多行超長截斷。本文通過介紹基本CSS樣式、tailwindcss 類設置兩種基礎方式來實現文字超長截斷。 TailwindCSS 設置 單行文字超長…

WPF仿網易云搭建筆記(2):組件化開發

文章目錄 前言專欄和Gitee倉庫依賴屬性實戰&#xff1a;縮小&#xff0c;全屏&#xff0c;關閉按鈕依賴屬性操作封裝主窗口傳遞this本身給TitleView標題控件主要代碼MainWindow.xmalMainWindow.cs依賴屬性方法封裝TitleView.csTitleViewModelTitleViewModel實現效果 前言 這次…

基于以太坊的智能合約開發Solidity(函數繼承篇)

參考教程&#xff1a;【實戰篇】1、函數重載_嗶哩嗶哩_bilibili 1、函數重載&#xff1a; pragma solidity ^0.5.17;contract overLoadTest {//不帶參數function test() public{}//帶一個參數function test(address account) public{}//參數類型不同&#xff0c;雖然uint160可…

發送、接收消息,界面不及時刷新

發送、接收消息后 UI 沒展示&#xff0c;不及時刷新&#xff0c;大概率 是 SDK 的 UI 刷新功能被干擾&#xff0c;參考下面排查&#xff1a; 檢查 initWithAppkey 和 connectWithToken 使用的是否是 IMKit 核心類 RCIM 的方法&#xff0c;如果不是&#xff0c;請換成 RCIM 的。…

【刷題】位運算

2 n 2^n 2n 1<<n判斷某一位是否為1 s&1<<k將上面兩個組合&#xff0c;可以得到判斷一個集合中哪些內容包含&#xff0c;遍歷所有情況。 100140. 關閉分部的可行集合數目 一個公司在全國有 n 個分部&#xff0c;它們之間有的有道路連接。一開始&#xff0c;…

CentOS 7 離線安裝達夢數據庫8.0

前期準備工作 確認操作系統的版本和數據庫的版本是否一致 ## 查看系統版本&#xff1a;cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)關閉防火墻和Selinux # 查看selinux是不是disabled / enforce cat /etc/selinux/config## 查看防火墻狀態 firewall-cmd …

數據結構之歸并排序及排序總結

目錄 歸并排序 歸并排序的時間復雜度 排序的穩定性 排序總結 歸并排序 歸并排序大家只需要掌握其遞歸方法即可&#xff0c;非遞歸方法由于在某些特殊場景下邊界難控制&#xff0c;我們一般很少使用非遞歸實現歸并排序。那么歸并排序的遞歸方法我們究竟是怎樣實現呢&#xff…

PHP醫院手術麻醉系統源碼,laravel、vue2 、mysql技術開發,自主知識產權,二開快捷

醫院手術麻醉系統全套源碼&#xff0c;有演示&#xff0c;自主知識產權 技術架構&#xff1a;PHP、 js 、mysql、laravel、vue2 手術麻醉臨床信息管理系統是數字化手段應用于手術過程中的重要組成部分&#xff0c;用數字形式獲取并存儲手術相關信息&#xff0c;既便捷又高效。…

每日一練2023.12.10—— 倒數第N個字符串【PTA】

題目鏈接&#xff1a;L1-050 倒數第N個字符串 題目要求&#xff1a; 給定一個完全由小寫英文字母組成的字符串等差遞增序列&#xff0c;該序列中的每個字符串的長度固定為 L&#xff0c;從 L 個 a 開始&#xff0c;以 1 為步長遞增。例如當 L 為 3 時&#xff0c;序列為 { a…

Qt Creator設置IDE的字體、顏色、主題樣式

Qt是一款開源的、跨平臺的C開發框架&#xff0c;支持Windows、Linux、Mac系統&#xff0c;從1995發布第一版以來&#xff0c;發展迅猛&#xff0c;最開始是用于Nokia手機的Symbian(塞班)系統和應用程序開發&#xff0c;現在是用于嵌入式軟件、桌面軟件(比如WPS、VirtualBox)、A…

【圖論筆記】克魯斯卡爾算法(Kruskal)求最小生成樹

【圖論筆記】克魯斯卡爾算法&#xff08;Kruskal&#xff09;求最小生成樹 適用于 克魯斯卡爾適合用來求邊比較稀疏的圖的最小生成樹 簡記&#xff1a; 將邊按照升序排序&#xff0c;選取n-1條邊&#xff0c;連通n個頂點。 添加一條邊的時候&#xff0c;如何判斷能不能添加…

Python實現PDF-Excel

輕松解決PDF格式轉Excel&#xff08;使用python實現&#xff09; 實現思路&#xff1a; 要將PDF轉換為Excel&#xff0c;可以使用以下步驟&#xff1a; 解析PDF內容&#xff1a;首先&#xff0c;需要使用Python中的第三方庫&#xff08;如PyPDF2、pdfminer等&#xff09;來解…

西南科技大學C++程序設計實驗十二(文件流操作)

一、實驗目的 1. 熟悉文件的基本操作; 2. 在類中添加打開文件、保存文件、讀取文件等處理函數; 二、實驗任務 1. 分析完善程序:主函數創建一個文件對象,每次打開文件,在其尾部添加數據。如果文件不存在,則新建該文件。請將空白處需要完善的功能補充完整。 #include …

mybatis-config.xml的配置

1&#xff1a;MyBatis 的常規配置文件 mybatis-config.xml 包含了對 MyBatis 框架的全局配置&#xff0c;下面是一個常見的示例&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD…

Java代碼重構技巧:提高可維護性和可擴展性

引言&#xff1a; 在軟件開發過程中&#xff0c;代碼重構是一項非常重要的任務。通過對代碼進行重構&#xff0c;可以提高代碼的可維護性和可擴展性&#xff0c;減少代碼的復雜度&#xff0c;增加代碼的可讀性和可測試性。本文將介紹一些常用的Java代碼重構技巧&#xff0c;幫助…

HTML中表格的語法及使用(詳解)

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹HTML中表格的語法及詳細使用以及部分理論知識 &#x1f349;歡迎點贊 &#x1f44d; 收藏 ?留言評論 &#x1f4dd;私信必回喲&#x1f601; &#x1f349;博主收將持續更新學習記錄獲&#xff0c;友友們有任何問題可以在評論區留…

Java集合框架定義以及整體結構

目錄 一、Java集合框架1.1 什么是java集合框架1.2 集合與數組 二、集合框架具體內容2.1 整體框架2.2 遺留類和遺留接口1.3 集合框架設計特點 參考資料 一、Java集合框架 1.1 什么是java集合框架 Java集合框架&#xff08;Java Collections Framework&#xff09;是Java平臺提…