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

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

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

↑Nginxの項目、ちょっとだけ執筆させてもらっています。。。

 

構成

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

uwsgi

 

準備

pyenv環境を構築
http://160.16.74.184/?p=153
Nginxをインストール
http://160.16.74.184/?p=163
[CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可
http://160.16.74.184/?p=172
 

ディレクトリ構成

以下、簡単なディレクトリ構成。
ユーザー名を「centos」としている。

 

uWSGI用の仮想環境の用意

 
(念のため)以降、
「#」 からはじまるコマンドラインは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を設置

uWSGI用のiniファイルをbottle_jinja2ディレクトリ配下に作成する。
最低限のオプションのため、必要に応じて追加。
ログファイルなどは本来は /var/log 配下に uwsgiディレクトリを作成して設置した方がいいかも。

$ cd ~/app/bottle_jinja2/
$ vi 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)] &quot;%(method) %(uri) %(proto)&quot; %(status) %(size)<code></code> &quot;%(referer)&quot; &quot;%(uagent)&quot;
logto = /home/centos/app/var/log/bottle_jinja2.log

 

Nginxを設定する

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

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

 

アプリケーションの起動

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

$ cd ~/app/bottle_jinja2
$ deactivate
$ source ~/app/uwsgi_venv/bin/activate
$ uwsgi --ini uwsgi.ini

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

スクリーンショット 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ファイルを作成する。

# 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

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

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です