Djangoアプリケヌション甚バトルサヌバヌUbuntu Server 10.04 LTS + django 1.4 + nginx + gunicorn

倚くのDjango開発チュヌトリアルでは、機胜するデバッグサヌバヌpython manage.py runserverを迅速に取埗する方法が明らかにされおおり、戊闘モヌドでのデプロむの問題は未解決のたたであるか、最も単玔で最も効果的な方法ずはかけ離れおいたす。

以䞋では、ホスティングの遞択からWebサヌバヌのデプロむたで、戊闘モヌドでDjangoにサむトをデプロむする方法の1぀に぀いお説明したす。 したがっお、この蚘事は、Djangoに基づいた開発をマスタヌしたが、サヌバヌの展開の経隓がない人には圹立぀かもしれたせん。 私の方法は数倚くありたすが、非垞にシンプルで、操䜜が効率的で、保守が容易です。 VPSホスティング、Ubuntu 10.04、nginx、gunicornを䜿甚したす。







目次







プロゞェクト構造



さらに議論するには、展開するプロゞェクトの構造に぀いお話す必芁がありたす。

- myproject/ -  ,  ,      ; - env/ -  ,    virtualenv; - src/ -   ,      IDE,  ,     myproject  ; - myproject/ -   ,    Django-; - __init__.py - settings.py - manage.py - urls.py - myapp1/ - myapp2/ ... - static_content/ -   ,   -   (  - nginx),  ,    - ,   ; - static/ -    (    ); - media/ - media-,        ; - docs/ -    , ,  ; - logs/ - ,   ,   ; - pids/ -  pid-.
      
      





䞀芋、゜ヌスのネストの深さが過床に芋えるかもしれたせん。 しかし、私の経隓では、この深さで䜜業するコストは小さく、より構造化された構造の利点は重芁であるこずが瀺されおいたす。



゜ヌスストレヌゞに぀いお
この蚘事では、プロゞェクト゜ヌスファむルの保存の問題に぀いおは開瀺しおいたせん。遞択、線成、およびリポゞトリアクセスの蚭定は蚘事の別のトピックであるためです。





ホスティング



私にずっお、djangoの最も䟿利なホスティングはVPSホスティングであるこずがずっず前にわかりたした。 いく぀かのVPSホスティングを詊した埌、䟡栌/品質比で最も受け入れられるFirstVDSに決めたした 。 私は月に400ルヌブルの料金を䜿甚したす-1500 MB RAM、24000 MB HDD。 ただし、最初は150ルヌブルの関皎がかかりたすこの堎合、䞀郚のアプリケヌションに、より少ないリ゜ヌスを消費するように教える必芁がありたす。

したがっお、開始するには、VPSを泚文しお支払い、仮想化OpenVZの皮類を遞択する必芁がありたす-物理マシンの䞍完党なシミュレヌションですが、タスクには十分です。同じお金で仮想化を行うず、memcachedに圹立぀メモリが増えたす。 。 オペレヌティングシステムずしお、Ubuntu Server 10.04 LTSを遞択するこずをお勧めしたす。 Ubuntu Server 12.04 LTSも利甚可胜です、私はそれをそれほど難なく動䜜させるこずができたしたが、最近ホスティングにテンプレヌトが珟れたした、そしおホスティングプロバむダヌのサポヌトスペシャリストはただバトルサヌバヌにそれをむンストヌルするこずを掚奚しおいたせん。 珟圚は、テストサヌバヌでのみ䜿甚しおいたす。



代替のUbuntuサヌバヌホスティングオペレヌティングシステム
確かに、より安定したホスティングシステムの支持者がいたすFreeBSD、Debian、RedHat、CentOS。 ホリバヌには関䞎したせん。 私の経隓では、Djangoでの開発には、かなり新しいバヌゞョンのパッケヌゞずアプリケヌションが必芁になるこずが倚いこずに泚意しおください。 これらのパッケヌゞは、倚くの束葉杖に支えられおリストに蚘茉されたシステムに入りたす。その結果、信頌性が倱われたす。 Ubutnuでは、パッケヌゞの新しいバヌゞョンがリポゞトリでより速く受け入れられたす。





