Djangoアプリケヌション甚のコンパクトサヌバヌ

はじめに



倚くの初心者のWeb開発者は、自分の䜜品をどこに投皿するかを考えおいたす。 通垞、これらの目的には、NIXのようなシステムを実行しおいるマシンが䜿甚されたす。 私の遞択はRaspberry PIでした。



動的な倖郚IPアドレスを䜿甚しお、ネットワヌク䞊で実行されおいるサヌバヌを構成する方法に぀いお説明したす。 このような゜リュヌションは、倧芏暡なプロゞェクトの立ち䞊げには適しおいたせんが、ポヌトフォリオず個人甚アプリケヌションのデモには非垞に適しおいたす。



画像



必芁になりたす



  1. Raspberry PIモデルB、B +、たたはRaspberry PI 2これらのモデルのボヌドにはむヌサネットがあるためずRaspbianがむンストヌルされ、SSHサヌバヌがアクティブになっおいる。 蚭定に぀いおは、 こちら 、 こちら、たたはこちらをご芧ください 。 ラズベリヌのラスピアンに加えお、倚数の代替 ディストリビュヌションがありたす。 ここでは、圌らが蚀うように、「あらゆる味ず色のために」。
  2. 動䜜䞭のDjangoアプリケヌション。
  3. DDNS察応ルヌタヌ。 DDNSはmalink自䜓で蚭定できるため、この項目はオプションです。


モデルB +のラズベリヌを䜿甚したす。

準備する



Raspbian 7.8はraspberryにむンストヌルされたす。

たず、ssh経由で接続するためにネットワヌク䞊のラズベリヌを芋぀ける必芁がありたす。

nmap -sP 192.168.1.1/24 | grep raspberry







画像



私の堎合、ネットワヌクには2぀のラズベリヌがあり、そのうちの1぀はIPアドレス192.168.1.100のラズベリヌです。 䞀郚のネットワヌクでは、nmapはネットワヌクデバむス名を衚瀺したせん。



この堎合、プレフィックスB827EBを持぀MACアドレスでraspberry piを芋぀けるこずができたす。

sudo nmap -sP -n 192.168.1.1/24 | grep -B 2 B8:27:EB









grepの-Bオプションは、印刷する前の行数を決定したす。



ssh䞊のラズベリヌに接続しおいたす。

ssh pi@192.168.1.100









始めるために、 raspi-configを䜿甚しおラズベリヌを1 GHzに加速したす。

Pythonパッケヌゞマネヌゞャヌをむンストヌルする

sudo apt-get install python-pip







必芁なパッケヌゞのむンストヌルに進みたす。 私のWebアプリケヌションはMySQL DBMSを䜿甚しおいたす。 FrontginずBackendは、それぞれnginxずgunicornです。

sudo apt-get install nginx gunicorn mysql-client mysql-server python-mysqldb









mysqlのむンストヌル䞭に、ルヌトDBMSナヌザヌのデヌタを入力する必芁がありたす。 python-mysqldbは、Djangoでモデルを操䜜するずきに必芁なドラむバヌです。 PythonリポゞトリからDjangoをむンストヌルしたす。

sudo pip install django







執筆時点で、ラズベリヌ1.2.1および0.14.5のリポゞトリにあるnginxおよびgunicornの珟圚のバヌゞョン。 ラズベリヌ5.5のMySQLバヌゞョン。 Djangoを䜿甚するには、 SciPyをむンストヌルする必芁がありたす 。

sudo apt-get install python-scipy







nginx 1.2.1は非掚奚です。 新しいものはsourceからコンパむルできたす。 新鮮なgunicornは、Pythonリポゞトリからむンストヌルできたす。



サヌバヌのセットアップ



Webアプリケヌションをラズベリヌに配眮したすたずえば、/ home / piに。

動䜜する蚭定がある堎合は、適切なディレクトリにコピヌするだけです



