首頁 運維 Nginx Nginx快取Cache的設定方案及相關記憶體佔用問題怎麼解決

Nginx快取Cache的設定方案及相關記憶體佔用問題怎麼解決

May 23, 2023 pm 02:01 PM
nginx cache

nginx快取cache的5種方案
 1、傳統快取之一(404)
  這個辦法是把nginx的404錯誤導向到後端,然後用proxy_store把後端返回的頁面保存。
  設定:

  location / {
  root /home/html/;#主目录
  expires 1d;#网页的过期时间
  error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下
  }
  location /fetch/ {#404定向到这里
  internal;#指明这个目录不能在外部直接访问到
  expires 1d;#网页的过期时间
 alias /html/;
 proxy_store会将文件保存到这目录下
  proxy_pass//www.jb51.net/;#后端upstream地址,/fetch同时是一个代理
  proxy_set_header accept-encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
  proxy_store on;#指定nginx将代理返回的文件保存
  proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内

  }
登入後複製

  使用的時候還有要注意是nginx要有權限往/home/tmp和/home/html下有寫入檔案的權限,在linux下nginx一般會配置成nobody用戶運行,這樣這兩個目錄就要chown nobody,設成nobody用戶專用,當然也可以chmod 777,不過所有有經驗的系統管理員都會建議不要隨便使用777。
  2、傳統快取之二(!-e)
  原理和404跳轉基本上一致,但更簡潔一些:

  location / {
  root /home/html/;
  proxy_store on;
  proxy_set_header accept-encoding '';
  proxy_temp_path /home/tmp;
  if ( !-f $request_filename )
  {
  proxy_pass//www.jb51.net/;
  }
  }
登入後複製

  可以看到這個設定比404節約了不少程式碼,它是用!-f來判斷請求的檔案在檔案系統上存不存在,不存在就proxy_pass到後端,回傳同樣是用proxy_store儲存。
  兩種傳統快取都有著基本一樣的優點和缺點:
  缺點1:不支援帶參數的動態鏈接,比如read.php?id=1,因為nginx只保存檔名,所以這個鏈接只在檔案系統下儲存為read.php,這樣使用者存取read.php?id=2時會傳回不正確的結果。同時不支援//www.jb51.net/這種形式的首頁和二級目錄//www.jb51.net/download/,因為nginx非常老實,會將這樣的請求照連結寫入檔案系統,而這個連結顯然是一個目錄,所以保存失敗。這些情況都需要寫rewrite才能正確保存。
  缺點2:nginx內部沒有快取過期和清理的任何機制,這些快取的檔案會永久地保存在機器上,如果要快取的東西非常多,那就會撐暴整個硬碟空間。為此可以使用一個shell腳本定期清理,同時可以撰寫php等動態程式來做即時更新。
  缺點3:只能緩存200狀態碼,因此後端返回301/302/404等狀態碼都不會緩存,假如恰好有一個訪問量很大的偽靜態鏈接被刪除,那就會不停穿透導致後端承載不小壓力。
  缺點4:nginx不會自動選擇內存或硬碟作為存儲介質,一切由配置決定,當然在當前的作業系統裡都會有操作系統級的文件緩存機制,所以存在硬碟上也不需要過分擔心大並發讀取造成的io效能問題。
  nginx傳統快取的缺點也是它和squid等快取軟體的不同之特色,所以也可看作其優點。在生產應用中它常常用作和squid的搭檔,squid對於帶?的鏈接往往無法阻擋,而nginx能將其訪問攔住,例如:http://jb51.net/?和http://jb51.net /在squid上會被當做兩個鏈接,所以會造成兩次穿透;而nginx只會保存一次,無論鏈接變成http://jb51.net/?1還是http://jb51.net/? 123,均不能透過nginx緩存,從而有效地保護了後端主機。
  nginx會非常老實地將鏈接形式保存到文件系統中,這樣對於一個鏈接,可以很方便地查閱它在緩存機器上的緩存狀態和內容,也可以很方便地和別的文件管理器如rsync等搭配使用,它完完全全就是一個檔案系統結構。
  這兩種傳統緩存都可以在linux下將文件保存到/dev/shm裡,一般我也是這麼做的,這樣可以利用系統內存來做緩存,利用內存的話,清理過期內容速度就會快得多。使用/dev/shm/時除了要把tmp目錄也指向到/dev/shm這個分區外,如果有大量小檔案和目錄,還要修改一下這個記憶體分區的inode數量和最大容量:
 

 mount -o size=2500m -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
登入後複製

  上面的命令在一台有3g內存的機器上使用,因為/dev/shm默認最大內存是系統內存的一半就是1500m,這條命令將其調大成2500m,同時shm系統inode數量默認情況下可能是不夠用的,但有趣的是它可以隨意調節,這裡調節為480000保守了點,但也基本上夠用了。
  3、基於memcached的快取
  nginx對memcached有所支持,但是功能並不是特別之強,性能上還是非常之優秀。
 

 location /mem/ {
  if ( $uri ~ "^/mem/([0-9a-za-z_]*)$" )
  {
  set $memcached_key "$1";
  memcached_pass  192.168.1.2:11211;
  }
  expires 70;
  }