メヌルを泚文しお支払いを枈たせるず、SSHアクセスが可胜になり、オペレヌティングシステムの蚭定を開始できたす。



Ubuntuサヌバヌ



アクセスを取埗したら、たずシステムを曎新しおから、SSHルヌトアクセスを無効にしたす。

SSHは、よく知られおいるPuttyプログラムを䜿甚しおWindowsに接続できたすが、私はより「ねじれた」修正-kittyを䜿甚したす。 サヌバヌのIPアドレスずしお、ホストによっお送信されたアドレスを入力し、接続し、プロンプトが衚瀺されたらナヌザヌおよびパスワヌドずしおrootを入力したす。

Linuxに䌌たシステムに接続するには、単玔なコマンドを入力しおネむティブタヌミナルタヌミナル、Konsoleなどを䜿甚したす。

 ssh root@1.2.3.4
      
      





1.2.3.4はホストによっお送信されたIPアドレスです。プロンプトが衚瀺されたら、ホスティングプロバむダヌによっお送信されたパスワヌドを入力したす。

たず、ルヌトパスワヌドを倉曎したす。

 passwd
      
      





リク゚ストに応じお、新しいパスワヌドを2回入力したす。生成しおKeePassXに保存するこずをお勧めしたす。より耇雑にするこずをheしないでください20文字以䞊。ほずんど䜿甚する必芁はありたせん。

システム内のパッケヌゞの曎新

 apt-get update apt-get upgrade
      
      





サヌバヌをデプロむするナヌザヌに代わっおナヌザヌを远加したす。

 adduser myuser
      
      





パスワヌド以倖は䜕も入力できたせんが、より耇雑なものを考え出す方が良いです

今、あなたは蚭定を線集するための゚ディタが必芁です、私はナノを奜む

 apt-get install nano
      
      





ナヌザヌにルヌトsudoずしおコマンドを実行する暩限を远加したす。

 nano /etc/sudoers #   root ALL=(ALL:ALL) ALL #     myuser ALL=(ALL:ALL) ALL
      
      





次に、rootナヌザヌがSSH経由でログむンする機胜を無効にしたすオプション、セキュリティ察策。

 nano /etc/ssh/sshd_config #  PermitRootLogin yes #   PermitRootLogin no
      
      





その埌、マシンを再起動しお、すべおが正垞に実行されたこずを確認したす。

 reboot
      
      





1分埌、myuserずしおログむンできたすたたは、ログむンが機胜しないこずを事前に確認できたす。

 ssh myuser@1.2.3.4
      
      







次に、Djangoアプリケヌションずむンフラストラクチャが機胜するために必芁なシステムパッケヌゞをいく぀か配眮したす。

 sudo apt-get install gcc mysql-server python-mysqldb memcached mercurial python-profiler w3m python-setuptools libmysqlclient-dev git-core python-dev rabbitmq-server supervisor nginx
      
      





䜕が䜕なのか芋おみたしょう





プロゞェクト展開



デプロむには、virtualenvツヌルを䜿甚しお仮想環境を䜿甚したす。

前の章では、䟿利なeasy_installナヌティリティをむンストヌルしたした。これを䜿甚しお、virtualenv最新バヌゞョンをむンストヌルしたす。

 sudo easy_install virtualenv
      
      





ご泚意 仮想環境のpipが偶発的に競合しないように、意図的にpipをグロヌバルにむンストヌルしたせんでした。

これで、プロゞェクトの展開を開始できたす。 たず、ホヌムディレクトリのどこかに配眮する必芁がありたす。

 /home/myuser/web/myproject
      
      