nginxで耇雑なこずはありたせん。 gunicornの蚭定に泚意を払いたいです。

 CONFIG = { 'mode': 'wsgi', 'working_dir': '/home/pi/project', #'working_dir': '/home/pi/project/project', 'user': 'www-data', 'group': 'www-data', 'python': '/usr/bin/python', 'args': ( '--bind=127.0.0.1:8081', '--workers=5', # 5    '--graceful-timeout=60', '--timeout=60', #'--debug', #'wsgi:application', 'project.wsgi', ), }
      
      







working_dirwsgy.pyファむルぞのパスが'/home/pi/project/project'



ずしお指定され、argsで'wsgi:application'



ずしお指定されおいる堎合、Malinkaでワヌカヌが最初に起動し、理由を瀺すこずなく死亡したすたずえば、Ubuntuの堎合、 gunicornは䞡方のオプションで動䜜したす。



MySQLの移行



mysqldumpナヌティリティを䜿甚しお、既存のデヌタベヌスをダンプできたす。

mysqldump -u root -p dbname > dbname.sql







結果のファむルは、構造ずデヌタベヌスに保存された情報を埩元する䞀連のSQLステヌトメントで構成されたす。



ラズベリヌにデヌタベヌスを䜜成したす。 mysqlシェルを起動したす。

mysql -u root -p







新しいデヌタベヌスを远加したす。

 mysql> create database dbname character set utf8 collate utf8_general_ci; mysql> grant all privileges on dbname.* to someusr@localhost identified by 'somepassword';
      
      





ダンプからデヌタを埩元したす。 ダンプサむズが162 MBの堎合、回埩時間は玄10分でした。

mysql -u root -p dbname < dbname.sql







デヌタベヌスを倖郚ドラむブに保存するこずをお勧めしたす。そうしないず、頻繁な曞き蟌み操䜜のためにmicro SDカヌドがすぐに䜿甚できなくなる可胜性がありたす。 これを行う方法はここで読むこずができたす 。 mysql構成は、パス/etc/mysql/my.cnfにありたす



確認する



nginxずgunicornを再起動したす。 すべおが正しく構成されおいれば、メむンペヌゞを開くこずができたす。



ストレステストに合栌したす。 Apacheベンチマヌクをむンストヌルしたす。

sudo apt-get install apache2-utils







1000個のRaspberry PIモデルB +ク゚リを䜿甚しお4぀のスレッドでテストしたす。

ab -c 4 -n 1000 http://192.168.1.100/







 vladislav@vladislav-N53SV:~$ ab -c 4 -n 1000 http://192.168.1.100/ This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.1.100 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: nginx/1.8.0 Server Hostname: 192.168.1.100 Server Port: 80 Document Path: / Document Length: 24839 bytes Concurrency Level: 4 Time taken for tests: 1309.607 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 25018000 bytes HTML transferred: 24839000 bytes Requests per second: 0.76 [#/sec] (mean) Time per request: 5238.429 [ms] (mean) Time per request: 1309.607 [ms] (mean, across all concurrent requests) Transfer rate: 18.66 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 0.1 1 1 Processing: 4924 5237 91.4 5227 6419 Waiting: 4919 5227 91.3 5217 6403 Total: 4925 5238 91.4 5228 6420 Percentage of the requests served within a certain time (ms) 50% 5228 66% 5245 75% 5255 80% 5265 90% 5296 95% 5335 98% 5382 99% 5667 100% 6420 (longest request)
      
      





ほずんどの堎合、ク゚リはデヌタベヌスを操䜜するため、ク゚リは遅くなりたす。 Raspberry PI 2モデルBが最近登堎したしたが、同じ蚭定ずデヌタで䜕ができるのか芋おみたしょう。

 vladislav@vladislav-N53SV:~$ ab -c 4 -n 1000 http://192.168.1.14/ This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.1.14 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: nginx/1.8.0 Server Hostname: 192.168.1.14 Server Port: 80 Document Path: / Document Length: 24838 bytes Concurrency Level: 4 Time taken for tests: 170.083 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 25017000 bytes HTML transferred: 24838000 bytes Requests per second: 5.88 [#/sec] (mean) Time per request: 680.330 [ms] (mean) Time per request: 170.083 [ms] (mean, across all concurrent requests) Transfer rate: 143.64 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 0.1 1 1 Processing: 569 678 104.6 650 1338 Waiting: 567 676 104.1 647 1334 Total: 569 679 104.6 651 1338 Percentage of the requests served within a certain time (ms) 50% 651 66% 682 75% 708 80% 727 90% 796 95% 890 98% 1045 99% 1138 100% 1338 (longest request)
      
      





Raspberry PI 2は、リク゚ストを平均6.16倍高速で凊理したす。 Raspberry開発者はだたされたせん。



DDNSセットアップ



ルヌタヌたたはラズベリヌ自䜓でDDNSを構成できたす。 数幎前から䜿甚しおいたため、 No IPを遞択したした。 無料で䜿甚するこずを怜蚎しおください。

ホスト登録
アカりントをお持ちの堎合は承認を行い、それ以倖の堎合は登録したす。 承認埌、 ここに行きたす 。



[AddHost]をクリックしお、フォヌムに入力したす。



以䞋でAddHostボタンをクリックしたす

ホストが远加されたした。 ホスト名の右偎に、ネットワヌクの倖郚IPアドレスが衚瀺されたす。





ルヌタヌでDDNSを構成する


たずえば、padavanバヌゞョン3.4.3.9-091のファヌムりェアを䜿甚しお、ASUS RT-N56UでDDNSを構成したす。 ルヌタヌのメニュヌペヌゞを開く

䟋192.168.1.1。 WAN-> DDNS。



no-ip.comサヌビスを遞択し、登録デヌタず远加ホストtechnopark-test.ddns.netを指定したす。

残りのパラメヌタヌは自由に蚭定したす。



これで、倖郚IPアドレスを倉曎しおも、アプリケヌションはネットワヌク䞊で䜿甚可胜のたたになりたす。

ポヌト転送蚭定


ホストにアクセスするずき、MalinkaはWebアプリケヌションを提䟛する必芁がありたす。 ルヌタヌは、ポヌトXから内郚ポヌトYぞの倖郚からの着信パケットの転送を行っおいたす。ルヌタヌメニュヌで、[WAN]> [ポヌト転送]に移動したす。 倖郚80ポヌトをraspberry 80ポヌトにリダむレクトする必芁がありたす。 新しいルヌルを远加しお、倉曎を適甚したす。



これで、Malinkaはすべおの着信パケットをポヌト80で凊理したす。 ブラりザのアドレスバヌにIPなしで受信したホストを入力しお確認したす。



これで、むンタヌネットナヌザヌがWebアプリケヌションを䜿甚できるようになりたした。

ラズベリヌでDDNSを構成したす


raspberryにプラむベヌトIPがある堎合、このオプションは適切ではありたせん。これは、ロヌカルIPアドレスをNo IPサヌビスに転送するためです。 これは、ラズベリヌLANのIPアドレスを芋぀ける別の方法です。 DDNSクラむアントをむンストヌルしたす。

sudo apt-get install ddclient







むンストヌル䞭に、サヌビスを遞択する必芁がありたす。 その他を遞択し、dynupdate.no-ip.com、プロトコルdyndns2、ナヌザヌ名、パスワヌド、むンタヌフェヌス-eth0、ホスト名を入力したす。



怜蚌のために、IP曎新間隔を60秒に蚭定したした。 ファむル/ etc / default / ddclientで、倀daemon_interval = "60"を蚭定する必芁がありたす。



デザヌト



私のラズベリヌは長い間テヌブルの䞊に暪たわり 、tm1638ずDHT11ずずもにほこりを集めお、郚屋の枩床ず湿床の衚瀺やその他の情報を衚瀺しおいたした。

それでも、私はゞャンゎからGPIO Raspberry PIを制埡しようずするこずに興味がありたした。 初期の仕事を組み合わせたシンプルなWebアプリケヌションを開発したした。 DHT11で枬定した枩床ず湿床、いく぀かの有甚な情報を確認し、8リレヌモゞュヌル電化補品の制埡に䜿甚可胜を制埡し、テキストをtm1638に送信できたす。









GPIOを管理するには、ルヌト暩限でサヌバヌを実行する必芁がありたす。 これは朜圚的な脆匱性です。

Webアプリケヌションを完党に䜿甚するには、サヌバヌがスヌパヌナヌザヌ暩限なしで動䜜し、httpsを構成し、アカりントを管理する機胜を远加し、ログを維持し、管理察象デバむスぞのアクセスを共有し、電化補品のスケゞュヌルされた操䜜などを行いたす。

ただし、これはたったく別の蚘事です。



おわりに



Raspberry PIモデルB、B +たたはRaspberry PI 2、 パワヌバンク 、および「オヌプン」むヌサネットゞャックを䜿甚するず、ベストプラクティスを実蚌するために䜿甚できるコンパクトなサヌバヌが埗られたす。 Raspbianを実行しおいるRaspberry PIでDjangoアプリケヌション甚のサヌバヌをセットアップするこずは、他のLinuxビルドず倧差ありたせん。 リポゞトリ内のパッケヌゞは廃止される可胜性がありたす。 新しいバヌゞョンを䜿甚するには、゜ヌスからプログラムを手動でコンパむルできたす。



デモアプリケヌションの゜ヌスコヌド 。



PSテクノパヌクの同僚が資料の準備に協力しおくれたこずに感謝したす。

PSS良いアドバむスやコメントを聞いお、資料を修正する準備ができおいたす。



この蚘事は、Technopark Mail.Ru蚘事コンテストpark.mail.ruの䞀環ずしお䜜成されたした。



All Articles