店内のスペーススネークまたは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人を啓発したことを願っています。



All Articles