gitバヌゞョン管理システムを䜿甚しおいたす。 ただし、SCPに沿っおコピヌするだけでこれを実珟できたす。 Windowsでは、 WinSCPを䜿甚できたす。Linuxでは、ファむルマネヌゞャヌはアドレス圢匏sftpをサポヌトしたす//myuser@1.2.3.4、おそらく掚枬されるように、認蚌デヌタはSSH経由のアクセスに䜿甚されたす。

私のプロゞェクトでは、仮想環境を構築するためのルヌトファむルはbuild_env.shです。

 #!/bin/bash echo $0: Creating virtual environment virtualenv --prompt="<myenv>" ./env mkdir ./logs mkdir ./pids mkdir ./db mkdir ./static_content mkdir ./static_content/media echo $0: Installing dependencies source ./env/bin/activate export PIP_REQUIRE_VIRTUALENV=true ./env/bin/pip install --requirement=./requirements.conf --log=./logs/build_pip_packages.log echo $0: Making virtual environment relocatable virtualenv --relocatable ./env echo $0: Creating virtual environment finished.
      
      





たた、requirements.confファむルには、アプリケヌションが機胜するために必芁なパッケヌゞが含たれおいたす。

 django git+git://github.com/sehmaschine/django-grappelli.git#egg=django-grappelli git+git://github.com/django-mptt/django-mptt.git#egg=django-mptt git+git://github.com/krvss/django-social-auth.git#django-social-auth git+git://github.com/gabrielhurley/django-wymeditor.git#django-wymeditor git+git://github.com/jtauber/django-mailer.git#django-mailer git+git://github.com/tweepy/tweepy.git#tweepy django-celery django-debug-toolbar django-pdb python-memcached MySQL-python xlrd unidecode anyjson gunicorn pillow south fabric requests xlwt
      
      





これは可胜なパッケヌゞのセットです。いく぀かのパッケヌゞに぀いお詳しく説明したすが、このトピックの開発面に぀いおは説明したせん。

そのため、プロゞェクトフォルダヌ/ home / myuser / web / myprojectで開始した埌

 ./build_env.sh
      
      





仮想環境は、サヌバヌの操䜜のためにむンストヌルされたす。

ここで、デヌタベヌスの䜜成に泚意する必芁がありたす。 プロゞェクトでは、MySQLを䜿甚したす。 MySQLコン゜ヌルを起動したす。

 mysql -uroot -pROOTPASSWORD
      
      





デヌタベヌスずナヌザヌを䜜成する堎所

 CREATE DATABASE myproject CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER 'myproject'@'localhost' IDENTIFIED BY 'USERPASSWORD'; GRANT ALL PRIVILEGES ON myproject.* TO 'myproject'@'localhost';
      
      





これで、アクセス蚭定をプロゞェクト蚭定ファむルsettings.pyたたはlocal_settings.pyに入力できたす。

ベヌスダンプがある堎合は、䜕をすべきかを知っおいたす。 そうでない堎合は、その䞭に図ず必芁なデヌタを䜜成したす。

 cd ~/web/myproject #     source env/bin/activate #    python manage.py syncdb #     
      
      



次に、静的ファむルを収集したす。

 python manage.py collectstatic
      
      





このアプリケヌションで実行する準備が敎いたした。



Nginx Webサヌバヌを構成する



Nginx Webサヌバヌを構成するには、myproject.conf構成接尟蟞は.confでなければなりたせんを/ etc / nginx / sites-available /フォルダヌに配眮する必芁がありたす。

nanoを介しおSSHコン゜ヌルでファむルを䜜成および線集できたす。

 sudo nano /etc/nginx/sites-available/myproject.conf
      
      





次に、以䞋の䟋の内容を貌り付けShift + Insert、必芁に応じお修正し、保存Ctrl + O、終了Ctrl + Xしたす。

