[CentOS7] Nginx + uwsgi + python3 + bottle でWebアプリケーションを公開

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

今回は長編。
色々試行錯誤した結果のため、うまくいかなかった場合はコメントに残してもらえると幸いです。。。

[amazonjs asin=”B00KO6P262″ locale=”JP” title=”Software Design (ソフトウェア デザイン) 2014年 07月号 雑誌”] ↑Nginxの項目、ちょっとだけ執筆させてもらっています。。。

 

構成

今回は以下の図のような構成を想定している。

uwsgi

 

準備

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になる。

スクリーンショット 2015-06-09 2.21.35

 

アプリケーションの起動

試しにコマンドラインでアプリケーションを起動してみる。
アプリケーション用の仮想環境に入っている場合は脱出し、uWSGI用の仮想環境に入る。

[shell] $ cd ~/app/bottle_jinja2
$ deactivate
$ source ~/app/uwsgi_venv/bin/activate
$ uwsgi –ini uwsgi.ini
[/shell]

ブラウザでアクセスすると、表示される。。。はず。
この段階でうまくいかない場合はログなどを見て、これまでの設定を見直す必要がある。

スクリーンショット 2015-06-09 2.30.10

起動を確認したら、「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]

ブラウザでアクセスすれば、上と同様に表示されるはず。