Ubuntu 12.04の手順が提供されています。
準備する
まず、興味のあるバージョンのpythonを配置します。
コンパイルに必要なパッケージ:
sudo apt-get install zlib1g zlib1g-dev zlibc libssl-dev
Pythonを入れて、2.7.4と3.3.1を設定しました
wget http://python.org/ftp/python/2.7.4/Python-2.7.4.tar.bz2 tar -xf Python-2.7.4.tar.bz2 cd Python-2.7.4 ./configure --prefix=/opt/python2.7/ --enable-unicode=ucs4 make && make install
wget http://python.org/ftp/python/3.3.1/Python-3.3.1.tar.bz2 tar -xf Python-3.3.1.tar.bz2 cd Python-3.3.1 ./configure --prefix=/opt/python3.3/ make && make install
プロジェクト設定用のディレクトリを作成しましょう。
- /home/hosting/.nginx/-nginxの設定があります
- /home/hosting/.uwsgi/-uwsgi configがあります
- /home/hosting/.virtualenvs/-ここにプロジェクトの仮想環境が配置されます
- /ホーム/ホスティング/ project1 /-最初のdjangoプロジェクトのファイル
- /ホーム/ホスティング/ project2 /-2番目のdjangoプロジェクトのファイル
Nginxのインストール
apt-get install nginx-full
なぜnginxではなくnginx-fullですか? Nginx-fullには、すでにuwsgiを操作するためのモジュールが含まれています。
仮想ホストの設定を読み込む場所をnginxに伝える必要があります。
/etc/nginx/nginx.confを開きます。
include /etc/nginx/sites-enabled/*;
include /home/hosting/.nginx/*.conf;
という行を追加し
include /home/hosting/.nginx/*.conf;
ここで、仮想ホストのnginx-configsを作成する必要があります。
- /home/hosting/.nginx/project1.conf
- /home/hosting/.nginx/project2.conf
設定例:
非表示のテキスト
server { server_name project1.com; access_log /var/log/project1.access.log; error_log /var/log/project1.error.log; location / { uwsgi_pass unix:/tmp/project1.sock; include /etc/nginx/uwsgi_params; } location /static/ { alias /home/hosting/project1/static/; } location /media/ { alias /home/hosting/project1/media/; } }
/home/hosting/.nginxディレクトリへの権限をwww-dataユーザー(またはnginxが実行されているユーザー)に付与する必要があります。
chown -R www-data:www-data /home/hosting/.nginx/
nginxを開始します
service nginx start
virtualenvwrapperをインストールする
virtualenvwrapper-virtualenvの便利なラッパー。
まだ価値がなければピップを入れます:
sudo apt-get install python-pip
virtualenvwrapperを配置します。
pip install virtualenvwrapper
〜/ .bashrcに以下を追加します。
export WORKON_HOME=/home/hosting/.virtualenvs/ source /usr/local/bin/virtualenvwrapper.sh
.bashrcが起動するように、コンソールに再配置します。 コンソールでmkvirtualenvコマンドを使用できるようになりました。
プロジェクトファイルをディレクトリに配置します。
- /ホーム/ホスティング/ project1 /
- /ホーム/ホスティング/ project2 /
プロジェクトごとに、仮想環境を作成します。 project1がPython 2.7で実行され、project2が3.3で実行されるとします。
mkvirtualenv project1 -p /opt/python2.7/bin/python deactivate mkvirtualenv project2 -p /opt/python3.3/bin/python3 deactivate
プロジェクトごとに、依存関係を仮想環境に配置します。 (私の場合、依存関係は各プロジェクトのルートにあるrequirements.txtファイルに記述されています)
workon project1 cd /home/hosting/project1 pip install -r requirements.txt workon project2 cd /home/hosting/project2 pip install -r requirements.txt
uwsgiの構成。
次のように、皇帝モード(--emperor)で構成します。 このモードは、特にマルチホスティング用に設計されています。
皇帝モードでは、uwsgiは指定されたディレクトリから構成を自動的にロードします。これは便利です。つまり、一度uwsgiを実行し、構成内のすべてのアプリケーションのプロセスを作成します。
デフォルトでは、uwsgiは現在の環境にあるpythonを使用してプロジェクトコードを実行するため、virtualenvからuwsgiを実行する必要があります。
pythonにはいくつかの異なるバージョンがあるため、たとえばpython 2.7から起動したuwsgiは、python 3.3の環境でdjangoアプリケーションを提供できません。
したがって、Pythonの各バージョンに対して皇帝を作成し、インタープリターのバージョンに従ってアプリケーション構成をグループ化します。
皇帝のための仮想環境を作成します。
mkvirtualenv python27 -p /opt/python2.7/bin/python deactivate mkvirtualenv python33 -p /opt/python3.3/bin/python3 deactivate
ここで、すべてのvirtualenvにuwsgiを配置して構成する必要があります。
workon python27 pip install uwsgi workon python33 pip install uwsgi
各uwsgi皇帝の設定ディレクトリを作成します。
mkdir /home/hosting/.uwsgi/python27 mkdir /home/hosting/.uwsgi/python33
プロジェクトごとにuwsgi-configsを作成します。
/home/hosting/.uwsgi/python27/project1.ini
非表示のテキスト
[uwsgi] protocol = wsgi master = true processes = 1 # socket = /tmp/project1.sock # pythonpath , . uwsgi virtualenv pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg pythonpath = /home/hosting/.virtualenvs/project1/lib/python27.zip pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7 pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7/plat-linux2 pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7/lib-tk pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7/lib-old pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7/lib-dynload pythonpath = /home/hosting/.virtualenvs/project1/lib/python2.7/site-packages # - virtualenv , pythonpath = /opt/python2.7/lib/python2.7 chdir = /home/hosting/project1 virtualenv = /home/hosting/.virtualenvs/project1 env = DJANGO_SETTINGS_MODULE=settings module = django.core.handlers.wsgi:WSGIHandler() no-site = true vhost = true chmod-socket = 666
2番目のプロジェクト構成も同様です。 ファイル名は.iniで終わる必要があります。そうしないと、uwsgiはこの構成を取得しません。
次に、システムでuwsgiをサービスとして登録する必要があります。 私はupstartを使用しました。それは箱から出てきたものです。
2つの設定ファイルを作成しましょう。
/etc/init/uwsgi27.conf
description "uWSGI Emperor (python 2.7)" start on runlevel [2345] stop on runlevel [06] exec /home/hosting/.virtualenvs/python27/bin/uwsgi --master --emperor /home/hosting/.uwsgi/python27 --logto /var/log/uwsgi27.emperor.log
/etc/init/uwsgi33.conf
description "uWSGI Emperor (python 3.3)" start on runlevel [2345] stop on runlevel [06] exec /home/hosting/.virtualenvs/python33/bin/uwsgi --master --emperor /home/hosting/.uwsgi/python33/ --logto /var/log/uwsgi33.emperor.log
ユーザーとセキュリティ
ルートから、「インペリアル」プロセスのみを実行し、プロジェクト自体は自分のユーザーの下になります。
各プロジェクトのユーザーを作成します。
adduser --no-create-home --disabled-login --disabled-password www-project1 adduser --no-create-home --disabled-login --disabled-password www-project2
uid gidパラメーターを各uwsgi ini-configsに追加します
uid = www-project1 # gid = www-project1 #
正しい許可を設定する
非表示のテキスト
chown -R www-data:www-data /home/hosting/.nginx chmod -R 770 /home/hosting/.nginx chown -R root:root /home/hosting/.uwsgi chmod -R 770 /home/hosting/.uwsgi chown -R root:root /home/hosting/.virtualenvs/python27 /home/hosting/.virtualenvs/python33 chmod -R 775 /home/hosting/.virtualenvs chown -R www-project1:www-project1 /home/hosting/project1 /home/hosting/.virtualenvs/project1 chown -R www-project2:www-project2 /home/hosting/project2 /home/hosting/.virtualenvs/project2
uwsgiを起動する
service uwsgi27 start service uwsgi33 start
チェック-すべてが機能するはずです。
何かが機能しない場合は、プロジェクト設定で指定されたnginxログとuwsgi皇帝のログを見てください。
uwsgiがアプリケーションを正常にデプロイしたことを示す兆候は、uwsgiログの
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x135e280 pid: 21737 (default app)
で
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x135e280 pid: 21737 (default app)
た
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x135e280 pid: 21737 (default app)
ライン
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x135e280 pid: 21737 (default app)
の存在
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x135e280 pid: 21737 (default app)
。
新しいアプリケーションを追加するには、.nginxおよび.uwsgiで構成を作成し、nginxを再起動する必要があります。 uwsgi自体が新しい構成を取得します。
参照資料
projects.unbit.it/uwsgi/wiki/MultiPython
projects.unbit.it/uwsgi/wiki/DynamicVirtualenv
auphonic.com/blog/2011/06/18/django-deployment-nginx-uwsgi-virtualenv-and-fabric
eshlox.net/en/2012/09/11/nginx-uwsgi-virtualenv-and-django-ubuntu-1204
uwsgi-docs.readthedocs.org/en/latest/Emperor.html
PS
この記事で説明されている方法は、アーキテクチャの点ではあまり美しくありません。 最初は、1人のuwsgi皇帝に近づき、アプリケーション構成のプラグインパラメーターでインタープリターのバージョンを解決したいと考えていました。 しかし、Python用のuwsgi-pluginを作成することができなかったため、別の方法で作成する必要がありました。