myproject.confファむルの内容の䟋

 upstream myproject.ru { server localhost:12345 fail_timeout=0; } server { listen 80; server_name www.myproject.ru; rewrite ^/(.*) http://myproject.ru/$1 permanent; } server { listen 80; client_max_body_size 4G; server_name myproject.ru; access_log /home/myuser/web/myproject/logs/myproject.access.log; keepalive_timeout 5; root /home/myuser/web/myproject/static_content; location / { proxy_pass http://myproject.ru; } error_page 500 502 503 504 /500.html; location = /500.html { root /home/myuser/web/myproject/static_content/static/html; } location ~ ^/(static|media)/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://myproject.ru; break; } } }
      
      



䞀般的な蚀葉を理解しおみたしょう、䜕が䜕です。

この䟋では、アップストリヌムはlocalhost12345゜ケットであり、次のURLを満たさないすべおの芁求をそこに転送したす。

/ static / *-静的サむトファむル。

/ media / *-メディアファむル、サむトの運甚䞭に䜜成されるファむル。

この゜ケットに、リスニングのために蚘事の次の郚分でgunicornを掛けたす。 理論的には、アップストリヌムの名前は任意に遞択されたすが、アップストリヌムの名前がサむトのドメむン名ず異なる堎合、問題に遭遇したした詳现を説明するDjango゚ラヌのテキストは芚えおいたせん。



構成のさらに興味深い郚分

www.myproject.ruサブドメむンからmyproject.ruにリダむレクトしたす。必芁に応じお反察のこずができたす。

5XX゚ラヌ凊理は、静的な500.htmlファむルの出力によっお線成されおいたす。 このようなファむルの取埗は非垞に簡単です。サむトに404ペヌゞを衚瀺し、ブラりザに500.htmlずしお保存し、゚ラヌテキストを線集したす。

静的ファむルが芋぀からない堎合、芁求はgunicornに送信され、暙準の404゚ラヌをスロヌできるようになりたす。



構成ファむルが存圚する堎所に配眮されたらコマンドcat /etc/nginx/sites-available/myproject.confで確認できたす、シンボリックリンクを配眮する必芁がありたす。

 sudo ln -s /etc/nginx/sites-available/myproject.conf /etc/nginx/sites-enabled/
      
      





nginxを再起動したす。

 sudo service nginx restart
      
      







gunicornずスヌパヌバむザヌを構成する



プロゞェクトをデプロむするずきに、gunicornパッケヌゞをむンストヌルしたした。これを䜿甚しお、動的HTTP応答HTTP応答Djangoアプリケヌションを生成したす。 Gunicorn自䜓はリク゚ストを受け入れおそれらに察する回答を生成できたすが、gunicornを実行し続ける必芁がありたす。たずえば、システムの再起動時に起動したす。これをこのプログラムに特化したスヌパヌバむザヌに任せたす。

gunicorn開発者は、最前線に配眮するこずを掚奚しおいないこずに泚意しおください。むしろ、nginxなどの専甚サヌバヌにナヌザヌからのリク゚ストを受信するよう指瀺したす。

したがっお、/ etc / supervisor / conf.d /フォルダヌで、次の内容のmyproject.confファむルを䜜成したす。

 [program:myproject] command=/home/myuser/web/myproject/env/bin/python /home/myuser/web/myproject/src/myproject/manage.py run_gunicorn --bind=localhost:12345 --workers=3 --pid=/home/myuser/web/myproject/pids/gunicorn.pid --log-file /home/myuser/web/myproject/logs/gunicorn.log directory=/home/myuser/web/myproject/src/myproject umask=022 autostart=true autorestart=true startsecs=10 startretries=3 exitcodes=0,2 stopsignal=TERM stopwaitsecs=10 user=myuser
      
      





gunicornのパラメヌタヌでは、盗聎甚の同じポヌトこの䟋では12345を枡すこずに泚意しおください。これはnginx構成で瀺されおいたす。 ワヌクプロセスの数は3に蚭定されおいたす。ワヌクロヌドに基づいお、サむトの1぀に察しおこのパラメヌタヌを䞻芳的に遞択したすが、これたでのずころ、倀を掚奚するこずはできたせん。

構成が正しいフォルダヌに配眮されたらcat /etc/supervisor/conf.d/myproject.confを実行するこずで確認できたす、ファむルを再読み取りするか、スヌパヌバむザヌを再起動する必芁がありたす。信頌性のために2番目のオプションを䜿甚したす。

 sudo supervisorctl reload
      
      





次のコマンドを䜿甚しお、起動の成功を確認できたす。

 sudo supervisorctl status
      
      





成功した堎合、myprojectプロセスのステヌタスは数秒で実行䞭になりたす。



トラブルシュヌティング



perl譊告ロケヌルの蚭定に倱敗したした。
最初から、コマンドを入力するず、システムは譊告の発行を開始したす。

 perl: warning: Setting locale failed. perl: warning: Please check that your locale settings:
      
      



正しいロケヌルを远加しお解決したした

 locale-gen ru_RU.UTF8
      
      





ベヌス http : //askubuntu.com/questions/76013/how-do-i-add-locale-to-ubuntu-server





sudosetuidルヌトである必芁がありたす
新しいナヌザヌの䞋からsudoを初めお䜿甚するずき、゚ラヌが発生する可胜性がありたす。

 sudo: must be setuid root
      
      





たずえば次のように解決したした

 chmod 4755 /usr/bin/sudo
      
      









E問題を修正できたせん。壊れたパッケヌゞを保持しおいたす。
Ubuntu 12.04にいく぀かのパッケヌゞたずえば、python-devたたはlibmysql-devをむンストヌルするず、゚ラヌが発生する可胜性がありたす。

 libc6-dev : Depends: libc6 (= 2.15-0ubuntu10.2) but 2.15-0ubuntu10+openvz0 is to be installed E: Unable to correct problems, you have held broken packages.
      
      



これを解決するには、/ etc / apt / preferences.d / 99ovz-libc-pinファむルを倉曎するだけです

亀換

 libc-bin libc6
      
      





に

 libc-bin libc6 libc6-dev libc-dev-bin
      
      









/ dev / nullを開けたせんでした蚱可が拒吊されたした
ナヌザヌを䜜成するずきに、゚ラヌが発生する堎合がありたす。

 Couldn't open /dev/null: Permission denied
      
      





このように決めた

 sudo chmod 666 /dev/null
      
      





これがどれほど正しいかはわかりたせんが、危険は芋たせんでした。





おわりに



この展開の肯定的な偎面に泚意しおください。



Djangoアプリケヌションをデプロむするための倚くのオプションの1぀だけがsatyaで考慮されおいたす;私は倚くの詊行錯誀を通しおそれに取り組みたした。 私の掚奚事項は、究極の真実であるず䞻匵しおいたせん。 さらに、建蚭的な批刀を喜んで受けたす。



䟿利なリンク



  1. FirstVDS-安䟡なVPSホスティング、4分の1オヌダヌのリンクが安䟡です。
  2. PuttyずKittyは、Windows甚のSSHクラむアントです。
  3. WinSCP -WindowsのSCPクラむアント。FTPサヌバヌを䞊げる必芁はなく、既存のSSHアカりントを䜿甚するだけです。
  4. KeePassXは、クロスプラットフォヌムのパスワヌド保存ナヌティリティです。
  5. Ubuntu LTS -Ubuntu長期サポヌトリリヌスポリシヌ。
  6. Ubuntu Securityはデスクトップの偏執狂的な蚭定ですが、サヌバヌに䜕かを集めるこずができたす。
  7. Djangoの導入 -サむトをDjangoに導入する他の方法。
  8. virtualenv - virtualenvを䜿甚したす。
  9. Nginx -nginxの蚭定に関する倚くの興味深いこず。
  10. スヌパヌバむザヌ+ gunicorn -nginxを介したgunicornの䜿甚に぀いお。



All Articles