[CentOS7] Nginx + uwsgi + python3 + bottle でWebアプリケーションを公開
今回は長編。
色々試行錯誤した結果のため、うまくいかなかった場合はコメントに残してもらえると幸いです。。。
[amazonjs asin="B00KO6P262″ locale="JP" title="Software Design (ソフトウェア デザイン) 2014年 07月号 雑誌"]
↑Nginxの項目、ちょっとだけ執筆させてもらっています。。。
構成
今回は以下の図のような構成を想定している。
準備
pyenv環境を構築
https://www.blog.umentu.work/?p=153
Nginxをインストール
https://www.blog.umentu.work/?p=163
[CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可
https://www.blog.umentu.work/?p=172
ディレクトリ構成
以下、簡単なディレクトリ構成。
ユーザー名を「centos」としている。
/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ファイルを置くディレクトリ
uWSGI用の仮想環境の用意
(念のため)以降、
「#」 からはじまるコマンドラインはroot
「$」 からはじまるコマンドラインは一般アカウント(今回の場合はcentosユーザー)
今回はPythonの仮想環境を、uWSGI用とアプリケーション用に分けて管理する。
まずuWSGI用の仮想環境をappディレクトリに作成する。
[shell]
$ mkdir ~/app
$ cd ~/app
$ mkdir -p ./var/{sock, pid}
[/shell]
次にuWSGI用仮想環境を作成し、uWSGIをインストールする。
[shell title="uWSGI用の仮想環境を作成"]
$ pyvenv uwsgi_venv
$ source uwsgi_venv/bin/activate
$ pip install –upgrade pip
$ pip install uwsgi
[/shell]
アプリケーション用の仮想環境を用意
アプリケーション用の仮想環境を用意する。
今回は「bottle」と「jinja2」を利用するため、それらもインストールする。
uWSGI環境にまだ入っている場合は、「deactive」コマンドで脱出する。
[shell title="アプリケーション用の仮想環境を作成"]
$ cd ~/app
$ deactivate
$ pyvenv bottle_jinja2
$ source bottle_jinja2/bin/activate
$ pip install –upgrade pip
$ pip install bottle
$ pip install jinja2
[/shell]
アプリケーションを設置
~/app/bottle_jinja2 ディレクトリにsourceディレクトリを作成し、
その中にアプリケーションのソースファイルを設置する。
今回設置したのは、以前作成したもの。
ソースはこちら。
[shell]
$ cd ~/app
$ mkdir bottle_jinja2/source
$ ソースをアップロード
[/shell]
uwsgi.iniを設置
uWSGI用のiniファイルをbottle_jinja2ディレクトリ配下に作成する。
最低限のオプションのため、必要に応じて追加。
ログファイルなどは本来は /var/log 配下に uwsgiディレクトリを作成して設置した方がいいかも。
[shell title="uwsgi.iniを作成"]
$ cd ~/app/bottle_jinja2/
$ vi uwsgi.ini
[shell title="uwsgi.ini"]
[shell title="uwsgi.iniの内容"]
[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)“ "%(referer)" "%(uagent)"
logto = /home/centos/app/var/log/bottle_jinja2.log
[/shell]
Nginxを設定する
uWSGIはソケットを生成するため、Nginxをソケット通信するように設定する。
紛らわしいため、デフォルトで作成されているdefault.confはリネームしておく。
[shell title="Nginxの設定"]
# cd /etc/nginx
# mv conf.d/default.conf conf.d/default.conf.bk
# vi conf.d/bottle_jinja2.conf
[/shell]
[shell title="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;
}
}
[/shell]
Nginxを再起動する。
[shell]
# systemctl restart nginx.service
[/shell]
まだアプリケーションは起動していないため、この段階でブラウザでアクセスしても
502になる。
アプリケーションの起動
試しにコマンドラインでアプリケーションを起動してみる。
アプリケーション用の仮想環境に入っている場合は脱出し、uWSGI用の仮想環境に入る。
[shell]
$ cd ~/app/bottle_jinja2
$ deactivate
$ source ~/app/uwsgi_venv/bin/activate
$ uwsgi –ini uwsgi.ini
[/shell]
ブラウザでアクセスすると、表示される。。。はず。
この段階でうまくいかない場合はログなどを見て、これまでの設定を見直す必要がある。
起動を確認したら、「Ctrl + c」で停止する。
uWSGIをプロセスで管理する。
上ではコマンドラインからuWSGIで起動したが、systemctlから起動できるようにしてみる。
CentOS6以前(というよりも一般的なLinux)は、/etc/init.d 配下に起動スクリプトを設定して管理していたが、
CentOS7は「/usr/lib/systemd/system」ディレクトリ配下で管理している。
「/usr/lib/systemd/system」配下に bottle_jinja2.serviceファイルを作成する。
[shell]
# vi /usr/lib/systemd/system/bottle_jinja2.service
[/shell]
[shell title="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
[/shell]
起動してみる。
[shell]
# systemctl start bottle_jinja2
[/shell]
ブラウザでアクセスすれば、上と同様に表示されるはず。
ディスカッション
コメント一覧
まだ、コメントがありません