ããã«ã¡ã¯ç§ã¯å€§åŠå ã®ç 究è ã®ããã®ãœãŒã·ã£ã«ãããã¯ãŒã¯ãšããŠBootcampãç«ã¡äžããããšããŠããŸãã ãã ããããã€ãã®å¶çŽã«ãããçŸåšãå±éã®ãªããŒã¹ãããã·ãšããŠcaddyã䜿çšããããšã¯ã§ããŸããã 代ããã«nginxã䜿çšããŸãã å¯èœã§ããã°ãæ¬çªç°å¢ã«æå®ããå¿ èŠã®ãããã©ã¡ãŒã¿ãŒã«ã€ããŠã®ã¬ã€ãã³ã¹ãæããŠãã ããã env.exampleãã¡ã€ã«ãèŠãŸãããããããžã§ã¯ãã¯ç§ã«ãšã£ãŠæ°ããã®ã§ããã¹ãŠãã©ã®ããã«çžäºã«æ¥ç¶ãããŠããã®ãããããŸããã ç§ã¯æ¬¡ã®ãšã©ãŒã§ç«ã¡åŸçããŠããŸã
manage.py runworker: error: the following arguments are required: channels
ã©ããªå©ãã§ã倧æè¿ã§ãã
ããã
ãã£ãã£ã䜿çšããŠããŸããã ç§ã¯ãã¹ãŠã®djangoãããžã§ã¯ãã«gunicornã䜿çšããŠããŸãã
ãã¹ãŠã®èŠä»¶ãã€ã³ã¹ããŒã«ããŸãããïŒ
ãã£ã³ãã«> = 2.1.1ïŒhttpsïŒ//github.com/django/channels
ãã£ãã«-redis> = 2.2.1ïŒ httpsïŒ//github.com/django/channels_redis
ã³ã³ãœãŒã«ã§ç¢ºèªã§ããŸã
$ python -c "import channels"
$ echo $?
0ã¯ãååšããããšãæå³ããŸã
1ã¯ãã¢ãžã¥ãŒã«ãã·ã¹ãã ã«ååšããªãããšãæå³ããŸã
ãã£ãã«ãã€ã³ã¹ããŒã«ãããŸãã ç§ã¯ä»å¥ã®åé¡ã«ééããŸãã ãããç§ã®dockerãã¡ã€ã«ãš.envã§ãã ã¯ãŒã«ãŒãµãŒãã¹ã§åé¡ãçºçããŠããŸãã ãããäœãããã®ãããããªãã ããªãã®å©ãã«æ¬åœã«æè¬ããŠããŸããããªãã®ãããžã§ã¯ãã¯éåžžã«èå³æ·±ãããããæ¬çªç°å¢ã«å ¥ããšç§ã®å€§åŠã®å€ãã®äººã ãå©ããããšãã§ããŸãã
ããããšã©ãŒãã°ã§ãã
worker_1 | /usr/local/lib/python3.6/site-packages/daphne/server.py:13: UserWarning: Something has already installed a non-asyncio Twisted reactor. Attempting to uninstall it; you can fix this warning by importing daphne.server early in your codebase or finding the package that imports Twisted and importing it later on.
worker_1 | UserWarning,
django_1 | DEBUG 2019-10-17 21:28:37,751 base 1 140450066271560 Configuring Raven for host: https://sentry.io
worker_1 | DEBUG 2019-10-17 21:28:35,663 base 1 140638836505928 Configuring Raven for host: https://sentry.io
worker_1 | Running worker for channels ['channels', 'notifications']
worker_1 | DEBUG 2019-10-17 21:28:36,297 base 1 140638836505928 Sending message of length 5534 to https://sentry.io/api/1782977/store/
worker_1 | Traceback (most recent call last):
worker_1 | File "manage.py", line 30, in <module>
worker_1 | execute_from_command_line(sys.argv)
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
worker_1 | utility.execute()
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
worker_1 | self.fetch_command(subcommand).run_from_argv(self.argv)
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
worker_1 | self.execute(*args, **cmd_options)
worker_1 | File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute
worker_1 | output = self.handle(*args, **options)
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/management/commands/runworker.py", line 46, in handle
worker_1 | worker.run()
worker_1 | File "/usr/local/lib/python3.6/site-packages/asgiref/server.py", line 60, in run
worker_1 | event_loop.run_until_complete(self.handle())
worker_1 | File "/usr/local/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete
worker_1 | return future.result()
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in handle
worker_1 | [listener.result() for listener in listeners]
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in <listcomp>
worker_1 | [listener.result() for listener in listeners]
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 37, in listener
worker_1 | message = await self.channel_layer.receive(channel)
worker_1 | File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 461, in receive
worker_1 | return (await self.receive_single(channel))[1]
ããªãã®ç°å¢ã®å€åREDIS_URL=redis://127.0.0.1:6379
ã¯ãŒã«ãŒãµãŒãã¹ã®æ§ææ¹æ³ãæããŠãã ããã ãããŠããªããããå¿ èŠãªã®ã§ããïŒ ãã®ãããžã§ã¯ãã¯åããŠãªã®ã§ããã®æ å ±ãã©ãã§æ¢ãã¹ããããããªã
ããŒããããã¯ããããã ããã¯æ°åã§å®äºããŸãã...
ãŸãããµãŒããŒç°å¢ã«ãã¹ãŠã®èŠä»¶ãã€ã³ã¹ããŒã«ãããã©ããã確èªããŠãã ãã
pip install -U -r requirements/production.txt
第äºã«ãããªãã®ãããžã§ã¯ãã¯ããŒã«ã«ã§åãçµãã§ããŸããïŒ
ãã¹ãŠã®ãã¡ã€ã«ããªããšããããžã§ã¯ããæ§æããããšã¯ã§ããŸããã ãããŠãç§ã¯ãããæ§æããã®ã«æé©ã§ã¯ãããŸããã æ§æãšå ±æã確èªã§ããŸãããããã¯ããŒããã£ã³ãçšã«ãã¹ãããã³æ¿èªãããŠããŸããã è¿œå ã®èšå®ãå¿ èŠãªå ŽåããããŸãã
dockercomposeã䜿çšããŠãµãŒãã¹ãã¹ãã³ã¢ããããŠããŸãã ããŒã«ã«ãããã€ã¡ã³ãã¯æ£åžžã«æ©èœããŸãããproduction.ymlã¯ãŸã£ããå¥ã®ãã®ã§ãã ç§ã¯redisãdaphneãpostgresã䜿çšããŠããŸãã docker-composeãã¡ã€ã«ãã©ããã«ããå Žåã¯ãå ±æããŠãã ããã ããããšã
iOSçšã®Outlookãå ¥æããhttps://aka.ms/o0ukef
æçš¿è
ïŒsamazaphikel [email protected]
éä¿¡æ¥ïŒ2019幎10æ17æ¥æšææ¥17:03:30
ToïŒvitorfs / Bootcampã®[email protected]
CcïŒTri Minh Pham [email protected] ; èè
[email protected]
件åïŒReïŒ[vitorfs / bootcamp]æ¬çªç°å¢ã®ã»ããã¢ãããæ¯æŽããŸãã ïŒïŒ193ïŒ
ããŒããããã¯ããããã ããã¯æ°åã§å®äºããŸãã...
ãŸãããµãŒããŒç°å¢ã«ãã¹ãŠã®èŠä»¶ãã€ã³ã¹ããŒã«ãããã©ããã確èªããŠãã ãã
pip install -U-rrequirements / production.txt
第äºã«ãããªãã®ãããžã§ã¯ãã¯ããŒã«ã«ã§åãçµãã§ããŸããïŒ
ãã¹ãŠã®ãã¡ã€ã«ããªããšããããžã§ã¯ããæ§æããããšã¯ã§ããŸããã ãããŠãç§ã¯ãããæ§æããã®ã«æé©ã§ã¯ãããŸããã æ§æãšå ±æã確èªã§ããŸãããããã¯ããŒããã£ã³ãçšã«ãã¹ãããã³æ¿èªãããŠããŸããã è¿œå ã®èšå®ãå¿ èŠãªå ŽåããããŸãã
â
ã¹ã¬ãããäœæããããããããåãåã£ãŠããŸãã
GitHubã®äžã«ãçŽæ¥ãã®ã¡ãŒã«ã«è¿ä¿¡ããŠè¡šç€ºhttps://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 ããŸãã¯éäŒhttps://github.com/notifications/unsubscribe- auth / ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA ã
ç§ã®å ŽåãUbuntuãµãŒããŒãã·ã³ã§Python3.7.1ã䜿çšããIM
ãªãã·ã§ã³ã®ã»ããã¢ããPythonããŒãžã§ã³sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1
ãã®ã³ãã³ãã§ã¯ãPython3.7.1ãç§ã®æåªå äºé ã§ã
ãŸãããã·ã³ã«ç°å¢ãã€ã³ã¹ããŒã«ããŸãsudo -H pip3 install virtualenv
æ£ãããã©ã«ãã«å€æŽããã«ã¯cd /home/pages
ãããžã§ã¯ããã©ã«ããäœæããããã®mkdir bootcamp
cd bootcamp/
ç°å¢ãäœæããvirtualenv bootcampenv
ããªãã®ç°å¢ã掻æ§åããsource bootcampenv/bin/activate
installl gunicorn
pip3 install gunicorn
ããŒãžãã£ã¬ã¯ããªã«æ»ãcd ..
ããŒããã£ã³ããããžã§ã¯ãçšã®ãã©ã«ããäœæããŸã
django-admin startproject bootcampprojectdir
cd bootcampprojectdir
ãããŠãèŠä»¶ãã€ã³ã¹ããŒã«ããŸãpip install -U -r requirements/production.txt
å¥ã®ããŒã¿ããŒã¹ãªã©ã䜿çšããŠããå Žåã¯ã移è¡ãéå§ããŠcollectsstatic
ããŒã8000ââãèš±å¯ããããã«ãã¡ã€ã¢ãŠã©ãŒã«ãæŽæ°ããŸãsudo ufw allow 8000
gunicornwsgiãäœæããgunicorn --bind 0.0.0.0:8000 settings.wsgi
ã·ã¹ãã ãœã±ãããäœæããsudo nano /etc/systemd/system/gunicorn.socket
[åäœ]
説æ= gunicorn.sock[ãœã±ãã]
ListenStream = / run / gunicorn.sock[ã€ã³ã¹ããŒã«]
WantedBy = sockets.target
ãµãŒãã¹ãäœæããsudo nano /etc/systemd/system/gunicorn.service
[åäœ]
説æ= gunicornããŒã¢ã³
Required = gunicorn.socket
After = network.target[ãµãŒãã¹]
ãŠãŒã¶ãŒ=ããŒãž
Group = www-data
WorkingDirectory = / home / pages / bootcampprojectdir / bootcampenv / bin / gunicorn
--access-logfile-
-åŽåè 3
--bind unixïŒrun / gunicorn.sock
settings.wsgi.application[ã€ã³ã¹ããŒã«]
WantedBy = multi-user.target
ãã¹ãŠãæå¹ã«ããsudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
確èªããŠãã ããfile /run/gunicorn.sock
ãšã©ãŒããªããã°å€§äžå€«ã§ã
ã¹ããŒã¿ã¹ã確èªããsudo systemctl status gunicorn.socket
ãã§ãã¯ãµãŒãã¹curl --unix-socket /run/gunicorn.sock localhost
htnlã³ãŒãã衚瀺ãããªãå Žåã¯ãgunicorn.serviceã䜿çšããŠãã ããã
ãµãŒãã¹ãå®è¡ãããŠããããšã確èªããŠãã ããsudo systemctl status gunicorn
ãã¹ãŠåé¡ããªããã°ã次ã®ã¹ãããNGinxã¯gunicornã«ãã¹ããŸã
nginxãã€ã³ã¹ããŒã«ããŸãsudo apt install nginx
nginxã§ãµã€ããäœæãã
ãµãŒãã¹ãäœæããsudo nano /etc/nginx/sites-available/bootcampproject
ãµãŒããŒ{
80ãèã;
server_name 99.99.99.99location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/pages/bootcampprojectdir; }
äœçœ® / {
proxy_paramsãå«ãã;
proxy_pass httpïŒ// unix ïŒ/run/gunicorn.sock;
}
}
ãã®ãã¡ã€ã«ãä¿åããŠãµã€ã察å¿ã«ã³ããŒããŸãsudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled
nginxã®èšå®ã確èªããŠãã ãã
sudo nginx -t
ãšã©ãŒããªãå Žåã¯ãnginxãåèµ·åããŸãsudo systemctl restart nginx
nginxãã¡ã€ã¢ãŠã©ãŒã«ããŒããè¿œå ããŸãããæåã«ããŒã8000ââããã¹ãããåé€ããŸã
sudo ufw delete allow 8000
nginxãè¿œå sudo ufw allow 'Nginx Full'
ããã«ã¡ã¯@phamminhtrisç§ã¯ããªãããããžã§ã¯ãã䜿ã£ãŠãããŠããããã§ãããããŠããªããããã圹ã«ç«ã€ãšæãããã ãããžã§ã¯ããå®çšŒåç°å¢ã«ãããã€ããã«ã¯ãäž»ã«2ã€ã®æ¹æ³ããããŸãã 1ã€ç®ã¯Dockerã䜿çšããããšã§ããã泚æç¹ããããæããã«Dockerãšdocker-compose
ããªã粟éããŠããå¿
èŠããããŸãã ç§ã¯å°é家ããã¯ã»ã©é ãã®ã§ãéçºã«ã®ã¿äœ¿çšããŠããŸãããããããããã§åœ¹ç«ã€ãã®ãèŠã€ãã
ãã1ã€ã®æ¹æ³ã¯ããããžã§ã¯ãããã®ãŸãŸå®è£
ããããšã§ããããã¯ãç°¡åãã§ãïŒãŸãã¯ãå°ãªããšããããžã§ã¯ãããããã€ããããã®ããå€ãã®ãªãœãŒã¹ãšã¬ã€ããèŠã€ããããšãã§ããŸãïŒãå¿
èŠãªå€æ°ã䜿çšããŠ.env
ãã¡ã€ã«ãããŒãããããšãå¿ããªãã§ãã ãããå«ãŸããŠãããµã³ãã«ããŒãžã§ã³ã䜿çšããŠããããã宣èšããæ¹æ³ãç解ã§ããŸãã
å¯äžã®ãµãŒããŒãšããŠgunicornã䜿çšããã ãã§ååã§ããïŒ äžéšã®æ©èœã§ã¯ãWebãœã±ãããã©ãã£ãã¯ãåŠçããããã«daphneãªã©ã®ASGIã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãå¿ èŠã§ããããšãããããŸããã ç§ãééã£ãŠããå Žåã¯ç§ãèšæ£ããŠãã ããã 芪åã«å©ããŠãããŠããããšãã æ¬åœã«æè¬ããŠããŸãã
Nginxã¯ãã€ã³ã¿ãŒãããããã®ãªã¯ãšã¹ããæåã«å°çããå Žæã§ãã ããã¯ããããéåžžã«è¿ éã«åŠçããããšãã§ããéåžžã¯ãããã®èŠæ±ã®ã¿ãééãããããã«æ§æãããŠãããå®éã«ã¯Webã¢ããªã±ãŒã·ã§ã³ã«å°éããå¿ èŠããããŸãã
Gunicornã¯ãNginxããååŸãããªã¯ãšã¹ãããWebã¢ããªã±ãŒã·ã§ã³ãåŠçã§ãã圢åŒã«å€æããå¿ èŠãªãšãã«ã³ãŒããå®è¡ãããããã«ããŸãã
ãããããäœããããããšãã§ããŸãããä»ã®äººã¯ã§ããŸããã
Nginxã¯WebãµãŒããŒããã³ãªããŒã¹ãããã·ã§ãã ããã¯ãWebãµãŒããŒãå®è¡ããå¿
èŠã®ãããã¹ãŠã®ããšã«å¯ŸããŠé«åºŠã«æé©åãããŠããŸãã
ãã¡ã€ã³åã®ã«ãŒãã£ã³ã°ã«æ³šæããŠãã ããïŒãªã¯ãšã¹ãã®éä¿¡å
ã決å®ãããããšã©ãŒå¿çãé©åãã©ããã決å®ããŸãïŒ
éçãã¡ã€ã«ãæäŸãã
äžåºŠã«å±ã倧éã®ãªã¯ãšã¹ããåŠçãã
é
ãã¯ã©ã€ã¢ã³ããåŠçãã
åçã§ããå¿
èŠããããªã¯ãšã¹ããGunicornã«è»¢éããŸã
SSLãçµäºããŸãïŒhttpsã¯ããã§çºçããŸãïŒ
Pythonã³ãŒããšæ¯èŒããŠã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ïŒCPUãšã¡ã¢ãªïŒãç¯çŽãã
ããã«ãããããããã«æ§æãããšïŒè² è·åæ£ããã£ãã·ã¥ãªã©ïŒãããã«å€ãã®ããšãå¯èœã«ãªããŸãã
Gunicorn
Nginxã決å®ããããç¹å®ã®ãªã¯ãšã¹ããGunicornã«æž¡ãå¿
èŠããããŸãïŒèšå®ããã«ãŒã«ã®ããïŒã
Gunicornã¯é«åºŠã«æé©åãããŠãããå€ãã®äŸ¿å©ãªæ©èœãåããŠããŸãã
ã¯ãŒã«ãŒããã»ã¹/ã¹ã¬ããã®ããŒã«ã®å®è¡ïŒã³ãŒãã®å®è¡ïŒïŒ
Nginxããã®ãªã¯ãšã¹ããWSGIäºæã«å€æããŸã
ã¢ããªã®WSGIå¿çãé©åãªhttpå¿çã«å€æããŸã
ãªã¯ãšã¹ããå±ããšãå®éã«Pythonã³ãŒããåŒã³åºããŸã
Gunicornã¯ããŸããŸãªWebãµãŒããŒãšéä¿¡ã§ããŸã
Gunicornã¯ãå€ãã®æå¹ãªWSGIãµãŒããŒã®1ã€ã«ãããŸããã ããªãã®ã¢ããªã¯ããªããã©ã¡ãã䜿ãããæ°ã«ããŸããããNginxãæ°ã«ããŸããã
ç§ã¯äžèšãç解ããŠããŸãã ãã ãããã®ãããžã§ã¯ãã¯ãããã³ã«ã®ç¹ã§éåžžã«ç¹å¥ã§ãã WebSocketãä»ããŠéç¥ãæäŸããŸããç§ã®ç解ã§ã¯ãã¢ããªãé§åããã«ã¯éåžžã®gunicornãšnginx以äžã®ãã®ãå¿ èŠã§ããïŒ ããŒã«ã«ã®dockercomposeãå®è¡ãããšã/ notificationsãæ©èœããŠããªãããã§ãã ç§ã¯ãããã質åããŠããããšãç¥ã£ãŠããŸããã@ samazaphikelãæäŒã£ãŠãããããªãã®æéãšåªåã«æ¬åœã«æè¬ããŠããŸãã ããŒã«ã«æ§æïŒdocker-composeãdockerãªãïŒã裞ã®ubuntuã ãã§è©Šãããããæ©èœãããã©ããã確èªããŸãã ããããšãy'all
éåžžã«åœ¹ç«ã€ã¬ã€ãã ééã
æãåèã«ãªãã³ã¡ã³ã
ç§ã®å ŽåãUbuntuãµãŒããŒãã·ã³ã§Python3.7.1ã䜿çšããIM
ãªãã·ã§ã³ã®ã»ããã¢ããPythonããŒãžã§ã³
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1
ãã®ã³ãã³ãã§ã¯ãPython3.7.1ãç§ã®æåªå äºé ã§ã
ãŸãããã·ã³ã«ç°å¢ãã€ã³ã¹ããŒã«ããŸã
sudo -H pip3 install virtualenv
æ£ãããã©ã«ãã«å€æŽããã«ã¯
cd /home/pages
ãããžã§ã¯ããã©ã«ããäœæããããã®
mkdir bootcamp
cd bootcamp/
ç°å¢ãäœæãã
virtualenv bootcampenv
ããªãã®ç°å¢ã掻æ§åãã
source bootcampenv/bin/activate
installl gunicorn
pip3 install gunicorn
ããŒãžãã£ã¬ã¯ããªã«æ»ã
cd ..
ããŒããã£ã³ããããžã§ã¯ãçšã®ãã©ã«ããäœæããŸã
django-admin startproject bootcampprojectdir
cd bootcampprojectdir
ãããŠãèŠä»¶ãã€ã³ã¹ããŒã«ããŸã
pip install -U -r requirements/production.txt
å¥ã®ããŒã¿ããŒã¹ãªã©ã䜿çšããŠããå Žåã¯ã移è¡ãéå§ããŠcollectsstatic
ããŒã8000ââãèš±å¯ããããã«ãã¡ã€ã¢ãŠã©ãŒã«ãæŽæ°ããŸã
sudo ufw allow 8000
gunicornwsgiãäœæãã
gunicorn --bind 0.0.0.0:8000 settings.wsgi
ã·ã¹ãã ãœã±ãããäœæãã
sudo nano /etc/systemd/system/gunicorn.socket
ãµãŒãã¹ãäœæãã
sudo nano /etc/systemd/system/gunicorn.service
ãã¹ãŠãæå¹ã«ãã
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
確èªããŠãã ãã
file /run/gunicorn.sock
ãšã©ãŒããªããã°å€§äžå€«ã§ã
ã¹ããŒã¿ã¹ã確èªãã
sudo systemctl status gunicorn.socket
ãã§ãã¯ãµãŒãã¹
curl --unix-socket /run/gunicorn.sock localhost
htnlã³ãŒãã衚瀺ãããªãå Žåã¯ãgunicorn.serviceã䜿çšããŠãã ããã
ãµãŒãã¹ãå®è¡ãããŠããããšã確èªããŠãã ãã
sudo systemctl status gunicorn
ãã¹ãŠåé¡ããªããã°ã次ã®ã¹ãããNGinxã¯gunicornã«ãã¹ããŸã
nginxãã€ã³ã¹ããŒã«ããŸã
sudo apt install nginx
nginxã§ãµã€ããäœæãã
ãµãŒãã¹ãäœæãã
sudo nano /etc/nginx/sites-available/bootcampproject
ãã®ãã¡ã€ã«ãä¿åããŠãµã€ã察å¿ã«ã³ããŒããŸã
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled
nginxã®èšå®ã確èªããŠãã ãã
sudo nginx -t
ãšã©ãŒããªãå Žåã¯ãnginxãåèµ·åããŸã
sudo systemctl restart nginx
nginxãã¡ã€ã¢ãŠã©ãŒã«ããŒããè¿œå ããŸãããæåã«ããŒã8000ââããã¹ãããåé€ããŸã
sudo ufw delete allow 8000
nginxãè¿œå
sudo ufw allow 'Nginx Full'