メモリを賢く使用します。 パート2. fapws3

前のパートでは、256メガバイトのクイックフィードスライスでメモリを奪い合いました。 結果は、しかし、私が今回達成したほど壮観ではありませんでした。



私はいつも私の悩みのすべてがアパッチであることを知っていました。 そして、私はそれを調整しようとすればするほど、私はそれを確信しました。 結論は? 交換してみてください。 一つのこと-スピーチはもちろん生産に関するものなので、移行は可能な限りスムーズであるべきです。



私はnginxの経験があり、正確にはプロキシの経験があるため、この特定のWebサーバーが選択されました。 さらに、優れたパフォーマンスパラメータを備えています。



私が最初にやろうとしたことは、mod_wsgiでnginxをビルドすることでした(Apacheの場合と混同しないでください)。 それは収集することが判明しましたが、強制的に動作するようになりました-いいえ。 「モジュールとして台無しにすることは不可能です...」というエラーが絶え間なく発生しています。 しかし、本質は重要ではありません。この動きから逃れることは、mod_wsgiプロジェクトの衰退の理由でもありました...私が選んだものは積極的に開発され安定しているとは言えませんでしたが:)



会議pythonua@conference.jabber.ruのゲストを長い間掘り、苦しめた後、fapws3に目が向けられました。 要するに、これはpythonで書かれたWebサーバーです。 理論的には、nginxを使用せずにそのまま使用できますが、ドメインごとに仮想ホストを作成する方法をまだ見つけていません。nginxは静的変数をはるかに適切に処理します。



だから、私はスライス上にarchlinuxを持っているので、以下はすべて彼に当てはまります。 pacman-ソフトウェアマネージャー、apt-getなどを使用できます。 ただし、パッケージの名前が異なる場合があります。



fapws3



fapws3のインストールに複雑なことはありません。 tarballをダウンロードし、解凍し、 python setup.py install



実行します。 前にlibevをインストールすることを忘れないでください



pacman -S libev







それはfapwsに基づいています。



アーカイブにはexamplesフォルダーがあり、そこにはdjangoがあります。 run.pyを取得して、プロジェクトを投入します。 python run.py



実行して、すぐにパフォーマンスを確認することをおpython run.py







ここでは、DJANGO_SETTINGS_MODULEが定義されていないと言って、実行される可能性が最も高くなります。



また、ポートを変更する必要があります。 つまり 各サイトには独自のポートがあります。 私は8081などから番号を付け始めました。 さらに、nginxを設定するときに必要になります。 ちなみに、ポートはevwsgi.start("127.0.0.1", 8081)



構成されevwsgi.start("127.0.0.1", 8081)



テストでは、IP 0.0.0.0を使用して、nginxなしで動作を確認できます。この場合、nginx以外は誰もサイトに直接接続しません...これより正しい)



nginx



ここでも複雑なことはありません: pacman -S nginx



。 詳細設定。 サーバーのスムーズな操作が必要なため、 nginxをポート8080に配置しました。このため、/ etc / nginx / conf / nginx.confでlisten 80



をリッスンし、80を8080に変更します。



nginxに必要なことは、動的リクエストをサーバーのfapwsにプロキシし、静的自身を配信することだけです。 これを行うには、/ etc / nginx / conf / nginx.confのhttp内の各サイトに対してサーバーブロックを作成します。

 サーバー{
         80を聞きます。
         server_name promex.su;
	ロケーション/静的{
		ルート/srv/http/promex.su/;
	 }
	 location〜* ^。+ \。(jpg | jpeg | gif | png | ico | css | zip | tgz | gz | rar | bz2 | doc | xls | exe | pdf | ppt | txt | tar | mid | midi | wav | bmp | rtf | js | mov){
		 access_log off;
		有効期限は30日です。
	        ルート/srv/http/promex.su/;
	 }
	場所/メディア{
		ルート/usr/lib/python2.6/site-packages/django/contrib/admin/;
	 }

        場所/ {
	     proxy_pass http://127.0.0.1:8082;
	     proxy_set_header X-Forwarded-Host $ server_name;
	     proxy_set_header X-Real-IP $ remote_addr;
	     proxy_set_header X-Forwarded-For $ remote_addr;
	 }

         #error_page 404 /404.html;

         #サーバーエラーページを静的ページ/50x.htmlにリダイレクトします
         #
         error_page 500 502 503 504 /50x.html;
        場所= /50x.html {
            ルートhtml;
         }
     }




ここではproxy_pass行が重要です。その中にrun.pyからポートを指定する必要があります。 静的が設定されている場所では、詳細に立ち入らず、自分のパスを修正するだけです。



監督



fapws3はサイトごとに個別のデーモンであるため、何らかの方法でこのすべての獣を管理する必要があります。 このために、私は監督を取りました。 これはrc.dのようなもので、Pythonで書かれているだけで十分です...個人的には、各サイトにrcを書いてからrc.confに追加するのは面倒です。 スーパーバイザーでは、rc.d自体に追加し、その構成でサイトを構成するだけです(非常に簡単です)。 aurを介してもう少し複雑になりますが、ディストリビューションがサポートされたパッケージとして持っている可能性があります。 私のyaourtでは、すべてyaourt -S supervisord



チームにyaourt -S supervisord



られていますが、すべてのarchユーザーが使用することをお勧めします。



次のようにrc.confに追加されます: DAEMONS=(syslog-ng network netfs crond sshd supervisord)







構成は非常にシンプルで、win-iniのように見えます。 次のようなブロックを追加するだけで十分です。

  [プログラム:kaexpert]
コマンド= / srv / http / ka-expert.ru / src / run.py
 process_name =%(program_name)s
ユーザー= http 


command-コマンド自体。run.pyを実行可能にすることを忘れないでください

process_name-プロセス名

user-ユーザーの起動元(Webサーバーと同じです。nginxは、標準のnginxではなくhttpの下で私のために使用されます。これは、すべてがhttp専用に調整されているためです)



まあ、それだけです。 もちろん、これは各サイトに必要です。 個人的には、Webインターフェイスを提供する[inet_http_server]セクションのコメントを外しましたが、個人的には曲がって動作します...それは情報機能のみを実行し、supervisorctlを介してのみプロセスを再起動できません。その後、実行(明らかにビジネスです)怠iness)。



まとめ



合計で、100 MBを超えるメモリを解放しました。現在、画像は次のようになっています

 キャッシュされた使用済み共有バッファの合計
メモリ:256113142 0 4 32
 -/ +バッファ/キャッシュ:75 180
スワップ:511 27 484


再起動後、スワップはmemに移動するはずですが、混乱するまで-稼働時間は刻々と過ぎます:)



一般的かつ複雑なことで、メモリの大幅な節約と一般的な速度の向上が得られました。 主観的に、ページの読み込みが5倍速くなり、テスターで測定しませんでした。



頑張って



Via Retta Inc.



PS>カルマのプラスは傷つきません-招待を必要とする善良な人々が常にいます:)



All Articles