今回は長編。
色々試行錯誤した結果のため、うまくいかなかった場合はコメントに残してもらえると幸いです。。。
今回は以下の図のような構成を想定している。
pyenv環境を構築
http://blog.umentu.work/?p=153
Nginxをインストール
http://blog.umentu.work/?p=163
[CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可
http://blog.umentu.work/?p=172
以下、簡単なディレクトリ構成。
ユーザー名を「centos」としている。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/home/centos/app/ uwsgi_venv/ : uwsgi用の仮想環境 bottle_jinja2/ : アプリケーション用の仮想環境 bin/ include/ lib/ lib64/ source/ : アプリケーションのソースを置くディレクトリ pyvenv.cfg uwsgi.ini : uWSGI用に作成するiniファイル var/ sock/ : uWSGIが生成するソケットを置くディレクトリ pid/ : uWSGIが生成するpidファイルを置くディレクトリ |
(念のため)以降、
「#」 からはじまるコマンドラインはroot
「$」 からはじまるコマンドラインは一般アカウント(今回の場合はcentosユーザー)
今回はPythonの仮想環境を、uWSGI用とアプリケーション用に分けて管理する。
まずuWSGI用の仮想環境をappディレクトリに作成する。
$ mkdir ~/app
$ cd ~/app
$ mkdir -p ./var/{sock, pid}
次にuWSGI用仮想環境を作成し、uWSGIをインストールする。
$ pyvenv uwsgi_venv $ source uwsgi_venv/bin/activate $ pip install --upgrade pip $ pip install uwsgi
アプリケーション用の仮想環境を用意する。
今回は「bottle」と「jinja2」を利用するため、それらもインストールする。
uWSGI環境にまだ入っている場合は、「deactive」コマンドで脱出する。
$ cd ~/app $ deactivate $ pyvenv bottle_jinja2 $ source bottle_jinja2/bin/activate $ pip install --upgrade pip $ pip install bottle $ pip install jinja2
~/app/bottle_jinja2 ディレクトリにsourceディレクトリを作成し、
その中にアプリケーションのソースファイルを設置する。
今回設置したのは、以前作成したもの。
ソースはこちら。
$ cd ~/app $ mkdir bottle_jinja2/source $ ソースをアップロード
uWSGI用のiniファイルをbottle_jinja2ディレクトリ配下に作成する。
最低限のオプションのため、必要に応じて追加。
ログファイルなどは本来は /var/log 配下に uwsgiディレクトリを作成して設置した方がいいかも。
$ cd ~/app/bottle_jinja2/ $ vi uwsgi.ini 1 1 [uwsgi] # 作成したアプリケーション用の仮想環境のパス home = /home/centos/app/bottle_jinja2/ # ソケットの設置場所を指定 socket = /home/centos/app/var/sock/bottle_jinja2.sock # 作成したソケットをパーミッションを指定 chmod-socket = 666 # pidファイルの作成場所を指定 pidfile = /home/centos/app/var/pid/bottle_jinja2.pid # アプリケーション本体のあるディレクトリを指定 chdir = /home/centos/app/bottle_jinja2/source/ # 実行するアプリケーションの本体ファイルを指定 file = index.py # ログのフォーマットやパスを指定 log-x-forwarded-for = true log-format = %(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size)<code></code> "%(referer)" "%(uagent)" logto = /home/centos/app/var/log/bottle_jinja2.log
uWSGIはソケットを生成するため、Nginxをソケット通信するように設定する。
紛らわしいため、デフォルトで作成されているdefault.confはリネームしておく。
# cd /etc/nginx # mv conf.d/default.conf conf.d/default.conf.bk # vi conf.d/bottle_jinja2.conf
server {
listen 80;
server_name localhost;
charset utf-8;
location /bottle_python { try_files $uri @bottle_jinja2; }
location @bottle_jinja2 {
include uwsgi_params;
uwsgi_pass unix:/home/centos/app/var/sock/bottle_jinja2.sock;
}
}
Nginxを再起動する。
# systemctl restart nginx.service
まだアプリケーションは起動していないため、この段階でブラウザでアクセスしても
502になる。
試しにコマンドラインでアプリケーションを起動してみる。
アプリケーション用の仮想環境に入っている場合は脱出し、uWSGI用の仮想環境に入る。
$ cd ~/app/bottle_jinja2 $ deactivate $ source ~/app/uwsgi_venv/bin/activate $ uwsgi --ini uwsgi.ini
ブラウザでアクセスすると、表示される。。。はず。
この段階でうまくいかない場合はログなどを見て、これまでの設定を見直す必要がある。
起動を確認したら、「Ctrl + c」で停止する。
上ではコマンドラインからuWSGIで起動したが、systemctlから起動できるようにしてみる。
CentOS6以前(というよりも一般的なLinux)は、/etc/init.d 配下に起動スクリプトを設定して管理していたが、
CentOS7は「/usr/lib/systemd/system」ディレクトリ配下で管理している。
「/usr/lib/systemd/system」配下に bottle_jinja2.serviceファイルを作成する。
# vi /usr/lib/systemd/system/bottle_jinja2.service
[Unit] Description=bottle_jinja2 program Wants=nginx.service Before=nginx.service [Service] ExecStart=/home/centos/app/uwsgi_venv/bin/uwsgi --ini /home/centos/app/bottle_jinja2/uwsgi.ini ExecReload=/home/centos/app/uwsgi_venv/bin/uwsgi --reload /home/centos/app/var/pid/bottle_jinja2.pid ExecStop=/home/centos/app/uwsgi_venv/bin/uwsgi --stop /home/centos/app/var/pid/bottle_jinja2.pid [Install] WantedBy=multi-user.target
起動してみる。
# systemctl start bottle_jinja2
ブラウザでアクセスすれば、上と同様に表示されるはず。
Tags: bottle, CentOS7, jinja2, Nginx, pyenv, python, python2, python3, SELinux, uWSGI, venv