如何大幅提高 Django 网站加载速度
來源:進擊的coder
之前做了個爬蟲案例平臺,https://scrape.center/,具體文章在?原創丨發布一個爬蟲案例平臺,幫助爬蟲初學者進行練手。
平臺內我設計了非常多的網站,有服務端渲染、客戶端渲染等,其中服務端渲染的頁面大家可能爬取的頻率比較高,時不時就會遇到被爬掛的情況。
比如這個網站:https://ssr1.scrape.center/,當訪問頻率高的時候,甚至我后端開了 20 個 Pod 也承受不來,大家并發量有點猛啊。
這個后端是用 Django 寫的,而且這個網站的數據不怎么更新,索性再加個 Cache 吧,在 Django 中最高效的 Cache 當屬 Memcached 了,本篇文章就來簡單記錄下 Django 對接 Memcached 的過程。
官方資料
千說萬說都不如官方文檔來的直接,首推官方文檔:https://docs.djangoproject.com/en/3.1/topics/cache/。
然后后面就是我簡單的筆記了。
依賴庫
首先需要安裝個依賴庫,這里用的是 python-memcached,可以使用 pip 來安裝:
pip3?install?python-memcached由于我使用的是 Docker,所以就把它寫到 requirements.txt 里面了。
配置
另外還需要在 settings.py 里面配置一下,內容如下:
CACHES?=?{'default':?{'BACKEND':?'django.core.cache.backends.memcached.MemcachedCache','LOCATION':?'cache:11211',} }這里 LOCATION 是需要一個 Memcached 服務,運行在 11211 上面。
另外還需要開啟兩個中間件:
MIDDLEWARE?=?['django.middleware.cache.UpdateCacheMiddleware',...'django.middleware.cache.FetchFromCacheMiddleware', ]這里要加兩個中間件,一個在最前面,一個在最后面,順序不能換,中間的是之前配置的其他中間件。
Docker-Compose
OK,接下來就是使用 Docker 啟動了,這里 Docker-Compose 里面就需要增加一個 Memcache 服務,配置如下:
version:?'3' services:ssr1-backend:container_name:?'scrape-ssr1-backend'restart:?alwaysbuild:?./backendimage:?'scrape-ssr1-backend'ports:-?'8000:8000'environment:...cache:image:?memcachedports:-?'11211:11211'entrypoint:-?memcached-?-m?64這里主要是 cache 的配置,需要加上端口映射和入口參數,這里內存大小設置為 64M。
Kubernetes
我的部署使用的是 Kubernetes,所以對應的 yaml 文件也需要更改了,配置更改如下:
apiVersion:?v1 items:-?apiVersion:?v1kind:?Servicemetadata:annotations:kompose.cmd:?kompose?-f?docker-compose.yml?-o?kubernetes.yml?convertkompose.version:?1.20.0?()creationTimestamp:?nulllabels:io.kompose.service:?ssr1-backendname:?ssr1-backendnamespace:?scrapespec:ports:-?name:?"8000"port:?8000targetPort:?8000selector:io.kompose.service:?ssr1-backendstatus:loadBalancer:?{?}-?apiVersion:?apps/v1kind:?Deploymentmetadata:annotations:kompose.cmd:?kompose?-f?docker-compose.yml?-o?kubernetes.yml?convertkompose.version:?1.20.0?()creationTimestamp:?nulllabels:io.kompose.service:?ssr1-backendname:?ssr1-backendnamespace:?scrapespec:replicas:?20revisionHistoryLimit:?1strategy:?{?}selector:matchLabels:io.kompose.service:?ssr1-backendtemplate:metadata:annotations:kompose.cmd:?kompose?-f?docker-compose.yml?-o?kubernetes.yml?convertkompose.version:?1.20.0?()creationTimestamp:?nulllabels:io.kompose.service:?ssr1-backendspec:containers:-?env:-?name:?APP_ENVvalue:?production-?name:?MEMCACHED_HOSTvalue:?ssr1-cacheimage:?germey/scrape-ssr1-backend:${TAG}name:?scrape-ssr1-backendports:-?containerPort:?8000resources:?{?}restartPolicy:?Alwaysstatus:?{?}-?apiVersion:?v1kind:?Servicemetadata:annotations:kompose.cmd:?kompose?-f?docker-compose.yml?-o?kubernetes.yml?convertkompose.version:?1.20.0?()creationTimestamp:?nulllabels:io.kompose.service:?ssr1-cachename:?ssr1-cachenamespace:?scrapespec:ports:-?name:?"11211"port:?11211targetPort:?11211selector:io.kompose.service:?ssr1-cachestatus:loadBalancer:?{?}-?apiVersion:?apps/v1kind:?Deploymentmetadata:annotations:kompose.cmd:?kompose?-f?docker-compose.yml?-o?kubernetes.yml?convertkompose.version:?1.20.0?()creationTimestamp:?nulllabels:io.kompose.service:?ssr1-cachename:?ssr1-cachenamespace:?scrapespec:replicas:?1revisionHistoryLimit:?1strategy:?{?}selector:matchLabels:io.kompose.service:?ssr1-cachetemplate:metadata:annotations:kompose.cmd:?kompose?-f?docker-compose.yml?-o?kubernetes.yml?convertkompose.version:?1.20.0?()creationTimestamp:?nulllabels:io.kompose.service:?ssr1-cachespec:containers:-?image:?memcachedname:?scrape-ssr1-cacheports:-?containerPort:?11211resources:?{?}restartPolicy:?Alwaysstatus:?{?} kind:?List metadata:?{?} --- apiVersion:?networking.k8s.io/v1beta1 kind:?Ingress metadata:name:?ingress-ssr1namespace:?scrapeannotations:nginx.ingress.kubernetes.io/ssl-redirect:?"true"nginx.ingress.kubernetes.io/rewrite-target:?/ spec:tls:-?hosts:-?ssr1.scrape.centersecretName:?tls-wildcard-scrape-centerrules:-?host:?ssr1.scrape.centerhttp:paths:-?backend:serviceName:?ssr1-backendservicePort:?8000path:?/注意這里我給 Django 后端增加了一個環境變量,叫做 MEMCACHED_HOST,所以在 Django 中,我們可以通過環境變量來讀取 Memcached 的 Host,當然端口也可以類似設置,不過端口我就直接寫死了,配置更改如下:
CACHES?=?{'default':?{'BACKEND':?'django.core.cache.backends.memcached.MemcachedCache','LOCATION':?os.getenv('MEMCACHED_HOST')?+?':11211',} }OK,這樣改完之后重新部署就好了。
部署之后我直接將 Pod 降到了 2 個,第一次訪問速度可能稍慢,但是一旦加載出來之后,該頁面就會被緩存下來,后續訪問速度就只有兩三百毫秒了,測速如下:
簡單測速結果網址在這:https://ssr1.scrape.center/,大家可以來爬爬試試吧。
作者:崔慶才
排版:崔慶才
-------?End -------
點右下角「在看」與轉發
是對我們最大的支持
特別推薦下公眾號「價值前瞻」,分享讀書、成長和投資思考,歡迎來串門。
回復「書單」?可獲取精選書單一份,包括《如何閱讀 一本書》、《巴菲特之道》、《金字塔原理》、高瓴張磊的《價值》、《投資最重要的事》、《戴維斯王朝》等書籍的筆記內容或思維導圖
價 值 前 瞻
做一個有遠見的人
掃碼關注,查看更多內容
總結
以上是生活随笔為你收集整理的如何大幅提高 Django 网站加载速度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM垃圾清除算法
- 下一篇: /项目3-分数类中的运算符重载