登入後複製

  这个配置会将http://jb51.net/mem/abc指明到memcached的abc这个key去取数据。
  nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。
  4、基于第三方插件ncache
  ncache是新浪兄弟开发的一个不错的项目,它利用nginx和memcached实现了一部分类似squid缓存的功能,我并没有使用这个插件的经验,可以参考:
  http://code.google.com/p/ncache/
  5、nginx新开发的proxy_cache功能
  从nginx-0.7.44版开始,nginx支持了类似squid较为正规的cache功能,目前还处于开发阶段,支持相当有限,这个缓存是把链接用md5编码hash后保存,所以它可以支持任意链接,同时也支持404/301/302这样的非200状态。
  配置:
  首先配置一个cache空间:

复制代码 代码如下:


  proxy_cache_path /path/to/cache levels=1:2 keys_zone=name:10m inactive=5m max_size=2m clean_time=1m;


  注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone为这个空间起个名字,10m指空间大小为10mb;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓存;clean_time指定一分钟清理一次缓存。

  location / {
  proxy_pass//www.jb51.net/;
  proxy_cache name;#使用name这个keys_zone
  proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
  proxy_cache_valid 301 1d;#301状态码保存一天
  proxy_cache_valid any 1m;#其它的保存一分钟
  }
登入後複製

  ps:支持cache的0.7.44到0.7.51这几个版本的稳定性均有问题,访问有些链接会出现错误,所以这几个版本最好不要在生产环境中使用。nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新,如果在配置里没有使用到0.7的一些新标签新功能,也可以使用0.6.36版。

nginx缓存的内存占用问题的一般解决方法
1、前些日子某服务被刷,每分钟达到上几百万请求;当时采用了nginx cache来解决的;但是因为某服务不能缓存太久,当时设置了5s,那么带来的问题就是产生大量小文件,而且很快就删除了。

2、通过

free -m
登入後複製

Nginx快取Cache的設定方案及相關記憶體佔用問題怎麼解決

会发现used是27g;但是通过top查看进程占的内存并没有那么多

Nginx快取Cache的設定方案及相關記憶體佔用問題怎麼解決

那内存去哪了?

3、通过查阅资料会发现(cat /proc/meminfo)
slab: 22464312 kb
sreclaimable: 16474128 kb (这些是内核保持的但是可以释放的inode和dentry的缓存)
sunreclaim: 5990184 kb

4、这些内存为什么会不自动清理呢?
某机房机器系统版本:linux 2.6.32-431.el6.x86_64 #1 smp fri nov 22 03:15:09 utc 2013 x86_64 x86_64 x86_64 gnu/linux(正常,没出现内存快到100%的情况)
某机房机器系统版本:linux 2.6.32-279.el6.x86_64 #1 smp fri jun 22 12:19:21 utc 2012 x86_64 x86_64 x86_64 gnu/linux (不释放)

5、通过设置如下参数来设置内存阀值

sysctl -w vm.extra_free_kbytes=6436787
sysctl -w vm.vfs_cache_pressure=10000
登入後複製

以上是Nginx快取Cache的設定方案及相關記憶體佔用問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

docker容器名稱怎麼查 docker容器名稱怎麼查 Apr 15, 2025 pm 12:21 PM

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

nginx在windows中怎麼配置 nginx在windows中怎麼配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安裝 Nginx 並創建虛擬主機配置。修改主配置文件並包含虛擬主機配置。啟動或重新加載 Nginx。測試配置並查看網站。選擇性啟用 SSL 並配置 SSL 證書。選擇性設置防火牆允許 80 和 443 端口流量。

怎麼查看nginx是否啟動 怎麼查看nginx是否啟動 Apr 14, 2025 pm 01:03 PM

確認 Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

nginx怎麼配置雲服務器域名 nginx怎麼配置雲服務器域名 Apr 14, 2025 pm 12:18 PM

在雲服務器上配置 Nginx 域名的方法:創建 A 記錄,指向雲服務器的公共 IP 地址。在 Nginx 配置文件中添加虛擬主機塊,指定偵聽端口、域名和網站根目錄。重啟 Nginx 以應用更改。訪問域名測試配置。其他注意事項:安裝 SSL 證書啟用 HTTPS、確保防火牆允許 80 端口流量、等待 DNS 解析生效。

docker怎麼啟動容器 docker怎麼啟動容器 Apr 15, 2025 pm 12:27 PM

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

nginx怎麼查版本 nginx怎麼查版本 Apr 14, 2025 am 11:57 AM

可以查詢 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打開 Nginx 錯誤頁,查看頁面的標題。

docker怎麼創建容器 docker怎麼創建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

怎麼啟動nginx服務器 怎麼啟動nginx服務器 Apr 14, 2025 pm 12:27 PM

啟動 Nginx 服務器需要按照不同操作系統採取不同的步驟:Linux/Unix 系統:安裝 Nginx 軟件包(例如使用 apt-get 或 yum)。使用 systemctl 啟動 Nginx 服務(例如 sudo systemctl start nginx)。 Windows 系統:下載並安裝 Windows 二進製文件。使用 nginx.exe 可執行文件啟動 Nginx(例如 nginx.exe -c conf\nginx.conf)。無論使用哪種操作系統,您都可以通過訪問服務器 IP

See all articles