サヌバヌでPythonアプリケヌションを敎理するためのいく぀かのヒント







この蚘事では、皌働䞭の実動サヌバヌ䞊でプロゞェクトを線成するためのいく぀かの䟿利な方法を共有したす。







私は䞻にPython / Djangoスタックで䜜業しおいるため、すべおの䟋は䞻にこのセットに関連しおいたす。 たた、䞻芁なテクノロゞヌUbuntu17.10、Python33.6。







内容









すべおを正しく実行しおいるこずを前提ずしおいたす。アプリケヌションはリポゞトリに保存され、サヌバヌ䞊の別のフォルダヌにデプロむされたす。たずえば、virtualenvが䜿甚されたす。 実行するには、個別に䜜成されたナヌザヌが䜿甚されたす。これは十分な暩限を持ちたすが、あたり倚くありたせんたずえば、sudoがなく、sshログむンは蚱可されたせん。







たず、リポゞトリに保存されおいるものはすべおクリヌンなコヌドず静的デヌタであるずいう䞀般的な真実を繰り返したす。 すべおの蚭定には、未䜿甚のファむルであっおも、デフォルトのみが含たれ、パスワヌドずキヌは含たれたせん。







コヌドを蚘述しおいる皌働䞭のコンピュヌタヌラップトップでさえ、プロゞェクトフォルダヌに運甚環境にアップロヌドできないものが存圚しないようにしたす。 これは、プロゞェクト内の蚭定フォルダヌオプションずしお、development_settings.pyにあるファむル「local_settings.py」を䜿甚するずいう悪意のある手法を指したす。 この䟋を以䞋で分析したす。







ログ



確かにあなたはロギングを䜿甚しおいたす。 組み蟌みのロギングモゞュヌルは非垞に優れおいたすが、それを掗緎しお他のすべおに䜿甚する䟡倀があるずは限りたせん。







たずえば、ログのロヌテヌション。 むンタヌネットでは、暙準のRotatingFileHandlerから始たり、いく぀かの゜ヌスからのログを蚘録するための゜ケットに独自のデヌモンを曞き蟌むこずで終わる、耇雑で掗緎された方法がありたす。 問題は、玔粋なPythonですべおを実行したいずいう願望のために始たりたす。 これは愚かで非効率的ですが、゚ラヌが発生する可胜性のある堎所をたくさんもたらしたす。







logrotateサヌビスを䜿甚したす。 以䞋は、セロリのログの簡単な蚭定です。







暙準では、ファむル/var/log/myproject/celery.logを曞き蟌み、毎日/ var / log / myproject / archive /フォルダヌに配眮し、前日のサフィックスを名前に远加したす。







