如何大幅提高 Django 网站加载速度
來(lái)源:進(jìn)擊的coder
之前做了個(gè)爬蟲(chóng)案例平臺(tái),https://scrape.center/,具體文章在?原創(chuàng)丨發(fā)布一個(gè)爬蟲(chóng)案例平臺(tái),幫助爬蟲(chóng)初學(xué)者進(jìn)行練手。
平臺(tái)內(nèi)我設(shè)計(jì)了非常多的網(wǎng)站,有服務(wù)端渲染、客戶端渲染等,其中服務(wù)端渲染的頁(yè)面大家可能爬取的頻率比較高,時(shí)不時(shí)就會(huì)遇到被爬掛的情況。
比如這個(gè)網(wǎng)站:https://ssr1.scrape.center/,當(dāng)訪問(wèn)頻率高的時(shí)候,甚至我后端開(kāi)了 20 個(gè) Pod 也承受不來(lái),大家并發(fā)量有點(diǎn)猛啊。
這個(gè)后端是用 Django 寫(xiě)的,而且這個(gè)網(wǎng)站的數(shù)據(jù)不怎么更新,索性再加個(gè) Cache 吧,在 Django 中最高效的 Cache 當(dāng)屬 Memcached 了,本篇文章就來(lái)簡(jiǎn)單記錄下 Django 對(duì)接 Memcached 的過(guò)程。
官方資料
千說(shuō)萬(wàn)說(shuō)都不如官方文檔來(lái)的直接,首推官方文檔:https://docs.djangoproject.com/en/3.1/topics/cache/。
然后后面就是我簡(jiǎn)單的筆記了。
依賴(lài)庫(kù)
首先需要安裝個(gè)依賴(lài)庫(kù),這里用的是 python-memcached,可以使用 pip 來(lái)安裝:
pip3?install?python-memcached由于我使用的是 Docker,所以就把它寫(xiě)到 requirements.txt 里面了。
配置
另外還需要在 settings.py 里面配置一下,內(nèi)容如下:
CACHES?=?{'default':?{'BACKEND':?'django.core.cache.backends.memcached.MemcachedCache','LOCATION':?'cache:11211',} }這里 LOCATION 是需要一個(gè) Memcached 服務(wù),運(yùn)行在 11211 上面。
另外還需要開(kāi)啟兩個(gè)中間件:
MIDDLEWARE?=?['django.middleware.cache.UpdateCacheMiddleware',...'django.middleware.cache.FetchFromCacheMiddleware', ]這里要加兩個(gè)中間件,一個(gè)在最前面,一個(gè)在最后面,順序不能換,中間的是之前配置的其他中間件。
Docker-Compose
OK,接下來(lái)就是使用 Docker 啟動(dòng)了,這里 Docker-Compose 里面就需要增加一個(gè) Memcache 服務(wù),配置如下:
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 的配置,需要加上端口映射和入口參數(shù),這里內(nèi)存大小設(shè)置為 64M。
Kubernetes
我的部署使用的是 Kubernetes,所以對(duì)應(yīng)的 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 后端增加了一個(gè)環(huán)境變量,叫做 MEMCACHED_HOST,所以在 Django 中,我們可以通過(guò)環(huán)境變量來(lái)讀取 Memcached 的 Host,當(dāng)然端口也可以類(lèi)似設(shè)置,不過(guò)端口我就直接寫(xiě)死了,配置更改如下:
CACHES?=?{'default':?{'BACKEND':?'django.core.cache.backends.memcached.MemcachedCache','LOCATION':?os.getenv('MEMCACHED_HOST')?+?':11211',} }OK,這樣改完之后重新部署就好了。
部署之后我直接將 Pod 降到了 2 個(gè),第一次訪問(wèn)速度可能稍慢,但是一旦加載出來(lái)之后,該頁(yè)面就會(huì)被緩存下來(lái),后續(xù)訪問(wèn)速度就只有兩三百毫秒了,測(cè)速如下:
簡(jiǎn)單測(cè)速結(jié)果網(wǎng)址在這:https://ssr1.scrape.center/,大家可以來(lái)爬爬試試吧。
作者:崔慶才
排版:崔慶才
-------?End -------
點(diǎn)右下角「在看」與轉(zhuǎn)發(fā)
是對(duì)我們最大的支持
特別推薦下公眾號(hào)「價(jià)值前瞻」,分享讀書(shū)、成長(zhǎng)和投資思考,歡迎來(lái)串門(mén)。
回復(fù)「書(shū)單」?可獲取精選書(shū)單一份,包括《如何閱讀 一本書(shū)》、《巴菲特之道》、《金字塔原理》、高瓴張磊的《價(jià)值》、《投資最重要的事》、《戴維斯王朝》等書(shū)籍的筆記內(nèi)容或思維導(dǎo)圖
價(jià) 值 前 瞻
做一個(gè)有遠(yuǎn)見(jiàn)的人
掃碼關(guān)注,查看更多內(nèi)容
總結(jié)
以上是生活随笔為你收集整理的如何大幅提高 Django 网站加载速度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JVM垃圾清除算法
- 下一篇: /项目3-分数类中的运算符重载