![](https://habrastorage.org/storage2/065/6c3/e79/0656c3e793d25ca5f23e3155a6a8ec69.jpg)
ã«ããã®äžã«ããããã®æåããããŸãããå¿é ããªãã§ãã ãã-ããªãã¯ãã¹ãŠããããç¥ã£ãŠããŸãã
èæ¯
ãšãŠãé¢çœã
ãããããããææã®äººãšäžç·ã«ãæåã®å°ããªãããžã§ã¯ããäœãããšããŸããã ããããç§ã¯ãã¶ã€ã³ã ãã«åŸäºããŠããã®ã§ãããã°ã©ããŒãéããªããã°ãªããŸããã§ãããç§ã¯åœŒã«ã¬ã€ã¢ãŠããæž¡ãã圌ã¯ã¬ã€ã¢ãŠããšã¢ããªã±ãŒã·ã§ã³ãã®ãã®ãæããŠãããŸããã ãã¹ãã£ã³ã°ã«ã¯çŽ130ãã150ã«ãŒãã«ã®è²»çšãããããŸãã-ãã¡ãããããã¯LAMPã§ããã
éåžžãæåã®ãã³ã±ãŒãã¯ããŸããããŸããã§ããã æéãçµã¡ãç§ãã¡ã¯2çªç®ã®ãããžã§ã¯ãã«çããŸããã ä»ãç§ã¯èªåã§ãã¹ãŠãè¡ãããšãã§ããŸããã èšèšãç Žæ£ããåŸãã¬ã€ã¢ãŠããèšå®ãã次ã«ã¢ããªã±ãŒã·ã§ã³èªäœãèšå®ããŸããã ä»åã¯éèŠãªããšã§ã¯ãããŸããïŒéçãªèŠçŽ ãããããããåçŽãªãµã€ãã¯é¢çœããªãã§ãã
ç¿æ £ãããç§ã¯ãã®ããã«ãããèãåºããïŒVPSã®é¢çšããŒãžãéããäžããæåã®è¡ãéžæãã-ãŸããçŽ800ãã1000ã«ãŒãã«ã®ã©ããã ããããªã«ïŒã ç§ãã¡ã¯ãã€ãŠ200ã«ãŒãã«ãæ¯æããŸãã...ã-é å¶è ã¯å°æããŸããã 確ãã«ããªããã£ãšã§ããïŒ ãã¡ãããçãã¯æããã§ãã空è»ãããªããç§ã«èšããªããã°ããžã£ã³ã¬ã¯ãã¡ãã¡ã«ãããŸãããããã¯ããªãã®ããã®ãžã¥ã ã©ã§ã¯ãããŸããïŒã-ããããžã¥ã ã©ã¯ã©ãã§ããïŒ ãžã¥ã ã©ãåªåïŒ100ã«ãŒãã«ã 1ãæé幞ãã«æ®ãããŸãã ããããããã¯ããŸãã«ãåçŽãªçããªã®ã§ãé¢çœããããŸããã
ææŠãã
ãããŠãç§ãã¡ã«ã¯ã¿ã¹ã¯ããããŸãïŒæå°CPãšdjangoã®å®æãããžã§ã¯ã-éçãããã€ãã®ãã©ãŒã ã管çããã«ãªã©ã åææå°ïŒããžã«200 MB RAMã500 MHzããŒã»ã³ã-ã·ã¹ãã ãšäžç·ã«ãã¹ãŠã®2ã€ã®ã®ã°ãããããã«ããŸãã
DB
ã¿ã¹ã¯ã®ããã«ããã¯ïŒRAMã sqliteã䜿çšããŸãã åŸ ã£ãŠ ãªã«ïŒïŒ çå£ã«ã圌ã¯ãããªã«æªããªã ã ãã£ãã·ã¥ã®æ¬ ç¹ãè£ããŸãã
ãã£ãã·ã¥
æã匷åãªãã®ãã¹ãŠïŒnginx + memcachedã䜿çšããŠãjungaãšã®é£æºæ¹æ³ãæããŸãã
WebãµãŒããŒ
ããã¯uwsgiã«ãªããŸã-é«éã§ãã¡ãã·ã§ããã«ã§ãã ç圢ç空ã®ãã¡ã³ã«ã€ããŠã¯ã ãã¹ããã芧ãã ãã ã
ã»ãã·ã§ã³
ã»ãã·ã§ã³ã¯ã©ããã«ä¿åããå¿ èŠããããŸãã ç§ã¯éåžžredisã䜿çšããŸãããããã§ã¯äœ¿çšããŸããã Memkeshdãé©åã§ã¯ãããŸããããã£ãã·ã¥ã¢ãŒããã¯ãã£ãèãããšãå€ãã®å Žåããã£ãã·ã¥å šäœããã©ãã·ã¥ãããããã䜿çšããŠã»ãã·ã§ã³ãåé€ãããŸãã Jung 1.4ã®æ°æ©èœã圹ç«ã¡ãŸãã ããã¯CookieããŒã¹ã®ã»ãã·ã§ã³ã§ãã ååã¯åçŽã§ãããã¹ãŠã®ã»ãã·ã§ã³ããŒã¿ã¯ãŠãŒã¶ãŒã®Cookieã«ä¿åãããŸãã ããŒã¿èªäœã¯æå·åãããŸããããå®å šæ§ã¯æå·çœ²åã«ãã£ãŠä¿èšŒãããŸãã ããã¯ã§è©³çŽ°ãã芧ãã ããã
å 容
ããã§ã¯ãMarkDownã䜿çšããŸãã ããªãããŒã¯ããŠã³ïŒã 圌ã¯ãã£ãããã 圌ã¯ãããã ãã®èšäºã§ãç§ã¯ããã«ã€ããŠæžããŠããŸãã ããŒã¿ããŒã¹ã®ãµã€ãºãç·©åããã®ã«åœ¹ç«ã¡ãŸããã¿ã°ã¯å«ãŸããŠããŸããã MDã®ããã¹ãã¯ãfckeditorã®ãšãã£ã¿ãŒãšåããããç°¡åãªå Žåãããã100åã«1åã¯ç®ã楜ããŸããŠãããŸãã ããã«ãããã¹ãã¯ãšãã£ã¿ãŒã§ã¯ãªããµã€ãã®ã¹ã¿ã€ã«ã§ãã©ãŒãããããå¿ èŠããããŸããäžéšã®ã¹ã¿ã€ã«ã¯ããµãŠãã³ã®ããã«ãã¹ãŠãæ¯é ããŸãã
ãœãããŠã§ã¢
UbuntuãµãŒããŒãæå°éã«ããŠãææ°ãã€æéã®ãœãããŠã§ã¢ãnginxãmemcachedãpython 2.7ãå ¥æããŸãã äžè¬çã«ãslitazãpuppy linuxãslaxã®ãããªç°¡åãªãã®ã䜿çšããæ¹ãè¯ãã§ã-ubuntã®æå°å€ã128 MBã®RAMã§ãããæ§æããããããŒã¹ã·ã¹ãã ã+ããã€ãã®ãœãããŠã§ã¢ãããžã«1ã®ã¬ãã€ã以äžããããã§ãã ãµãŒããŒé åžã ãµãŒ ã ããããç§ãã¡ã¯ãã®èšäºã楜ããããšã«ããŸãããäžè¬çã«ãç§ãã¡ã¯ãã®å¯Ÿçãç¥ã£ãŠããŸãã
éçº
ãžã£ã³ãŽ
ãŸããdzhangi configãã»ããã¢ããããå¿ èŠããããŸãã
# . # , js. SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' SESSION_COOKIE_HTTPONLY = True # https://docs.djangoproject.com/en/1.4/ref/settings/#std:setting-USE_I18N # . : This provides an easy way to turn it off, for performance. , , USE_I18N = False # https://docs.djangoproject.com/en/1.4/ref/settings/#use-l10n # . pytils . USE_L10N = False # https://docs.djangoproject.com/en/1.4/ref/settings/#use-tz # USE_TZ = False # , . . TEMPLATE_CONTEXT_PROCESSORS = ( # default template context processors "django.contrib.auth.context_processors.auth", # "django.core.context_processors.debug", # "django.core.context_processors.i18n", # "django.core.context_processors.media", "django.core.context_processors.static", #"django.core.context_processors.tz", "django.contrib.messages.context_processors.messages", # required by django-admin-tools 'django.core.context_processors.request', 'orangetrans.utils.context_processors.common', ) # Sentry , . # include_html , . # . # https://docs.djangoproject.com/en/1.4/topics/logging/#django.utils.log.AdminEmailHandler LOGGING = { ⊠'handlers': { 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', 'include_html': True, } }, ⊠} # "" SEND_BROKEN_LINK_EMAILS = True
ãã£ãã·ã¥
ããã¯ãããžã§ã¯ãã®æã匷åãªéšåã§ãã ãã£ãã·ã¥ã¯ãé ãããã¯ãšã³ãã®åã®ã·ãŒã«ãã«ãªããŸãã ãã¡ãããå€ãã¯ãã§ã«ãããäœã§ããããæšæž¬ããŠããŸãã
ã©ã®ããã«æ©èœããŸããïŒ ããã¯ç°¡åã§ãïŒãŠãŒã¶ãŒãããŒãžããªã¯ãšã¹ãããnzhinksã¯ãã®ããŒãžããã£ãã·ã¥ã«ãããã©ããã確èªããŸããããã§ãªãå Žåãdzhangã¯ãããçæãããã£ãã·ã¥ã«å ¥ããŠnzhinksã«æž¡ããŸãã ã€ãŸã å®éãäžåºŠãµã€ããééããã ãã§ååã§ããããã®åŸã®ãã¹ãŠã®æéããµã€ãã¯memcashd + nzhinksã®é床ã§åäœããŸãã
æ¬åœã«çŽ æŽãããïŒ ãŸããã»ãšãã©ã®å Žåããã®ã¿ã€ãã®ãã£ãã·ã¥ã¯ç§ãã¡ã®ã±ãŒã¹ã«é©ããŠããŸããè€éãªãããžã§ã¯ãã«ã¯ãå€ãã®æ¬ ç¹ããããŸãã ããšãã°ããŠãŒã¶ãŒãå ¥åãããã©ãŒã ãæŽæ°ããããšã¯ã§ããŸããããªããªãããã®URLãééãããã³ã«ããŠãŒã¶ãŒã¯ãã£ãã·ã¥ããåããã©ãŒã ãååŸããããã§ãã ãã¡ãã·ã§ã³ã称è³ããå¿ èŠã¯ãããŸãã:)
ãžã£ã³ãŽ
ãã©ãŒã ã¯Ajaxã§éä¿¡ãããäžåºŠè¡šç€ºããã°ååã§ããããŒã¿ãšãšã©ãŒã¯æ¢ã«jsã«éãããŸãã Ajaxãªãã®ãã©ãŒã«ããã¯ãªãã·ã§ã³ïŒåžžã«å®è¡ããŸããïŒ:)ãã£ãã·ã¥ããŸããã ç§ãã¡ãæçš¿ãéããŠåãçµãã§ãããã©ãŒã ã¯ãŸã ãããŸãã äžéšã®ããŒãžã§ã³ã®ãžã£ã³ã°ã«ïŒ1.2ïŒïŒãããPOSTèŠæ±ã®å Žåã csrfæ»æã«å¯Ÿããä¿è·ãå¿ é ã«ãªããŸããã ç§ãã¡ã®å Žåãããã¯ã³ãŒã«ããã¯ãªã¯ãšã¹ãã§ããçªå·ã®1ã€ã®ãã£ãŒã«ãã§ãããå人ããŒã¿ã¯ãããŸããã ç¹å®ã®ãã¥ãŒã®ä¿è·ããªãã«ããã«ã¯ã csrf_exemptãã³ã¬ãŒã¿ã§ã©ããããã ãã§ãã
èšç»ãå®è¡ããããã«ãããã«ãŠã§ã¢ãäœæããŸãã ã€ã³ã¿ãŒãããã«ã¯ããã®ãããªãã³ãã«ã®äœæ¥ãå®è£ ããæ¹æ³ã«é¢ããèšäºããããŸãã ããã¯ä»¥åã®ããŒãžã§ã³ã®dzhangaåãã«æžããããã®ã§ãããrawãèŠãããšãªãããããç解ããããšãã§ããŸããã§ããã ç§ã¯ãããä¿®æ£ãããã«ã«æŽæ°ããŸãã ããã«ãŠã§ã¢ã§ã¯ïŒ
import re from django.core.cache import cache from django.conf import settings class NginxMemCacheMiddleWare: def process_response(self, request, response): url = request.get_full_path() cache_it = not settings.DEBUG \ and request.method == 'GET' \ and response.status_code == 200 if cache_it: stoplist = [ x for x in settings.CACHE_IGNORE_REGEXPS if re.match(x, url) ] if not stoplist: cache.set(url, response.content) return response
GETã®ã¿ããã£ãã·ã¥ããéçºæãš404ã«ã¯ãã£ãã·ã¥ããŸããããããŠãªãã§ããïŒ ãããã管çããã«ãŸãã¯æ»æè èªèº«ãæ¢ããŠãããããã¯ãããããçš®é¡ã®ãžã£ã³ã¯ã§ã¡ã¢ãªãåããããšãã§ããããã§ãã
æ§æã«æ»ããŸãããïŒ
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', 'KEY_PREFIX': 'YOURSITE', } }
ããã§ã¯ãã¹ãŠãç°¡åã§ããããã¯ãšã³ãmemkeshdããœã±ããããã¬ãã£ãã¯ã¹ã ãšããã§ãç§ã¯pylibmcããœã±ããããååŸã§ããŸããã§ããã圌ã¯ããã«äœãã奜ãã§ã¯ãããŸããã python-memcachedã䜿ããŸããã
CACHE_IGNORE_REGEXPS = ( re.compile(r'/admin.*'), re.compile(r'/some_url.*'), )
ããã¯ããã£ãã·ã³ã°ãçŠæ¢ãããŠããURLã®ãªã¹ãã§ãã èšå®ã§MIDDLEWARE_CLASSESã«æ°ããããã«ãŠã§ã¢ãè¿œå ããããšãå¿ããªãã§ãã ããã
ãšããã§ãmemcashdã®ã¹ããŒã¿ã¹ãç£èŠããã«ã¯ã django-memcache-statusããã°ã©ã ã䜿çšã§ããŸãã 圌女ã¯ã管çããã«ã§memcashdã®äœ¿çšæžã¿ã¡ã¢ãªã®ã¹ã±ãŒã«ãæç»ããããããçš®é¡ã®æ å ±ã衚瀺ããŸãã æ£çŽãªãšãããç§ã¯ãããããŸã䜿çšããŠããŸããã§ãã:)ãã©ããããŒãžç®¡çè ã®ããã«ãã§ã«éå±ãªç®¡çè ãåžéããã ãã§ãã æ®å¿µãªããã圌女ã¯django-admin-toolsãšåéã§ã¯ãããŸããã
Nginx
ãµãŒããŒdevã®èšå®ãåŸã§æŽæ°ããŸãïŒ
upstream dev { server 127.0.0.1:8000; } server { listen 80; server_name dev.local; charset utf-8; location ~^/(media|static) { root /home/user/project; access_log off; break; } location / { if ($request_method = POST) { proxy_pass http://dev; break; } default_type "text/html; charset=utf-8"; set $memcached_key "YOURSITE:1:$request_uri"; memcached_pass unix:/tmp/memcached.sock; error_page 404 502 = @fallback; } location @fallback { proxy_pass http://dev; } }
次ã®è¡ãåç §ããŠãã ããïŒ 'set $ memcached_key "YOURSITEïŒ1ïŒ$ request_uri";'ïŒ ããã§ãã¹ãŠã®éæ³ãçºçããŸãã åããŒãžã¯ãããŒãã¬ãã£ãã¯ã¹+ãã£ãã·ã¥ã®ããŒãžã§ã³+å®å šãªURLã«ãã£ãŠãã£ãã·ã¥ã«ä¿åãããŸãã äžåºŠããŒãžãéãã ãã§ååã§ããdzhangaã¯ãããããŒã®ãã£ãã·ã¥ã«å ¥ãã次ã«nzhinksããã®ããŒã§ãããååŸããŸãã dzhangaãµã€ãããªãã«ããŠãåäœããŸãã memcashdããã«ããããšãªããããã«ãªã¯ãšã¹ããããã¯ãšã³ãã«éãè¿ããŸãã å¥ã®ãã€ã³ãïŒãŠãŒã¶ãŒãjsãç¡å¹ã«ããŠããå Žåããã«ããã¯ã¢ãŒãã«get-keysã䜿çšããŸãïŒnoscriptïŒPããããŸãïŒïŒãã¹ãŠã®çš®é¡ã®ã¿ãããããããuriã®ä»£ããã«request_uriãget-keysã®ãªãæåŸã®URLã§ãã
janga 1.3以éãããŒå šäœãèªåã§çæããå¿ èŠã¯ãããŸããã setïŒïŒãgetïŒïŒãdeleteïŒïŒã¡ãœããã«äžæã®éšåãæž¡ãã ãã§ååã§ãæ®ãã¯jungãåå¥ã«å®è¡ããŸãã ãã®å Žåã®ãŠããŒã¯ãªéšåã¯ã絶察ããŒãžURLã§ãã
éåžžã®gzipã«ã¯å°ããªåé¡ããããŸãïŒnzhinksã¯memkeshdããååŸãããã®ãå§çž®ããŸããã ç§ã¯ãããã¯ãŒã¯äžã§4幎åã«Ninxã®ããŒãžã§ã³0.6ã®ããããèŠã€ããŸããããã§ã«1 *ã§ãã IE6ãæäŸããªãå Žåã¯ãjungèªäœã§å§çž®ãæå¹ã«ãããã§ã«å§çž®ãããã³ã³ãã³ããæäŸã§ããŸãã ç§ãã¡ã®å Žåãã¹ã¿ãŒã¿ãŒãã©ãŠã¶ãŒã¯éèŠã§ãã ãã以å€ã®å Žåã¯ãgzipãæ©èœããŸãã
Memecached
ãœã±ãã/etc/memcached.confãä»ããŠåäœããããã«memcachedã«äŒããŸãããïŒ
#-s unix socket path to listen on (disables network support) -s /tmp/memcached.sock #-a access mask for unix socket, in octal (default 0700) -a 0777
éååŠ
IEã«ã¯jqueryãšhtml5shimã䜿çšããŠããŸãã Googleã称è³ããŠãã ãããããã¯ç§ãã¡ã®éåœãä¿é²ããŸãïŒ
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
django-compressorã䜿çšããŠãæ®ãã®çµ±èšãå§çž®ããŸãã django-compressorã¯cssã§ã³ã³ãã€ã«ããããšãã§ããŸãã ããŸã䜿çšããªãå Žåã¯ããµãŒããŒãšã³ã³ãã€ã©èªäœã«node.jsãé 眮ããããšãå¿ããªãã§ãã ããã ãã¹ãŠã®éçã«å¯ŸããŠãå§çž®ãæå¹ã«ããjsãšjsãcss c cssãçµåããŸãã çŸäºº
ãŸããã¢ããªã±ãŒã·ã§ã³ã¯ãã¡ã€ã«ã«äžæã®ååãä»ããããããœãŒã¹ãå€æŽãããšãæ°ããååã®æ°ããååãã³ã³ãã€ã«ãããããããŠãŒã¶ãŒã¯ããããæ°ããååã§ããŠã³ããŒãããããªããã¹ãŠããããªã«å¥åŠã«èŠããã®ãïŒããšãã質åãããŸããã ã¡ãªã¿ã«ãDzhanga 1.4ã¯ãããã§ããŸãã
ããŒã«ã«ãã¹ã
ããŠãã»ãŒå®äºã§ãã
ãæ°ã«å ¥ãã®ä»®æ³ãã·ã³ã䜿çšããŠãã·ã¹ãã ãã€ã³ã¹ããŒã«ãããããžã§ã¯ããå±éããŸãã åæã«ãæ¬çªçšã®ãã¹ãŠãæºåããŸããpipã®èŠä»¶ãæŽæ°ããŸããããã¯ãäœããã®çç±ã§åžžã«ææ°ã§ã¯ãªããuwsgiãµãŒããŒãæ§æããŸãã ããã»ããµã«ã¯1ã€ã®ãã€ã³ãããããŸããä»®æ³ããã¯ã¹ãšãã¬ãŒã€ãŒã¯ç¹å®ã®æ°ã®ãã«ããäžããæ¹æ³ãããããªãããã1ã€ã®ã³ã¢ã«å¶éããŸãã
uwsgiãµãŒããŒã®æ§æã«ã€ããŠã¯ã ããã¯ãšwelinuxã«é¢ããå¥ã®èšäºãèªãããšããå§ãããŸã ã ããã§èª¬æããã®ã¯ç¡æå³ã§ããããã¯ããèšå®ã®äŸãåãäžããŠå®è¡ããŸãã æšå¥šãããå¯äžã®æšå¥šäºé ã¯virtualenvã§ãã ããã¯ãã»ãšãã©ã®åé¡ãpythonpathãšç°å¢ã«é¢ãããã®ã§ããããã§ãããããããã¯ã®èŠæ¹ãç解ããåã«ã©ãã ãã®æéã殺ãããã§ãã Googleã«ããå€æïŒç§ã¯1人ã ãã§ã¯ãããŸããã人ã ã¯ã§ããéãåé¯ããŠããŸãïŒã¹ã¯ãªãããªã©ããç°å¢ã«ãã¹ãè¿œå ããŸãã ãããŠãå€ãè¯ãrtfmã
ããã§ããã¹ãŠã®æºåãæŽããŸããã ãã©ãŠã¶ã§ãã©ã€ããŒãã¢ãŒããéãããã¹ãŠãå ¬å¹³ã«ãªãããã«ãããŒãžãååŸããéã枬å®ããŸãã
18 requests â 284.93KB transferred â 1.11s (onload: 1.12s, DOMContentLoaded: 979ms)
ãã£ãã·ã¥ããªã³ã«ããŠãã£ãã·ã¥ãçæããæ°ãããã©ã€ããŒããã©ãŠã¶ãéããŸãã
18 requests â 298.09KB transferred â 291ms (onload: 293ms, DOMContentLoaded: 150ms)
POSTãªã¯ãšã¹ããå®è¡ããŸãããïŒãã®çç±ã説æããŸãïŒã get_or_createãæ°åå®è¡ããŸãã
21 ms. .
ã芧ã®ãšãããgzipã䜿çšããã«ééãå°ãå¢ããã ãã§ãªããå¢å ããŠããŸãã
ãã£ããã ãã£ãããã
ãã涌ããããããšãã§ããŸã
ããã«ç§ãã¡ãããããšããããŸãïŒ
- ããŒãžã§ã³1.3以éããžã£ã³ã°ã«ã¯ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®éçããŒã¿ãéçãã¡ã€ã«ïŒmanage.py collectstaticïŒãæã€ãã©ã«ããŒã«åéããŸãããã以äžã¯æ³åã§ããŸããã ãã¹ãŠãã¡ã¢ãªã«å ¥ããŸãã
- ãã®ãã¡ã€ã«ããããã¢ããªã±ãŒã·ã§ã³ã¯ããããã¡ã€ã«ãšããŠã¢ã¯ã»ã¹ããã¡ã¢ãªã«å ¥ããŸãã
- ããžã§1æéã«1åã³ããŒãèšå®ããŠãéãã«ç ããŸãã
Staticsã¯2ã¡ã¬ãã€ãã§ãããããŒã¿ããŒã¹ã¯æ°ã¡ã¬ãã€ããè¶ ããããšã¯ãããŸãã-5 MBã䜿çšããŸãã ã¡ã¢ãªå ã«ãã£ã¬ã¯ããªãäœæããŸãã
# /etc/fstab: tmpfs /mnt/project/ tmpfs size=5M,mode=0777 0 0 # $ sudo mkdir /mnt/project/ # , : $ sudo mount /mnt/project/ # mode=0777 , $ mkdir /mnt/project/static $ mkdir /mnt/project/db
ãããžã§ã¯ããæ£ããã¢ã»ã³ãã«ããå ŽåãææããŠãããã¹ãŠã®çµ±èšã¯ã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªã«ãããŸãã ãããè¡ãã«ã¯ãåã¢ããªã±ãŒã·ã§ã³ã®éçã«éçãè¿œå ããå¿ èŠããããŸãã詳现ã¯ã ããã¯ã«è¿œå ããŠãã ããã ãã®ãããdzhangaã¯é©åãªå Žæã§ããããèŠã€ããŠåéããããšãã§ããŸãã ç§ãã¡ã¯ããïŒ
# . # , : STATIC_ROOT = COMPRESS_ROOT = '/mnt/project/static/' # (--noinput , - ): $ ./manage.py collectstatic --noinput -c # . : DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/mnt/project/db/db', } } # $ cp -r project/db /mnt/project/db/db # $ killall -HUP uwsgi
ãã®ãã¹ãŠã®èªååãæåã«æ®ããããã¯ã¢ããã宿é¡ãšããŠã¯ã©ãŠã³ã«æ®ããŸãã
njinksèšå®ãæŽæ°ããŸãã
upstream project { server unix:/tmp/project.sock; } server { listen 80; server_name project.ru www.project.ru; if ($host = www.project.ru){ rewrite ^(.*)$ http://project.ru$1 permanent; } location /static { root /mnt/project/; access_log off; expires max; } location /media { root /project/; access_log off; expires 5d; } location / { include /etc/nginx/uwsgi_params; if ($request_method = POST) { uwsgi_pass project; } default_type "text/html; charset=utf-8"; set $memcached_key "project:1:$request_uri"; memcached_pass unix:/tmp/memcached.sock; error_page 404 502 = @fallback; } location @fallback { include /etc/nginx/uwsgi_params; uwsgi_pass project; } }
ã¡ãã£ã¢ãç§ãã¡ã¯ç©ççã«ããã«ãšã©ãŸããŸããã éååŠã¯åããŸãããæ®ãã¯ãã§ã«èŠãŸããã
éçå€æ°ã®ãexpires maxããšããè¡ã«æ³šç®ãã䟡å€ããããŸããããã¯ã¯ãŒã«ã§ã¯ãããŸããã ããããææ¥åçãä¿®æ£ãããã©ããªããŸããïŒ django-compressorã䜿çšããŠããå ŽåãcssïŒ/static/i/button-small.png?e59177bafc62ã§ãããèŠãŠé©ãã§ãããã
ãã£ãã·ã¥ãªãïŒ
14 requests â 284.93KB transferred â 743ms (onload: 775ms, DOMContentLoaded: 708ms)
ãã£ãã·ã¥ããïŒ
14 requests â 298.09KB transferred â 174ms (onload: 175ms, DOMContentLoaded: 140ms)
POSTïŒ
17ms
å¢å ããããŸãã å°ããããã© ãããŠãåºåžè ãå¢ãããšãããã¯é¡èã«ãªããŸãã
ããã¯ã¢ãã
ç§ã¯éåžžéåžžã«ç¡é§ãå€ãã®ã§Dropboxã䜿çšããŠããŸããã ããã§ã¯WebDavã®æ¹ãé©ããŠããŸã ã MyDriveã«ã¯ãç°¡åã§ããªã詳现ãªæé ãèšèŒãããŠããŸãã å©ç¹ã¯çŸåšããµãŒãã¹ã§ãã£ã±ãã§ã-éžæããŠãã ããã ããã«ãããããžã®ã¹ããŒã¹ãç¯çŽããåæã«ã¯ã©ãŠããžã®ããã¯ã¢ãããåãããšãã§ããŸãã
ããã§ãç§ãã¡ã¯äœãããŸãããïŒ
- mysqlãsqliteã§çœ®ãæããããšã§ãªãœãŒã¹ãç¯çŽããŸããïŒdbãã¡ã¢ãªã«å ¥ããããšã§å°ãè²»ãããŸãã:)ãããšããããã¯éåžžã«é«éã«ãªããŸããã
- CookieããŒã¹ã®ã»ãã·ã§ã³ã䜿çš-ãŠãŒã¶ãŒãšã®ã»ãã·ã§ã³ã§ãããããã¹ãã¬ãŒãžãã¯ãªãŒãã³ã°ããã®ä»ã®ãã³ã»ã³ã¹ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã
- 翻蚳ãç¡å¹ã«ããããšã§ãäž»ã«ç®¡çããã«ã§ããdzhangaã®äœæ¥ãæé©åããŸããããããã¯ãã£ãã·ã¥ãããªãéšåã§ãããéèŠã§ãã
- Nzhinksãdzhangaãããã³memkeshdã¯ããœã±ãããä»ããŠéä¿¡ããŸã-è¿œå ããéã¯ããããŸããããããŒããä»ããå Žåãããé«éã«ãªããŸãã
- ãããããæ¢åã®ãã£ãã·ã¥ã®äžã§æéã®ãã£ãã·ã¥ã䜿çšããŸãããæ£ãã䜿çšããã°ãããè¯ããµã€ããžã®é床ãåäžãããããšãã§ããŸãã
- éçã®äžéšã¯å€éšã«é 眮ãããŸããã€ãŸãããµã€ãã¯ããã«é«éã«ããŒããããŸããç°ãªããœãŒã¹ããããŸãã¯ããŒã«ã«ãã£ãã·ã¥ïŒäžè¬çãªãã®ïŒããã
- éçããŒã¿ãå§çž®ããŠã¡ã¢ãªã«æ ŒçŽããnzhinksãä»ããŠæäŸããŸãã
- ããã¯ã¢ããïŒ ãã§ãã¯æžã¿
åè«ã¯äœã§ããïŒ
奜å¥å¿ãšå³ããæ¡ä»¶ã§åãç¿æ £ããããã®ããã«åé¡ã解決ããããšã¯ç§ã«ãšã£ãŠèå³æ·±ãããšã§ããã åºæ¬çã«ããœãªã¥ãŒã·ã§ã³ã¯ç¡å®³ã§æçšã§ãããããŸãããäžéšã¯æ¬è³ªçã«ã¹ããŒãã£ã§ãïŒéžæããããã£ãã·ã¥ã¯éå®çšçã§ãããsqliteã§ã¯ãããžã§ã¯ããå€§å¹ ã«æ¡åŒµããããšã¯ã§ããŸããïŒããšãã°ãã³ãŒã«ãåŠçããããã®ããã¯ãªãã£ã¹ïŒã ãããŠãç§ã®å¿ã§ã¯ããµãŒããŒã«ä¿åããªãã®ã§ãããã¯ãã¹ãŠãã¡ã³ã«ãããŸããã
ãã¹ãŠã®ããã§ãã ãæž èŽããããšãããããŸããã