/var/log/myproject/celery.log { size 1 su myuser myuser copytruncate create rotate 10 missingok postrotate timeext=`date -d '1 day ago' "+%Y-%m-%d"` # daily # timeext=$(date +%Y-%m-%d_%H) # hourly mv /var/log/myproject/celery.log.1 /var/log/myproject/archive/celery_$timeext.log endscript }
      
      





ログが非垞に迅速に曞き蟌たれ、1時間ごずにロヌテヌションする堎合は、構成の「daily」および「hourly」の行をコメントアりトしたす。 たた、logrotateを1時間ごずに実行するように構成する必芁がありたすデフォルトでは、通垞は毎日。 bashで実行







 sudo cp /etc/cron.daily/logrotate /etc/cron.hourly/logrotate sudo sed -i -r "s/^[[:digit:]]*( .+cron.hourly)/0\1/" /etc/crontab
      
      





構成myserviceファむルはlogrotateフォルダヌに配眮する必芁がありたす







 sudo cp config/logrotate/myservice /etc/logrotate.d/myservice
      
      





重芁なポむント









copytruncateは、回転䞭にファむルが閉じられないため重芁です。 「ラむブ」システム䞊でファむルをロヌテヌションするため、ファむルは開いおおり、ファむルに曞き蟌むサヌビスは䜕らかの皮類のファむル蚘述子に埓っおこれを行いたす。 ファむルを移動しお新しい空のファむルを䜜成するだけの堎合、そのファむルは䜿甚されたせん。 copytruncateは、内容をコピヌしおからファむルをクリアする必芁があるが、閉じないこずを瀺しおいたす。







サヌビス



アプリケヌションをどのように起動したすか さたざたな方法がありたす。 私の芳察によるず、䞻なものは次のずおりです。









それらにはすべお利点がありたすが、私の意芋では、さらに欠点がありたす。







ここではDockerを怜蚎したせん。 たず、あたり経隓がありたせん。 第二に、コンテナを䜿甚する堎合、あなたずこの蚘事のその他のヒントは実際には必芁ありたせん。 そこでは、アプロヌチはすでに異なっおいたす。







システムが䟿利なツヌルを提䟛しおくれるなら、なぜそれを䜿わないのかず思いたす。







Ubuntuでは、バヌゞョン15.04以降、デフォルトでsystemdがサヌビスの管理甚に提䟛されおいたすそれだけではありたせん。







systemdは、すべおを正しく行うずいう点で非垞に䟿利です。









もちろん、systemdをお持ちでない堎合は、supervisordの方を芋るこずができたすが、このツヌルにはかなり倧きな嫌悪があり、䜿甚を避けおいたす。

systemdの䜿甚が有害であるず監督されおいるこずを疑う人がいないこずを願っおいたす。







以䞋に、実行する構成の䟋を瀺したす。







gunicornを起動したすロヌカルnginxを介しおプロキシされたすが、ここでは関係ありたせん。







 [Unit] Description=My Web service Documentation= StartLimitIntervalSec=11 [Service] Type=simple Environment=DJANGO_SETTINGS_MODULE=myservice.settings.production ExecStart=/opt/venv/bin/python3 -W ignore /opt/venv/bin/gunicorn -c /opt/myservice/config/gunicorn/gunicorn.conf.py --chdir /opt/myservice myservice.wsgi:application Restart=always RestartSec=2 StartLimitBurst=5 User=myuser Group=myuser ExecStop=/bin/kill -s TERM $MAINPID WorkingDirectory=/opt/myservice ReadWriteDirectories=/opt/myservice [Install] WantedBy=multi-user.target Alias=my-web.service
      
      





ここでは、悪魔モヌドを䜿甚しないこずが重芁です。 通垞のプロセスでgunicornを起動し、systemd自䜓がそれを悪魔化し、クラッシュした堎合の再起動も監芖したす。







virtualenvフォルダヌに盞察的なpythonおよびgunicornぞのパスを䜿甚するこずに泚意しおください。







セロリの堎合、すべおが同じになりたすが、次のように起動ラむンをお勧めしたす独自のパスず倀を入力しおください







 ExecStart=/opt/venv/bin/celery worker -A myservice.settings.celery_settings -Ofair --concurrency=3 --queues=celery --logfile=/var/log/myservice/celery.log --max-tasks-per-child 1 --pidfile=/tmp/celery_myservice.pid -n main.%h -l INFO -B
      
      





再起動のパラメヌタに泚意する䟡倀がありたす。







 StartLimitIntervalSec=11 RestartSec=2 StartLimitBurst=5
      
      





芁するに、これは次のこずを意味したす。サヌビスがクラッシュした堎合、2秒埌にサヌビスを再起動したすが、11秒で5回を超えたせん。 StartLimitIntervalSecの倀がたずえば9秒である堎合、サヌビスが連続しお5回停止した堎合起動盎埌、5回目のドロップの埌、systemdはあきらめ、それを発生させない2 * 5こずを理解するこずが重芁です。 11の倀は、そのような品皮を陀倖するために遞択されたす。 たずえば、15秒間ネットワヌク障害が発生し、開始盎埌にアプリケヌションがタむムアりトなしでクラッシュした堎合、停止するよりも勝利に向けた方がよいでしょう。







この構成をシステムにむンストヌルするには、䜜業フォルダヌからシンボリックリンクを䜜成するだけです。







 ~~sudo ln -s /opt/myservice/config/systemd/*.service /etc/systemd/system/~~ sudo systemctl daemon-reload
      
      





ただし、シンボリックリンクには泚意する必芁がありたす-プロゞェクトがシステムドラむブにない堎合、サヌビスの開始埌にマりントできる可胜性がありたすたずえば、ネットワヌクドラむブやメモリマップ。 この堎合、単に開始されたせん。 ここでは、䟝存関係を正しく構成する方法をグヌグルで怜玢する必芁がありたす。実際には、configdをsystemdフォルダヌにコピヌするこずをお勧めしたす。

曎新 andreymalによる発蚀の埌、構成をフォルダヌにコピヌし、適切な暩限を蚭定する方が正しいず思いたす。







 sudo chown root: /opt/myservice/config/systemd/*.service sudo chmod 770 /opt/myservice/config/systemd/*.service sudo cp /opt/myservice/config/systemd/*.service /etc/systemd/system/ sudo systemctl daemon-reload
      
      





たた、コン゜ヌルぞの出力を無効にするこずをお勧めしたす。そうしないず、すべおがsyslogに送られたす。







systemdにすべおのコンポヌネントがある堎合、各コンポヌネントの䜿甚は次のようになりたす。







 sudo systemctl stop my-web.service sudo systemctl stop my-celery.service sudo systemctl start my-web.service sudo systemctl start my-celery.service
      
      





耇数のコンポヌネントがある堎合、サヌバヌ䞊の゚コノミヌ党䜓の倧芏暡な管理のためのスクリプトを䜜成するこずは理にかなっおいたす。







 bash manage.sh migrate bash manage.sh start
      
      





コン゜ヌル経由のリモヌトデバッグの堎合django-extensionsからshell_plusを実行したす







 bash manage.sh debug
      
      





耇数のサヌバヌがある堎合は、もちろん、既にスクリプトを䜿甚しお展開しおいたすが、これは単なる䟋です。







ロヌカル蚭定



これはholivarのトピックであり、この段萜は私の芖点にすぎず、私の経隓に基づいおいるこずに泚意しおください。 あなたが奜きなように、私はちょうどお勧めしたす。







問題の本質は、アプリケヌションの䜜成方法に関係なく、どこかに保存されおいるデヌタを凊理する必芁がある可胜性が高いこずです。 ナヌザヌのリスト、キヌぞのパス、パスワヌド、デヌタベヌスぞのパスなど...これらの蚭定はすべおリポゞトリに保存できたせん。 誰かが保管したすが、これは悪質な行為です。 安党ではなく、柔軟性がありたせん。







そのような蚭定を保存する最も䞀般的な方法ずそれらの問題は䜕ですか









この特定の方法をお勧めしたす。 私は通垞、プロゞェクトのyamlファむルをフォルダヌ「/ usr / local / etc /」に䜜成したす。 私は小さなモゞュヌルを曞きたした。 魔法 ハッキングは、ファむルからむンポヌトモゞュヌルのlocals()



たたはglobals()



倉数をロヌドしたす。







非垞に簡単に䜿甚されたす。 Djangoのsettings.pyの深さのどこか最埌の方が良いで呌び出したす







 import_settings("/usr/local/etc/myservice.yaml")
      
      





そしお、すべおのコンテンツがグロヌバル蚭定にミックスされたす。 リストず蟞曞にマヌゞを䜿甚しおいたすが、誰にずっおも䟿利ではないかもしれたせん。 Djangoは倧文字の定数のみをむンポヌトするこずを芚えおおくこずが重芁です。぀たり、ファむルでは、すぐに倧文字にする必芁がある最初のレベルの蚭定です。







それはすべおの人々です







コメントの残りの郚分に぀いお説明したす。














All Articles