店内のスペーススネークまたはCheeseShopの置き方

読者の皆さん、こんにちは!

以下は、いわゆる「?」の問題を組織がどのように解決したかについての魅力的な(?)ストーリーです 「人のような展開。」 さまざまな(そしてそうではない)興味深いパッケージ(Django、Bottle、Flask、PIL、ZMQなど)が混在するメインのPython開発言語。

アプリケーションの1つの簡単な説明から始めましょう。



この全体は、CentOS 5.8 OS上のgUnicornとnginxの束の下で機能します。

詳細は以下で承認されています。



問題の本質


プロジェクトの最終段階の1つで、原則として「svn up && python manage.py syncdb && python manage.py migrate」が曲がっているという考えに驚きました。 「より最適な」アプローチの探求が始まりました。

オプション1-「宇宙の蛇」


サーバー管理にSpacewalkを使用しているため、アプリケーションをRPMパッケージにパックするというアイデアが生まれました。 「ワンクリック」をインストールする機能が必要になり、オプションが開発に受け入れられました。

約8時間後、WTF / hrインジケーターがレッドゾーンで立ち往生したとき、もっとシンプルなものを探すことにしました。 主な理由:



オプション2-「店内の蛇」


2番目のオプションは、「他の人のパッケージをどのように配置しますか?」という言葉の後に表示され、PyPiのローカルコピーの検索が開始されました。 多くの放棄された将来性のないパッケージの中で、localshopが選ばれました。これはインストールのしやすさに満足しており、 このバージョンから奇妙なパッケージさえ要求しませんでした。

アプリケーションのフィッティングは比較的短時間で完了しました-必要なのはsetup.pyを追加し、そこに「左」のパッケージを指定することだけでしたが、まだ熊手を踏んでいました。

zip_safe = Falseおよびinclude_package_data = Trueを明示的に指定する必要がありました。 一部のファイルはインストール中に解凍されませんでした。

Apache(まもなく置き換えられます)は、大きなパッケージをダウンロードするためにKeepAliveTimeout 300SetEnv proxy-sendclおよびProxyTimeout 1800を指定する必要がありました。

さらに、localshopの設定プロセスは問題なく開始され、開始するのに十分でした(「クリーン」アカウントで):

cd && virtualenv venv && . venv/bin/activate && pip install localshop
~/venv/bin/localshop init && ~/venv/bin/localshop upgrade


その後、残されたのは〜/ .pipyrcを「ストア」に合わせるだけでした。

 [distutils]
インデックスサーバー=ローカル

 [ローカル]
ユーザー名:開発者
パスワード:parolcheg123
リポジトリ:http://cheese.example.com/simple/


その後、リリースプロセスはpython setup.py upload -r localのバージョン番号を変更した後、 python setup.py upload -r local要約されます。

最終的なアプローチ


初めて「戦闘」サーバーにアプリケーションをインストールしようとしたとき、残念なことにヒットしました。PILパッケージが必要で、GCCやlibpng-develなどのさまざまなものがクラスとして欠落していました。 それでも、PythonのRPMパッケージとさまざまな興味深い部分(MySQL-python、setuptools、PIL、ZMQ)を「ペンでアセンブル」しSpacewalkにアップロードする必要がありました。

この認識操作(実際には、独自の投稿に依存します)の後、アプリケーション自体のインストールは終了し、プロセスを「終了」し始め、小さな問題を仕上げました。


さらに、 Celeryと同様に「長期にわたる」プロセスを実行する必要がありました。 このアプリケーションでは、ZDaemonを使用することに決定しました。このスクリプトには、initスクリプトと構成ファイルが書き込まれています。

 #!/ bin / bash
 ###開始情報の開始
 #提供:our_app
 #必須開始:$ all

 #必須:$ all
 #デフォルト開始:2 3 4 5
 #デフォルト停止:0 1 6
 #簡単な説明:zdaemonを介してour_appを制御します
 #説明:zdaemonを介してour_appを制御

 ###終了情報の終了

 。  /etc/rc.d/init.d/functions

 。  / etc / sysconfig / network

 。  〜produser / venv / bin / activate

 #ネットワークが稼働していることを確認します。
 ["$ NETWORKING" = "no"] && exit 0


 RETVAL = 0
 APP_PATH =〜/ produser / app /
 PYTHON =〜produser / venv / bin / python
 USER = produser



 start(){
         cd $ APP_PATH
         zdaemon -C our_app.zdconf start
         zdaemon -C our_app_celery.zdconf start

 }

 stop(){
         cd $ APP_PATH
         zdaemon -C our_app.zdconf stop
         zdaemon -C our_app_celery.zdconf stop

 }

 check_status(){
         cd $ APP_PATH
         zdaemon -C our_app.zdconf status
         zdaemon -C our_app_celery.zdconf status

 }

ケース「$ 1」
  開始)
        始める
         ;;
  停止)
        止まる
         ;;
  ステータス)
         check_status
         ;;
  再起動)
        止まる
        始める
         ;;
   *)
エサック
出口0



 #our_app [_celery] .zdconf
 <ランナー>
        デーモン真
        ディレクトリ/ opt / produser / app /
        永遠に偽

        バックオフ制限10
        ユーザーproduser
 #run_command->実際のコマンドまたはセロリ
        プログラム/ opt / produser / venv / bin / python /opt/produser/app/manage.py run_command --settings = prod_settings
        ソケット名/tmp/our_app.zdsock
 </ runner>



最終結果



〜/ venv / bin / activate && pip install -U our_appをほとんど問題なく実行すると、アプリケーションの新しいバージョンとsetup.pyで指定されたすべての「左」パッケージがインストールされます。

syncdbおよび移行プロセスは引き続き処理されますが、次のとおりです。



このプロセスの説明が読者の1人を啓発したことを願っています。

Source: https://habr.com/ru/post/J147492/


All Articles